× К оглавлению На главную Об авторе

   Дата и время публикации: Дата и время модификации:

Проблемы и решение

1. Суть проблем

При реализации доступа к одним и тем же общеиспользуемым и/или публичных узлов, многие сталкиваются с ограничением:

Что и показано на рисунке 1.1

Рисунок 1.1

Как показано на рисунке 1.1, вся нагрузка по разрешению проблемы нехватки маршрутизируемых адресов IP для внутренних абонентов сети LAN является в поиске путей реализации раздельного доступа клиентов LAN с IP:192.168.1.0/24 и доменным именем local.local к разделяемым, находящимся в общем доступе, ресурсам WAN, в качестве которой выступает тестовая сеть "TEST-NET" с ip:192.0.2.0/24 и доменным именем example.com согласно RFC-3330 [3.5]. Вместе с этим можно обеспечить ограничение внешнего доступа из публичной сети WAN к адресам локальной подсети LAN.

Пограничный маршрутизатор (edge routers) получает входящее сообщение из внешней сети WAN и маршрутизирует пакеты, предназначенные узлу LAN, который является инициатором данной передачи и в начале передает исходящие запросы от узла LAN к узлу WAN

Подчас, передача сетевого трафика может стать опасной, особенно с имеющимся у злоумышленников большого спектра современных утилит для взлома и нарушения работы вычислительных сетей. Для предотвращения этого, можно воспользоваться встроенными в пограничный маршрутизатор механизмами фильтрации, который реализуется системной утилитой iptables [3.1]

Системная утилита iptables обеспечивает установку критериев фильтрации (filter) и манипуляции сетевыми пакетами (mangle), а также реализует настройку механизма ретрансляции сетевого адреса (network address translation, NAT). При этом устанавливаемые правила ассоциируются с цепочками, обращение к которым осуществляется в той последовательности, которая показана на рисунке 1.2

Рисунок 1.2

Как показано на рисунке 1.2, во время фильтрации, управления и ретрансляции сетевого адреса цепочки PREROUTING, FORWARD и POSTROUTING, которые для простоты восприятия отображают таблицы mangle, filter и nat в качестве своих составных частей, а не наоборот, как выглядит данная последовательность на самом деле.

В самом простом случае, входящий пакет достигает сетевого устройства eth0 с IP:192.0.2.254 поднятого в системе на пограничном маршрутизаторе. После чего к нему будут применены правила цепочки PREROUTING таблицы mangle, а уже затем в той же цепочки, но уже в таблице nat . Далее, следующие шаги связаны с маршрутизацией пакета, когда определяется фактическое назначение пакета, а именно какой с ним связан процесс системы. В конечном итоге, после прохождения цепочки INPUT из таблицы mangle и таблицы filter, они достигнут цели, а именно той части программных средств системы на сетевом устройстве eth1 c IP:192.168.1.1, при условии что правила фильтрации позволяют и не запрещают это.

Механизм NAT, реализуемый iptables, обеспечивает маршрутизацию с использование политики продвижения пакетов (forwading) и маскарадинга пакетов IP, которые в совокупности с цепочками фильтрации INPUT и OUTPUT могут быть реализованы для предотвращения аберрантного использования сетевых ресурсов.

Политика MASQUERADE, маскарадинга пакетов IP, является особой формой реализации механизма NAT, реализуемой только в ядре ОС GNU/Linux, для организации доступа между публичной сетью WAN и внутренней LAN

Узлы LAN используют как неофициально выделяемые IP-адреса из внутреннего диапазона, так и публично, официально выделяемых IP-адресов сети WAN. Поэтому, чтобы разрешить все проблемы, связанные с доступом к внешней сети WAN, используется трансляция внутренних IP-адресов к одному внешнему.

За трансляцию IP-адресов подсети LAN (IP: 192.168.1.0/24) к одному внешнему подсети WAN (IP: 192.0.2.1/24) отвечает пограничный маршрутизатор , который по сути является шлюзом между сетям LAN и WAN.

Принцип, лежащий в основе, достаточно прост: маршрутизатор имеет больше чем один сетевой интерфейс, как минимум одну сетевую карту (адаптер), имеющую, в свою очередь, два интерфейса для сопряжения: первый — для LAN (IP:192.168.1.1/32) и отдельный сетевой интерфейс — для WAN (IP:192.0.2.254/32). Пока последний связывает маршрутизатор с внешним миром, выступая в качестве клиента сети WAN, первый обеспечивает сопряжение с узлами внутренний сети LAN в качестве шлюза (IP:192.168.1.1/32), куда все абоненты внутри неё передают и принимают свои и чужие пакеты, даже те которые не предназначены для передачи во внешнюю сеть.

