Мой сервер (на котором iptables
загружены следующие правила) имеет IP 192.168.3.110
. В моей локальной сети есть еще один компьютер с IP 192.168.3.106
. Я пытаюсь перенаправить запросы на мой сервер на порт 80 на 192.168.3.106
.
У меня есть следующий iptables
файл, загруженный на мой сервер CentOS 7:
*nat
:PREROUTING DROP
:INPUT DROP
:OUTPUT DROP
:POSTROUTING DROP
-A PREROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A PREROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A PREROUTING --dst 192.168.3.110 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.106
-A PREROUTING -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A OUTPUT --dst 192.168.3.110 -p tcp -m state --state NEW --dport 80 -j DNAT --to-destination 192.168.3.106
-A OUTPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A POSTROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A POSTROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A POSTROUTING --src 192.168.3.0/24 --dst 192.168.3.106 -p tcp --dport 80 -j SNAT --to-source 192.168.3.110
-A POSTROUTING -o lo -j ACCEPT
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -p tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp -j ACCEPT
-A OUTPUT -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
По сути, я делаю следующее (по крайней мере, я так понимаю):
включить ssh-соединение
включить TCP на порту 80
Пакеты DNAT и SNAT, позволяющие добиться желаемого поведения.
Вопрос:Я не понимаю, почему, когда я делаю вызов со своего сервера на него самого, т.е. 192.168.3.110
я получаю ответ.
Вот как я понимаю, что в этом случае все должно работать:
curl http://192.168.3.110
- не забывайте, что я выполняю это со своего сервера, с IP192.168.3.110
- Пакет отправляется в цепочку OUTPUT из таблицы NAT, где он подвергается ДНК-трансляции.
- Пакет отправляется в цепочку POSTROUTING из таблицы NAT, где он SNATируется
- мой Apache из
192.168.3.106
отвечает на мой запрос. - пакет достигает цепочки PREROUTING из таблицы NAT, где он должен быть подвергнут DNAT
- пакет пересылается и куда-то выбрасывается.
Кажется, все работает так, как и ожидалось, за исключением пунктов 5 и 6. Другими словами, я получаю ответ от сервера.Кто-нибудь может объяснить мне, где моя логика нарушена?
решение1
Таблицы iptables nat просматриваются только для первого пакета (псевдо-)соединения. Последующие пакеты сопоставляются (или остаются в покое) в соответствии с сопоставлениями, установленными первым пакетом.