我设置了一个 DMZ 服务器,用于将特定端口转发到几台机器。预期行为是让我在特定端口上向 DMZ 发送请求,并让无法访问的机器公开响应数据。在此示例中,我将端口 10001 转发到端口 80 上的非发布服务器。
我可以看到转发正在工作,因为我可以看到数据包通过服务器上的 tcpdump 进入。无论出于什么原因,它响应的数据包都没有返回到我的终端(我正在 curling)。
iptables-保存:
# 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 替换。图例:
- 192.168.1.3 = DMZ
- 192.168.1.11 = 非公开服务器
- 10.10.10.10 = 来自远程网络的我。
来自 DMZ 的 tcpdump:
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
我的远程网络 curl(混淆的 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
答案1
由于您正在执行 DNAT,为了让非公共服务器能够回复,它必须通过执行 DNAT 的机器具有一条路由(无论是特定的还是默认的) - 如果路由是不对称的(即回复不通过执行 DNAT 的机器发出)或者根本没有有效的路由来回复,您的客户端将无法收到回复。