Поэтому на ряду с политикой MASQUERADE трансляцией (маскарадинга) IP-адресов в цепочках PREROUTING, FORWARD и POSTROUTING существует задача так называемого проброса портов между отдельными узлами сетей внутренней сети LAN и внешней сети WAN, которая является сетью назначения. Кроме того, такого же эффекта можно достичь за счет использования цепочек фильтрации INPUT и OUTPUT, но эта уже другая история.

2. Решение

2.1 Применение политики FORWARD

Как показано на рисунке 1.1, что в качестве межсетевого экрана и сетевого шлюза для внутренней сети с IP:192.168.1.0/24 назначено устройство eth1 с IP-адресом 192.168.1.1/32, а eth0 c IP:192.0.2.254/32 – в качестве клиента внешней сети с IP:192.0.2.0/24, как показано в дампе 2.1.1

Дамп 2.1.1

sudo ip addr add 192.0.2.1/32 broadcast 192.0.2.255 dev eth0
sudo ip route add 192.0.2.0/24 via 192.0.2.1 dev eth0
sudo ip addr add 192.168.1.1/32 broadcast 192.168.1.255 dev eth1
sudo ip route add 192.168.1.0/24 via 192.168.1.1 dev eth0

Политика FORWARD позволяет контролировать администратору, где могут быть маршрутизированы пакеты в пределах одной внутренней сети LAN. Так, для примера, пересылка всех информационных пакетов в пределах одной подсети LAN могут быть заданы следующими правилом, как показано в дампе 2.1.2

Дамп 2.1.2

sudo iptables -A FORWARD -i eth1 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -j ACCEPT

Эти правила дают доступ узлов внешней сети к внутренним. Шлюз маршрутизирует пакеты от одного узла LAN к назначенному им узлу-приемнику, принимая все пакеты через сетевое устройство eth1 . Поэтому, в большинстве дистрибутивов OC GNU/Linux для IPv4 политика продвижения пакетов IP выключена по умолчанию и её нужно включать непосредственно путем записи 1 в файл /proc/sys/net/ipv4/ip_forward, как показано в дампе 2.1.3

Дамп 2.1.3

sudo echo 1 > /proc/sys/net/ipv4/ip_forward

или раскомментировать параметр ядра net.ipv4.ip_forward файле /etc/sysctl.conf, как показано в листинге 2.1.4

Дамп 2.1.4

...
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
...

Далее, остается лишь применить немедленно изменения в ядро Linux с использованием команды sysctl -w [3.2].

Кроме продвижения пакетов по IP-адресу узла назначения сразу всем портам, можно указать порт на узле назначения, как показано в дампе 2.1.5

Дамп 2.1.4

sudo iptables -A FORWARD -p tcp -d 192.0.2.1 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

В дампе 2.1.4, кроме указания порта назначения 22 (опция --dport), используется внешний модуль iptables-extensions(8), задействующий фильтрацию tcp-соединений с помощью опции -m state, которая требует использовать вместе с ней опцию --state и отслеживает состояния NEW, ETABLISHED или RELATED, в одном из которых tcp-соединение может находится. Так, состояние NEW относится ко всем входящим tcp-пакетам новых соединений, которые не были еще созданы хост- или центральной системой, на которой крутится служба SSH, на пример. ESTABLISHED и RELATED относятся также ко входящим пакетам, которые являются частью или касаются уже созданного tcp-соединения.

Таким образом, в дампе 2.1.4, устанавливается разрешение продвижения tcp-пакетов к узлу-приемнику с IP:192.0.2.1 на 22-й порт для новых или уже созданных tcp-соединений для службы SSH, чья серверная программа прослушивает указанный порт [3.11].

2.2 Применение политики MASQUERADE

Разрешение применять продвижение пакетов (ip forward) через внутреннее IP-устройство межсетевого экрана лишь позволит узлам LAN взаимодействовать друг с другом, но не как с внешней сети WAN

Поэтому, чтобы позволить отдельным IP адресам взаимодействовать с внешней сетью WAN, следует использовать политику маскарадинга IP (IP-masquerading), который является более безопасным механизмом реализации NAT и транслирует запросы от узлов внутренней сети, который сводится к замене IP-адреса на внешний на устройстве eth0, как показано в дампе 2.2.1

Дамп 2.2.1

sudo iptables $IPTABLES -t nat -A POSTROUTING -o eth0 -j MASQUERADE -s 192.0.2.0/24

При этом, не плохо указать в качестве адреса-источника внешнюю сеть IP:191.255.125.0/24 с использованием опции -s, как было показано в дампе 2.2.1 [3.3].

Кроме того, вместо политики FORWARD можно использовать туже самую политику MASQUERADE, как показано в дампе 2.2.2

Дамп 2.2.2

sudo iptables -A POSTROUTING -t nat -j MASQUERADE -o eth0 -s 192.0.2.254/32
sudo iptables -A POSTROUTING -t nat -j MASQUERADE -o eth1 -s 192.168.1.1/32

