Итак, у нас есть роутер на Linux с файерволом iptables, на одном интерфейсе которого - интернет, а на другом - внутрисеть. Например, белых IP у нас немного (в худшем случае вообще только один) и нам нужно перенаправить трафик по определенному порту белого IP на сервер, находящийся внутри сети.
Тобишь, вот так:
пакет -> белый_ip:80 --> серый_ip:80
Или, если смотреть в примере, то:
- белый адрес: 11.22.33.44
- адрес сервера внутри сети: 10.0.0.5
- внутрисеть: 10.0.0.0/24
- IP роутера на внутрисетевом интерфейсе: 10.0.0.1
- все, что ломится на 11.22.33.44 по порту 80 - перенаправлять на 10.0.0.5 (тоже порт 80)
Задача тривиальная и решается вот такой строчкой:
iptables -t nat -A PREROUTING -p tcp -d 11.22.33.44 --dport 80 -j DNAT --to-destination 10.0.0.5:80
Но вот задача посложнее. Из-вне то мы веб-сервер увидели. Но вот изнутри сети он все-равно не виден. Что делать?
Простых вариантов 2:
1) Внутри сети, если есть внутрисетевой DNS сервер, например, от Active Directory - переопределить нужные зоны DNS и сказать, что www.myhost.ru - топать не на 11.22.33.44, а на 10.0.0.5. Минусы очевидны: нужно иметь внутрисетевой DNS-сервер и нужно вовремя править и добавлять зоны на нем. Ну и это грабли.
2) Настроить iptables так, чтобы он DNAT-ил не только снаружи, но и изнутри сети. Таким образом мы будем ломиться на 11.22.33.44:80 изнутри сети и нас будет прокидывать на 10.0.0.5:80, как будто мы делаем это из-вне.
Если рассмотреть правило PREROUTING, описанное выше, то видно, что у нас не указывается - откуда именно должен прилететь пакет, чтобы его швырнуло на 10.0.0.5. Но почему-то ведь не работает?
Разгадка здесь в следующем: когда клиентский компьютер отправляет пакет на 11.22.33.44, роутер на самом деле успешно пакет D-NAT'ит на 10.0.0.5. Т.е. до сервера то пакет доходит. Но вот когда сервер отправляет ответ - он видит, что трафик пришел изнутри сети, соответственно ответ он отправляет:
а) Со своего внутрисетевого адреса (10.0.0.5);
б) Напрямую, без использования маршрутизатора, ибо клиент находится внутри его подсети;
Клиент же не ожидает такой пакет: он не готов к тому, что ответ придет от 10.0.0.5, а не с 11.22.33.44. Причем, даже выдернув сервера в отдельную подсеть, у Вас, скорее всего, ничего не получится, т.к. клиент все-равно будет ждать ответ от 11.22.33.44, а не от внутреннего IP, пусть даже трафик пройдет через роутер - S-NAT'а то не произойдет.
Решение - это замаскарадить трафик между внутрисетью и серверами, глядящими во-вне.
Для этого, оставляя неизменным правило выше, добавим еще одно, в раздел POSTROUTING:
iptables -t nat -A POSTROUTING -d 10.0.0.5 -s 10.0.0.0/24 -j SNAT --to-source 10.0.0.1
Таким образом мы выполняем S-NAT для всего трафика, который, по факту, топает на наш сервер 10.0.0.5. И ответ будет уже после маскарадинга - с 11.22.33.44, как и ожидает клиентский компьютер.
Комментарии
Оставить комментарий
Операционная система LINUX
Термины: Операционная система LINUX