У меня есть веб-сервер, скрытый за брандмауэром. Правило DNAT на моем брандмауэре делает его доступным для посетителей из Интернета. Правило работает для трафика из Интернета. К сожалению, это не работает (или только частично) для трафика, поступающего из той же подсети, что и реальный пункт назначения. По какой-то причине netfilter не восстанавливает исходный адрес назначения, и поэтому клиент / отправитель игнорирует ответный пакет.
Что я делаю не так?
192.168.101.0/24 # LOCAL Lan
192.168.101.16 # Client
192.168.101.18 # Server
192.168.101.254 # firewall
144.256.256.1 # firewall (Not the real IP)
(Internet)
| 144.256.256.1 |
| |
| Firewall |
| |
| 192.168.101.254 |
|
|
----------------------
| |
192.168.101.16 192.168.101.18
(Client) (Server)
-t nat -A PREROUTING -d 144.256.256.1 --dport 81 -j DNAT destination 192.168.0.2
-t nat -A POSTROUTING -s 192.168.0.0/16 ! -d 192.168.0.0/16 -j MASQUERADE (Should be irrelevant)
(Client) 192.168.101.16 trying to reach (Server) 144.256.256.1/81
192.168.101.16.57631 > 144.256.256.1.81: Flags [S], seq 1884612678
192.168.101.16.57631 > 192.168.101.18.81: Flags [S], seq 1884612678
192.168.101.16.57631 > 144.256.256.1.81: Flags [S], seq 1884612678
192.168.101.16.57631 > 192.168.101.18.81: Flags [S], seq 1884612678
(Seems okay. tcpdump was on -i any. Incoming packet to orginal destination 144.xx Outgoing packet to new destination. But for some reason we're not seeing the responses)
IP 192.168.101.16.57874 > 192.168.101.18.81: Flags [S], seq 4243879528,
IP 192.168.101.18.81 > 192.168.101.16.57874: Flags [S.], seq 595099059, ack 4243879529,
IP 192.168.101.16.57874 > 192.168.101.18.81: Flags [R], seq 4243879529, win 0, length 0
(Seems good)
IP 192.168.101.16.57874 > 144.256.256.1.81: Flags [S], seq 4243879528
IP 192.168.101.18.81 > 192.168.101.16.57874: Flags [S.], seq 595099059, ack 4243879529, (WTF packet. The source should be 144.x again. For some reason netfilter didn't restore the orignal destination address for the response packet.)
IP 192.168.101.16.57874 > 192.168.101.18.81: Flags [R], seq 4243879529
Вы не видите ответных пакетов на брандмауэре, потому что их нет. Сервер не отправляет ответ брандмауэру, поскольку клиент находится в той же подсети.
Запрос: Клиент -> Брандмауэр -> Сервер
Ответ: Сервер -> Клиент
Поэтому клиент отклоняет ответ, потому что он ожидает ответа не от сервера, а от брандмауэра.
Либо попробуйте какую-нибудь сумасшедшую магию маршрутизации, либо установите внутренний IP-адрес для своего URL-адреса в клиентском файле hosts. Или вообще избавиться от NAT ...