Iptables не работает так, как я ожидал: ответный пакет не DNAT, как ожидалось, с DNAT в PREROUTING

Iptables не работает так, как я ожидал: ответный пакет не DNAT, как ожидалось, с DNAT в PREROUTING

Мой сервер (на котором 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я получаю ответ.

Вот как я понимаю, что в этом случае все должно работать:

  1. curl http://192.168.3.110- не забывайте, что я выполняю это со своего сервера, с IP192.168.3.110
  2. Пакет отправляется в цепочку OUTPUT из таблицы NAT, где он подвергается ДНК-трансляции.
  3. Пакет отправляется в цепочку POSTROUTING из таблицы NAT, где он SNATируется
  4. мой Apache из 192.168.3.106отвечает на мой запрос.
  5. пакет достигает цепочки PREROUTING из таблицы NAT, где он должен быть подвергнут DNAT
  6. пакет пересылается и куда-то выбрасывается.

Кажется, все работает так, как и ожидалось, за исключением пунктов 5 и 6. Другими словами, я получаю ответ от сервера.Кто-нибудь может объяснить мне, где моя логика нарушена?

решение1

Таблицы iptables nat просматриваются только для первого пакета (псевдо-)соединения. Последующие пакеты сопоставляются (или остаются в покое) в соответствии с сопоставлениями, установленными первым пакетом.

Связанный контент