- Настройка интернет-шлюза с NAT и Port Forwarding на CentOS 7
- Схема локальной сети со шлюзом доступа в Интернет, типы NAT
- Настройка Source NAT: доступ из локальной сети в Интернет
- Настройка Destination NAT и port forwarding: доступ из Интернета в локальную сеть
- Анализ логов сетевых подключений NAT в Linux
- Форвардинг портов через шлюз Linux в Iptables
- Требования
- Данные хостов
- Условные данные руководства
- Настройка веб-сервера
- Установка Nginx
- Настройка Nginx
- Проверка настройки Nginx
- Welcome to nginx!
- Настройка форвардинга
- Включение форвардинга в ядро
- Настройка брандмауэра
- Правила форвардинга
- Правила NAT
- Welcome to nginx!
- Сохранение правил
- Заключение
Настройка интернет-шлюза с NAT и Port Forwarding на CentOS 7
В этой статье мы рассмотрим процесс организации и настройки простого интернет-шлюза на базе CentOS 7.x. Данный шлюз позволит пользователям из локальной сети выходить в Интернет, а также получать доступ к серверам или компьютерам во внутренней сети снаружи. Для организации маршрутизации и пересылки пакетов мы будем использовать технологию NAT на базе межсетевого экрана iptables. Также рассмотрим, как вести и анализировать логи подключений на интернет-шлюзе при доступе внешних пользователей в локальную сеть.
Схема локальной сети со шлюзом доступа в Интернет, типы NAT
NAT (Network Address Translation) – трансляция IP адресов, это механизм, позволяющий подменять адрес источника и назначения в заголовке IP пакетов, при их прохождении через маршрутизатор, т.е. между разными сетями.
Настраивать NAT будем между внутренней сетью с адресацией 10.2.0.0/24 и внешней сетью Интернет, двух видов:
- source NAT – это подмена IP адреса источника, в нашем случае, для организации выхода в Интернет через один публичный IP адрес нескольких клиентов.
- destination NAT — подмена IP адреса назначения, в нашем случае, для обеспечения доступа из внешней сети Интернет через публичный IP адрес к серверам внутренней сети.
Определим элементы сети (рисунок 1), между которыми будет организован NAT:
- gw-server – сервер шлюз, т.е. наш CentOS Linux сервер, который предоставляет доступ за пределы внутренней сети. У него два интерфейса, первый eth1(10.2.0.1) во внутренней сети, второй eth0(84.201.168.122) с публичным IP адресом и доступом в Интернет;
- web-server01 – веб сервер внутренней сети, IP адрес 10.2.0.11;
- my-server01 – личный сервер внутренней сети, IP адрес 10.2.0.12.
Настройка Source NAT: доступ из локальной сети в Интернет
При source NAT для серверов внешней сети, запросы от наших клиентов из внутренней сети будут выглядеть так, как будто с ними общается напрямую сервер шлюз — gw-server01.
В прошлой статье “Базовая настройка файервола Linux с помощью iptables” мы рассмотрели азы использования iptables. В этот раз, работать в iptables будем не только с таблицей filter, но и с таблицей nat. В отличие от таблицы для фильтрации трафика filter, таблица nat содержит следующие chains(цепочки):
- PREROUTING — в этой цепочке обрабатываются входящие IP пакеты, до их разделения на предназначенные для самого сервера или для передачи другому, т.е. до принятия решения о выборе маршрута для IP пакета;
- OUTPUT – цепочка предназначена для обработки IP пакетов, которые сгенерированы локально приложением на сервере. Локально сгенерированные IP пакеты не проходят цепочку PREROUTING;
- POSTROUTING — в этой цепочке обрабатываются все исходящие IP пакеты, уже после принятия решения о маршруте для IP пакета.
Отличаются и действия, выполняемые для IP пакетов, в этой таблице:
- MASQUERADE и SNAT— производит подмену IP адреса источника для исходящих пакетов. Отличием этих действий является то, что SNAT дает возможность задать конкретный IP адрес нового источника, а в случае MASQUERADE это происходит динамически;
- DNAT — производит подмену IP адреса назначения для входящих пакетов.
На рисунке 2 изображены этапы обработки IP пакета из внутренней сети на шлюзе gw-server01 при SNAT на iptables. IP адрес и порт назначения при этом остаются неизменными.
Рисунок 2
- IP пакет поступил на внутренний интерфейс eth1 сервера gw-server01. Так как IP назначения не принадлежит серверу gw-server01, IP пакет переходит к обработке цепочкой FORWARD.
- После прохождения цепочки FORWARD, для IP пакета определяется исходящий сетевой интерфейс, с которого он должен быть отправлен, это отмечено желтым цветом
- В конце IP пакет проходит цепочку POSTROUTING, в которой происходит подмена IP адреса источника, на IP адрес внешнего интерфейса eth0 сервера gw-server01
Приступим к настройке. Сначала нужно установить параметр ядра, который позволяет передавать пакеты между интерфейсами сервера. Для этого в файл /etc/sysctl.conf добавим переменную:
Чтобы применить изменения, выполним команду
sysctl -p /etc/sysctl.conf
здесь sysctl это команда, которая позволяет управлять параметрами ядра, ключ -p означает, что нужно считать параметры из файла.
Создадим правило в iptables, разрешающее передачу пакетов между внутренним (eth1) и внешним (eth0) интерфейсом:
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
и разрешим передавать между интерфейсами пакеты, относящиеся к уже установленным соединениям.
iptables -A FORWARD -m state —state RELATED,ESTABLISHED -j ACCEPT
Предыдущие два правила имеет смысл создавать, только если для цепочки FORWARD по умолчанию установлена политика DROP:
iptables -P FORWARD DROP
iptables -t nat -A POSTROUTING -s 10.2.0.0/24 -o eth1 -j SNAT —to-source 84.201.168.122
- —to-source должен быть адресом на интерфейсе, с которого планируется выпускать во внешнюю сеть IP пакеты;
- -s 10.2.0.0/24 задано из расчета, что внутренняя сеть 10.2.0.0/24, но это необязательный параметр, если его не указать, ограничений на источник взаимодействия не будет.
Посмотрим получившуюся конфигурацию для таблицы filter и цепочки FORWARD (вывод обрезан):
и конфигурацию для таблицы nat и цепочки POSTROUTING (вывод обрезан):
iptables -t nat -L -n -v
Для проверки, что наш веб-сервер во внутренней сети получил доступ в Интернет, попробуем подключиться через telnet на адрес 1.1.1.1 (Cloudflare DNS) порт 80:
telnet 1.1.1.1 80
Вывод команды Connected 1.1.1.1, показывает, что подключение прошло успешно.
Настройка Destination NAT и port forwarding: доступ из Интернета в локальную сеть
Теперь рассмотрим обратную ситуацию. Мы хотим, чтобы клиенты снаружи имели возможность попадать на наш сайт во внутренней сети. А также нам нужно заходить на свой личный сервер (или рабочую станцию) из Интернета. Отличие этого случая не только в направлении взаимодействия, но еще и в том, что требуется перенаправить запросы на отдельные порты, 80(TCP) и 3389(TCP), при этом подменять сервер назначения и возможно, порт назначения. Эта техника называется port forwarding (проброс портов).
Сначала разрешим передачу пакетов с внешнего интерфейса (eth0) на внутренний (eth1) интерфейс:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
Это правило разрешает передавать IP пакеты между интерфейсами независимо от источника. Но можно отдельным правилом запретить подключение через NAT для отдельных IP адресов или подсетей:
iptables -I FORWARD 1 -o eth1 -s 167.71.67.136 -j DROP
Теперь перенаправим все соединения на порт 80 интерфейса внешней сети(eth0) на IP адрес веб сервера внутренней сети web-server01:
iptables -t nat -A PREROUTING -p tcp —dport 80 -i eth0 -j DNAT —to-destination 192.168.0.11
—to-destination — должен быть IP адресом, на который нужно заменить IP адрес назначения.
Для проверки, попробуем подключиться из сети Интернет через telnet на публичный IP адрес сервера gw-server на порт 80:
telnet 84.201.168.122 80
Результатом будет ответ веб сервера web-server01 из нашей внутренней сети:
Аналогично можно настроить доступ из интернета на свою рабочую станцию по RDP. Так как доступ по RDP будет нужен ограниченному количеству человек, безопасней будет использовать при подключении нестандартный порт, например 13389, а уже с него перенаправлять на порт 3389 сервера внутренней сети (либо изменить номер RDP порта на Windows компьютере). Измененный порт назначения указывается через двоеточие после IP адреса:
iptables -t nat -A PREROUTING -p tcp —dport 13389 -i eth0 -j DNAT —to-destination 192.168.0.12:3389
Для проверки, попробуем подключиться из сети Интернет через telnet (или командлет PowerShell Test-NetConnection) на публичный IP адрес сервера gw-server на порт 13389:
telnet 84.201.168.122 13389
В ответ получим пустой экран и курсор, это говорит о том, что соединение работает.
Анализ логов сетевых подключений NAT в Linux
Одним из моментов, для повышения уровня безопасности после настройки port forwarding на наш личный сервер из внешней сети, будет сборка и анализ логов внешний подключений. Ведь кроме нас, этим доступом может попробовать воспользоваться злоумышленник.
Сначала включим запись в лог файл /var/log/messages все попытки соединений на используемый нами нестандартный RDP порт:
iptables -I INPUT 1 -p tcp —dport 13389 -m state —state NEW -j LOG —log-prefix «NEW RDP SESSION»
Подключимся к нашему личному серверу, чтобы в логе появилась запись. Теперь отфильтруем все записи в лог файле, которые нам нужны:
cat /var/log/messages | grep «NEW RDP SESSION»
Читать такой лог не очень удобно, тем более каждый день. Поэтому, следующим шагом, автоматизируем анализ логов, чтобы регулярно получать отчеты, на основе нашего фильтра. Для этого воспользуемся утилитой Logwatch, ее установка через стандартный менеджер пакетов yum:
yum install logwatch
Сначала попробуем сгенерировать отчет вручную:
/usr/sbin/logwatch —detail low —service iptables —range today
- —service — задает конкретный сервис, сообщения от которого нужно анализировать, в нашем случае, только от iptables;
- —range — указывает период выборки данных, today – все события за сегодня;
- —detail — степень детализация отчета (high, med, low).
По умолчанию logwatch отобразит отчет на экран, получим примерно такой вывод:
Отчет работает, осталось выполнять его по расписанию, раз день и отправлять себе на email, для этого обновим команду и запишем ее в файл /etc/cron.daily/00logwatch:
/usr/sbin/logwatch —output mail —mailto test@gmail.com —detail low —service iptables —range yesterday
Здесь добавились опции:
—output — указывает способ вывода отчета, mail – отправить на почту;
—mailto — e-mail адрес получателя отчета.
Источник
Форвардинг портов через шлюз Linux в Iptables
NAT (network address translation, или трансляция сетевых адресов) – это технология перенаправления пакетов на альтернативный адрес. Как правило, она помогает трафику преодолеть границы сети. Хост, который реализует NAT, как правило, имеет доступ к двум или нескольким сетям и настроен для маршрутизации трафика между ними.
Форвардинг портов (или перенаправление портов) – это процесс переадресации запросов одного порта на другой хост, порт или сеть. Поскольку этот процесс изменяет назначение передаваемого пакета, он считается операцией NAT.
Данное руководство поможет настроить iptables для перенаправления портов на хосты с помощью технологии NAT. Такая настройка позволит допустить трафик в частную сеть с помощью шлюза.
Требования
Для работы вам понадобится:
- Два хоста Ubuntu 14.04 в одном датацентре с включенной частной сетью.
- Пользователь с доступом к sudo на каждом хосте.
Первый хост будет использоваться как брандмауэр и роутер дял частной сети. Второй хост будет работать как веб-сервер, который доступен только через закрытый интерфейс. Первый хост будет передавать запросы на открытый интерфейс веб-сервера, после чего они будут поступать на его закрытый интерфейс.
Данные хостов
Сначала нужно узнать свои сетевые интерфейсы. Чтобы узнать интерфейсы хостов и связанные с ними адреса, введите:
ip -4 addr show scope global
2: eth0 :
mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 198.51.100.45 /18 brd 45.55.191.255 scope global eth0
valid_lft forever preferred_lft forever
3: eth1 :
mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.5 /16 brd 10.132.255.255 scope global eth1
valid_lft forever preferred_lft forever
Вывод показал два интерфейса, eth0 и eth1, и присвоенные им адреса, 192.51.100.45 и 192.168.1.5 соответственно. Чтобы узнать свой открытый интерфейс, введите:
ip route show | grep default
default via 111.111.111.111 dev eth0
Команда выведет на экран интерфейс, подключенный к шлюзу по умолчанию (в данном примере это eth0). Обычно это и есть открытый интерфейс.
Найдите эти значения на каждой машине и используйте их в дальнейшей работе.
Условные данные руководства
Для приведения примеров в руководстве используются условные данные хостов. Пожалуйста, во время работы замените их своими данными.
- Внешний IP: 203.0.113.2
- Внутренний IP: 192.0.2.2
- Открытый интерфейс: eth0
- Закрытый интерфейс: eth1
- Внешний IP: 203.0.113.15
- Внутренний IP: 192.0.2.15
- Открытый интерфейс: eth0
- Закрытый интерфейс: eth1
Настройка веб-сервера
Установка Nginx
Сначала нужно установить Nginx и настроить его для прослушивания закрытого интерфейса. Так веб-сервер будет доступен только в случае правильной настройки форвардинга портов.
Обновите индекс пакетов и установите пакет:
sudo apt-get update
sudo apt-get install nginx
Настройка Nginx
Откройте виртуальный хост по умолчанию:
sudo nano /etc/nginx/sites-enabled/default
В нём найдите директиву listen:
server <
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
. . .
>
В файле она встречается дважды. В первой директиве listen нужно указать внутренний IP веб-сервера и задать порт 80.
Данное руководство предназначено только для IPv4, потому вторую директиву listen, для IPv6, можно просто удалить.
server <
listen 192.0.2.2:80 default_server;
. . .
>
Сохраните и закройте файл. Проверьте синтаксис на наличие ошибок:
Если ошибок нет, перезапустите Nginx:
sudo service nginx restart
Проверка настройки Nginx
Теперь нужно убедиться, что Nginx доступен только на закрытом интерфейсе.
Перейдите на сервер брандмауэра и попробуйте получить доступ к закрытому интерфейсу веб-сервера:
curl —connect-timeout 5 192.0.2.2
Welcome to nginx!
Welcome to nginx!
Попробуйте использовать открытый интерфейс:
curl —connect-timeout 5 203.0.113.2
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused
Настройка форвардинга
Перейдите на сервер брандмауэра.
Включение форвардинга в ядро
Сначала нужно включить форвардинг на уровне ядра. По умолчанию в большинстве систем эта функция отключена.
Чтобы включить форвардинг на одну сессию, введите:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
Чтобы включить форвардинг на постоянной основе, нужно отредактировать файл /etc/sysctl.conf.
sudo nano /etc/sysctl.conf
Найдите и раскомментируйте эту строку:
Сохраните и закройте файл, а затем обновите настройки:
sudo sysctl -p
sudo sysctl —system
Настройка брандмауэра
Чтобы выполнить базовую настройку брандмауэра, читайте это руководство, которое поможет вам:
- Установить iptables-persistent.
- Сохранить набор правил по умолчанию в /etc/iptables/rules.v4.
- Научиться добавлять и редактировать правила брандмауэра.
Настроив свой брандмауэр, можно добавить в него правила перенаправления портов.
Правила форвардинга
Итак, теперь нужно настроить брандмауэр таким образом, чтобы трафик, поступающий на порт 80 открытого интерфейса eth0, перенаправлялся на закрытый интерфейс eth1.
Согласно базовой настройке брандмауэра, цепочка FORWARD сбрасывает (DROP) трафик по умолчанию. Теперь нужно добавить правила, которые перенаправят соединения на веб-сервер. При этом рекомендуется ограничиться только необходимыми соединениями, а остальные заблокировать.
Цепочка FORWARD будет принимать новые соединения, предназначенные для порта 80 и поступающие от открытого интерфейса, и передавать их закрытому интерфейсу. Новые соединения обнаруживаются по расширению conntrack и пакету TCP SYN.
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp —syn —dport 80 -m conntrack —ctstate NEW -j ACCEPT
Это правило пропустит через брандмауэр первый пакет, который предназначен для создания соединения. Также необходимо разрешить любой последующий трафик в обоих направлениях, что является результатом этого соединения. Чтобы разрешить трафик между открытым и закрытым интерфейсом (ESTABLISHED,RELATED), введите:
iptables -A FORWARD -i eth0 -o eth1 -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT
Если цепочка FORWARD использует другую политику по умолчанию, установите в ней политику DROP:
sudo iptables -P FORWARD DROP
Теперь брандмауэр пропускает трафик между открытым и закрытым интерфейсом. Однако пока iptables ещё не знает, как именно нужно направлять этот трафик.
Правила NAT
Теперь нужно добавить правила iptables для маршрутизации трафика. Чтобы iptables мог правильно изменять пакеты и поддерживать взаимодействие между клиентами и веб-сервером, нужно выполнить две операции.
Первая операция, DNAT, будет выполняться в цепи PREROUTING таблицы nat. Эта операция изменяет целевой адрес пакета. Клиенты будут подключаться к серверу брандмауэра по общедоступной сети, не подозревая о перенаправлении пакетов. Нужно изменить адрес получателя каждого пакета, чтобы пакет, попадая в частную сеть, знал, как найти веб-сервер.
NAT не нужно применять ко всем пакетам, которые прошли брандмауэр. Настройте NAT для пакетов, поступающих на порт 80 внутреннего IP-адреса (в данном примере это 192.0.2.2).
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp —dport 80 -j DNAT —to-destination 192.0.2.2
Теперь пакет будет перенаправлен на веб-сервер. Однако на данный момент исходным адресом пакета все еще остается адрес клиента. Сервер попытается отправить ответ непосредственно на этот адрес, в результате чего TCP-соединение не будет легитимным.
Чтобы настроить правильную переадресацию, нужно также изменить исходный адрес пакета. Этот адрес нужно заменить внутренним IP-адресом сервера брандмауэра (в данном примере это 192.0.2.15). После этого ответ будет отправлен на сервер брандмауэра, а уже оттуда он попадёт к клиенту.
Для этого нужно добавить правило в цепочку POSTROUTING в таблицу nat. Она читается непосредственно перед отправкой пакетов по сети.
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp —dport 80 -d 192.0.2.2 -j SNAT —to-source 192.0.2.15
Теперь веб-сервер будет доступен в браузере, если направить его на внешний адрес хоста брандмауэра.
curl 203.0.113.15
Welcome to nginx!
Welcome to nginx!
Форвардинг портов настроен.
Сохранение правил
Добавив правила для форвардинга портов, нужно сохранить их в наборе постоянных правил брандмауэра.
Если в постоянном наборе правил нет важных комментариев, можете просто использовать такую команду:
sudo service iptables-persistent save
Чтобы сохранить комментарии, откройте файл и отредактируйте его вручную:
sudo nano /etc/iptables/rules.v4
Отредактируйте конфигурации в таблице filter, в цепочке FORWARD. Также нужно отредактировать таблицу nat, в которую нужно добавить правила PREROUTING и POSTROUTING. В данном случае эти правила будут выглядеть так:
*filter
# Allow all outgoing, but drop incoming and forwarding packets by default
:INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Custom per-protocol chains
:UDP — [0:0] :TCP — [0:0] :ICMP — [0:0] # Acceptable UDP traffic
# Acceptable TCP traffic
-A TCP -p tcp —dport 22 -j ACCEPT
# Acceptable ICMP traffic
# Boilerplate acceptance policy
-A INPUT -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
# Drop invalid packets
-A INPUT -m conntrack —ctstate INVALID -j DROP
# Pass traffic to protocol-specific chains
## Only allow new connections (established and related should already be handled)
## For TCP, additionally only allow new SYN packets since that is the only valid
## method for establishing a new TCP connection
-A INPUT -p udp -m conntrack —ctstate NEW -j UDP
-A INPUT -p tcp —syn -m conntrack —ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack —ctstate NEW -j ICMP
# Reject anything that’s fallen through to this point
## Try to be protocol-specific w/ rejection message
-A INPUT -p udp -j REJECT —reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT —reject-with tcp-reset
-A INPUT -j REJECT —reject-with icmp-proto-unreachable
# Rules to forward port 80 to our web server
# Web server network details:
# * Public IP Address: 203.0.113.2
# * Private IP Address: 192.0.2.2
# * Public Interface: eth0
# * Private Interface: eth1
#
# Firewall network details:
#
# * Public IP Address: 203.0.113.15
# * Private IP Address: 192.0.2.15
# * Public Interface: eth0
# * Private Interface: eth1
-A FORWARD -i eth0 -o eth1 -p tcp —syn —dport 80 -m conntrack —ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o eth1 -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i eth1 -o eth0 -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT
# End of Forward filtering rules
# Commit the changes
COMMIT
*raw
:PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT
*nat
:PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # Rules to translate requests for port 80 of the public interface
# so that we can forward correctly to the web server using the
# private interface.
# Web server network details:
# * Public IP Address: 203.0.113.2
# * Private IP Address: 192.0.2.2
# * Public Interface: eth0
# * Private Interface: eth1
#
# Firewall network details:
#
# * Public IP Address: 203.0.113.15
# * Private IP Address: 192.0.2.15
# * Public Interface: eth0
# * Private Interface: eth1
-A PREROUTING -i eth0 -p tcp —dport 80 -j DNAT —to-destination 192.0.2.2
-A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp —dport 80 -j SNAT —to-source 192.0.2.15
# End of NAT translations for web server traffic
COMMIT
*security
:INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT
*mangle
:PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT
Сохраните и закройте файл.
Проверьте ошибки в файле:
sudo iptables-restore -t
Если ошибок нет, обновите список правил:
sudo service iptables-persistent reload
Убедитесь, что веб-сервер всё ещё доступен по внешнему адресу сервера брандмауэра:
Заключение
Теперь форвардинг портов с помощью iptables успешно настроен. Такая технология позволяет пропускать трафик через шлюз брандмауэра, при этом скрывая топологию сетей.
Источник