我在 Debian Squeeze 服务器上新设置了 IPTABLES,并且 IP 伪装和端口转发功能可以成功运行,但是如果我在 URL 栏中输入我的 WAN IP 或 DynDNS 主机名,就会出现连接错误。使用以前的消费级路由器,如果我转到http://[我的主机名],它将加载 10.0.0.3:80,如下所示。这在外部有效(使用 3G 手机测试),但在内部无效(使用任何内部浏览器)。所有转发端口都一样。我正在尝试让端口转发在内部也能正常工作。
如果有人知道正确的咒语,我将不胜感激。我试过在 Google 上搜索,但不确定该问题的正确搜索词是什么。
我的配置如下:
# Generated by iptables-save v1.4.8 on Thu Apr 14 15:58:27 2011
*mangle
:PREROUTING ACCEPT [1216168:676166344]
:INPUT ACCEPT [2375:260404]
:FORWARD ACCEPT [1213765:675875465]
:OUTPUT ACCEPT [1930:203384]
:POSTROUTING ACCEPT [1215695:676078849]
-A FORWARD -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:65495 -j TCPMSS --clamp-mss-to-pmtu
COMMIT
# Completed on Thu Apr 14 15:58:27 2011
# Generated by iptables-save v1.4.8 on Thu Apr 14 15:58:27 2011
*filter
:INPUT ACCEPT [2375:260404]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1930:203384]
-A FORWARD -i ppp0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o ppp0 -j ACCEPT
-A FORWARD -d 10.0.0.8/32 -p tcp -m tcp --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.0.0.3/32 -p tcp -m tcp --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.0.0.8/32 -p tcp -m tcp --dport 1723 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.0.0.8/32 -p udp -m udp --dport 1723 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.0.0.3/32 -p tcp -m tcp --dport 21 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.0.0.3/32 -p tcp -m tcp --dport 45631 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.0.0.3/32 -p tcp -m tcp --dport 56630 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.0.0.3/32 -p udp -m udp --dport 56630 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu Apr 14 15:58:27 2011
# Generated by iptables-save v1.4.8 on Thu Apr 14 15:58:27 2011
*nat
:PREROUTING ACCEPT [5529:468229]
:POSTROUTING ACCEPT [2335:258730]
:OUTPUT ACCEPT [21:1367]
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.8:80
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 22 -j DNAT --to-destination 10.0.0.3:22
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 1723 -j DNAT --to-destination 10.0.0.8:1723
-A PREROUTING -i ppp0 -p udp -m udp --dport 1723 -j DNAT --to-destination 10.0.0.8:1723
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 21 -j DNAT --to-destination 10.0.0.3:21
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 45631 -j DNAT --to-destination 10.0.0.3:45631
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 56630 -j DNAT --to-destination 10.0.0.3:56630
-A PREROUTING -i ppp0 -p udp -m udp --dport 56630 -j DNAT --to-destination 10.0.0.3:56630
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.3:22
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
# Completed on Thu Apr 14 15:58:27 2011
答案1
我不确定我是否明白这一点。通常,如果您有需要内部和外部访问的内部资源,则使用这种设置。您的外部访问是通过端口转发实现的,并且您已确认这可以正常工作。
对于内部访问,您最好使用拆分 DNS。这是一种设置,您的内部 DNS 服务器将解析与公共 DNS 相同的名称,但解析为内部 IP 地址。这可以通过使用单独的 DNS 服务器或具有内部和外部访问单独视图的 DNS 服务器来实现。
这能解决你的问题吗?
答案2
这行不通。原因与数据包如何遍历 netfilter/xtables 表以及路由何时发生有关。
- 数据包进入接口
- 数据包经过 DNAT 处理,而来自 eth0 的数据包不会发生这种情况
- 数据包已路由。在本例中,数据包被路由到 ppp0 接口
- 由于数据包发往路由器,因此由 INPUT 链处理
- 数据包通过 INPUT 链,由 TCP 堆栈处理
- 本地端口 80 未打开;数据包被丢弃
如您所见,DNAT 在事件链中发生得太早了。