У меня есть DMZ-сервер, настроенный для переадресации определенных портов на пару машин. Предполагаемое поведение - отправить запрос в демилитаризованную зону на конкретный порт и заставить машину, которая недоступна, публично ответить данными. В этом примере я перенаправляю порт 10001 на сервер без публикации на порт 80.
Я вижу, что форвард работает, потому что я вижу, что пакеты приходят через tcpdump на сервер. По какой-то причине пакеты, которыми он отвечает, не возвращаются на мой терминал (я скручиваюсь).
iptables-save:
# Generated by iptables-save v1.4.10 on Fri Dec 23 17:36:10 2011
*nat
:PREROUTING ACCEPT [5609:332934]
:INPUT ACCEPT [5609:332934]
:OUTPUT ACCEPT [5231:376507]
:POSTROUTING ACCEPT [5248:377595]
-A PREROUTING -i eth0 -p tcp -m tcp --dport 10001 -j DNAT --to-destination 192.168.1.11:80
COMMIT
# Completed on Fri Dec 23 17:36:10 2011
# Generated by iptables-save v1.4.10 on Fri Dec 23 17:36:10 2011
*filter
:INPUT ACCEPT [119300:24294441]
:FORWARD ACCEPT [183:10688]
:OUTPUT ACCEPT [118926:28442933]
-A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 10001 -j ACCEPT
COMMIT
# Completed on Fri Dec 23 17:36:10 2011
Примечание: я вынул свой ip и заменил его на 10.10.10.10 Легенда:
tcpdump из DMZ:
17:44:45.039273 IP 10.10.10.10.64090 > 192.168.1.3.10001: Flags [S], seq 2710805211, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 1211306586 ecr 0,sackOK,eol], length 0
17:44:45.039365 IP 10.10.10.10.64090 > 192.168.1.11.www: Flags [S], seq 2710805211, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 1211306586 ecr 0,sackOK,eol], length 0
Судя по всему, переадресация работает.
tcpdump с непубличного сервера:
17:51:14.260134 IP 10.10.10.10.64110 > 192.168.1.11.www: Flags [S], seq 722619659, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 1211694763 ecr 0,sackOK,eol], length 0
17:51:14.260378 IP 192.168.1.11.www > 10.10.10.10.64110: Flags [S.], seq 3171485713, ack 722619660, win 14480, options [mss 1460,sackOK,TS val 4294937443 ecr 1211694763,nop,wscale 3], length 0
17:51:14.260470 IP 10.10.10.10.64111 > 192.168.1.11.www: Flags [S], seq 483447265, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 1211694763 ecr 0,sackOK,eol], length 0
Мой завиток из удаленной сети (обфусцированный IP):
$ curl -vv remote-unit:10001
* About to connect() to remote-unit port 10001 (#0)
* Trying 99.99.99.99... Operation timed out
* couldn't connect to host
* Closing connection #0
curl: (7) couldn't connect to host
Так как вы выполняете DNAT, для ответа непубличного сервера у него должен быть маршрут (конкретный или по умолчанию) через машину, выполняющую DNAT - если маршрут асимметричный (т. Е. Ответы не выходят через машину, которая выполняется DNAT) или просто нет действительного маршрута для ответа, в результате ваш клиент не получит ответ.