При этом потребуется ввести устройство eth1 во внешнюю сеть, что не совсем безопасно в случае использования с публичной сетью WAN, но востребовано для управления и обеспечения доступом к гостевым операционным системам, запущенными с использованием средств виртуализации и таких же виртуальных сетевых устройств типа мостов (virbr) и его спутника сетевого устройства TAP, являющегося программной симуляцией сетевого ethernet-устройства.

2.3 Использование SNAT

SNAT является аббревиатурой SNAT(Source Network Address Translation), которая осуществляет трансляцию в цепочке POSTROUTING внутреннего IP-адреса к внешнему узлу как по значению адреса-источника (source address) , так и по порту-источника (source port) в заголовке TCP/UDP [3.4].

Типичным сценарием, где мы можем воспользоваться SNAT, является требование изменения внутреннего адреса или порта источника внутри публичной сети WAN, когда пакеты попадают во внешнюю сеть, как показано в дампе 2.3.1

Дамп 2.2.2

sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.0.2.0/24

Таким образом, SNAT обычно используется, когда внутренний узел LAN является инициатором соединения с узлом внешний сети WAN, тогда на устройстве eth0, на котором производится замещение в заголовке пакета по IP-адреса, инициирующего обмен внутреннего порта узла-источника (source port), на IP-адрес внешнего данного устройства.

Кроме того, это также можно осуществить изменение IP-адреса для пакетов, передаваемых по указанному диапазону портов, передаваемого в заголовке пакетов TCP/UDP, схема трансляции которого показана на рисунке 2.3.2

Рисунок 2.3.2

Как показано на рисунке 2.3.3, проблема заключается в подмене IP-адреса источника для пары IP-адреса и порта назначения, которые можно установить как показано 2.3.1

Дамп 2.3.3

iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 192.0.2.254/32:1-1023
iptables -t nat -A POSTROUTING -p udp -o eth0 -j SNAT --to 192.0.2.254/32:1-1023

При этом никто не мешает установить подобные правила для двух различных портов, как в случае со службами SSH (22-й порт) и TFTP(69 порт), как показано в дамп 2.3.4

Дамп 2.3.3

iptables -t nat -A POSTROUTING  -p udp -o eth0 -j SNAT --to 192.0.2.1:22
iptables -t nat -A POSTROUTING  -p udp -o eth0 -j SNAT --to 192.0.2.1:69

Последнее правило устанавливает заменять IP-адрес 192.0.2.1, всем исходящим пакетам UDP, передаваемых с узла client10.local.local через выходной интерфейс eth0 порта 69 запрос на соединение службы TFTP

2.4 Использование DNAT

DNAT обозначает, что осуществляется трансляция сетевого адреса к сети назначения (Destination Network Address Translation, DNAT) , который изменяет IP-адрес узла-назначения в заголовке входящего пакета на шлюзе, как показано на рисунке 2.4.1

Рисунок 2.3.2

На котором показано, что для полноценного обмена по протоколу TFTP нужно обеспечить перенаправление с узла источника сети 192.0.2.0/24 на узел назначения сети 192.168.1.0/24, который ожидает ответ на свой запрос посланный в инициирующем соединение пакете на порт 69 ранее, показанным на рисунке 2.3.2

Поэтому для разрешения этого нужно установить правила перенаправления пакета на узел назначения 192.168.1.10/32, как показано в дампе 2.4.5

Дамп 2.4.5

sudo iptables -t nat -A PREROUTING  -i virbr1 -s 192.0.2.0/24 -p udp --dport 1024:65535 -j DNAT --to 192.168.1.10:1024-65535

Как показано в дампе 2.4.5, в таблице NAT для цепочки сети PREROUTING устанавливается правило перенаправления входящих пакетов маршрутизатора, получаемые с эфимерного порта, в диапазоне 1024-65565, и узла источника внешней сети с IP:192.0.2.0/24, на узел с внутреннем IP:192.168.1.10 и эфимерным портом приемника в указанном диапазоне.

3. Библиография

3.1 Red Hat's Customer portal. Security Guide. 7.4. FORWARD AND NAT RULES

3.2 OpeNET. man-page sysctl (8)

3.3 How do I set Input interface is output interface

3.4 HomeBlog. SNAT vs DNAT – Detailed Comparison Table

3.5 RFC-3330.Special-Use IPv4 Addresses

3.6 Википедия.Межсетевой экран

3.7 OpenSuSe.Security Guide. Masquerading and Firewalls

3.8 Linux 2.4 NAT HOWTO. 6.Saying How To Mangle The Packets

3.9 Gits.GitHub.com. Some examples of SNAT, DNAT with iptables with comments

3.10 ServerFault. How can I port forward with iptables?

3.11 WiKi.Centos.org. Howtos. Network. IPTables