Допустим, у нас есть общедоступный веб-сайт example.com
решая 1.1.1.1
. Фактический веб-сервер находится за маршрутизатором / брандмауэром и прослушивает порт. 8080
.
Простая настройка подходит для пользователей Интернета, но не для других клиентов в 192.168.1.0
ассортимент. Клиент в 192.168.1.3
не могу подключиться к 1.1.1.1:80
. У нас есть закрепление NAT проблема, (описанная также в микротик вики).
Допустим, мы решаем вопрос не настройкой роутера, а с iptables
в самом веб-сервере. Эти команды указывают, что все исходящие пакеты на порт 8080 будут отправлены через маршрутизатор:
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8080 -j MARK --set-xmark 1
ip rule add fwmark 1 table natreflect
ip route add default via 192.168.1.1 table natreflect
Приведенная выше конфигурация решает всех клиентов в 192.168
диапазон, но не клиенты в 192.168.1.2
сам.
Когда клиент 192.168.1.2
хочет подключиться к 1.1.1.1:80
, он отправляет пакет вроде 192.168.1.2:34567->1.1.1.1:80
к роутеру. Маршрутизатор выполняет NAT и отправляет пакет 192.168.1.2:34567->192.168.1.2:8080
на веб-сервер (например, на его eth0
интерфейс). Веб-серверы получают этот пакет. Пакет проходит цепочки mangle.PREROUTING
и nat.PREROUTING
, но не доходит до mangle.INPUT
(и соединение не устанавливается).
В чем проблема? (rp_filter
установлен на 0 на всех интерфейсах)
Для сервера это сложно 192.168.1.2
принять приходящий входящий пакет из собственный IP 192.168.1.2
но из области ссылка на сайт, а не объем хозяин, то есть со своего собственного IP-адреса, но он не сам. Это кажется проблемой маршрутизации, для которой может быть или не быть решения. Эту ситуацию все еще можно обойти, чтобы этого никогда не произошло.
Чтобы избежать этой ситуации, еще до того, как начальный пакет покинет веб-сервер 192.168.1.2
и идите по проводу, просто добавьте к нему правило iptables, перенаправляющее соединение от себя к 1.1.1.1:80
прямо в нужное место: к себе.
iptables -t nat -A OUTPUT -s 192.168.1.2 -d 1.1.1.1 -p tcp --dport 80 -j REDIRECT --to-ports 8080
Альтернативным и эквивалентным правилом (по крайней мере, для последних ядер, возможно, не для старых ядер) было бы:
iptables -t nat -A OUTPUT -s 192.168.1.2 -d 1.1.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:8080
Просто добавив это правило в дополнение к другим настройкам, подключения, поступающие извне, из локальной сети и с веб-сервера, будут вести себя одинаково: они работают, они сохраняют исходный IP-адрес и для всех случаев IP-адрес назначения является 192.168.1.2
. Единственный недостаток - знать, что 1.1.1.1
.