我希望我在这里遗漏了一些显而易见的东西。我设置了 NAT 规则,将几个不同的端口转发到内部机器。当请求从互联网传入时,一切都按计划进行。
但是,如果我从网络内部使用相同的端口访问我的外部 IP,则请求将终止于防火墙机器,而不是转发到正确的位置。
我做错了什么吗?生成的 iptables 规则如下。
# Generated by iptables-save v1.4.4 on Wed Sep 7 20:36:37 2011
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:Cid4488E49C.0 - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 10.0.0.11/32 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i lo -m state --state NEW -j ACCEPT
-A INPUT -s XXX.XXX.XXX.XXX/32 -m state --state NEW -j ACCEPT
-A INPUT -s 10.0.0.1/32 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp -m multiport --dports 5050,22,5900 -m state --state NEW -j ACCEPT
-A INPUT -p udp -m udp --dport 67 -m state --state NEW -j ACCEPT
-A INPUT -s 10.0.0.0/24 -m state --state NEW -j ACCEPT
-A INPUT -j DROP
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.0.0.11/32 -p tcp -m tcp --dport 5900 -m state --state NEW -j ACCEPT
-A FORWARD -d 10.0.0.10/32 -p tcp -m tcp --dport 5050 -m state --state NEW -j ACCEPT
-A FORWARD -s 10.0.0.0/24 -m state --state NEW -j ACCEPT
-A FORWARD -j DROP
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -d 10.0.0.11/32 -p tcp -m tcp --sport 22 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -m state --state NEW -j ACCEPT
-A OUTPUT -m state --state NEW -j ACCEPT
-A OUTPUT -p tcp -m tcp -m multiport --dports 5050,22,5900 -m state --state NEW -j Cid4488E49C.0
-A OUTPUT -p udp -m udp --dport 67 -m state --state NEW -j Cid4488E49C.0
-A OUTPUT -d 10.0.0.11/32 -p tcp -m tcp --dport 5900 -m state --state NEW -j ACCEPT
-A OUTPUT -d 10.0.0.10/32 -p tcp -m tcp --dport 5050 -m state --state NEW -j ACCEPT
-A OUTPUT -s 10.0.0.0/24 -m state --state NEW -j ACCEPT
-A OUTPUT -j DROP
-A Cid4488E49C.0 -d XXX.XXX.XXX.XXX/32 -j ACCEPT
-A Cid4488E49C.0 -d 10.0.0.1/32 -j ACCEPT
COMMIT
# Completed on Wed Sep 7 20:36:37 2011
# Generated by iptables-save v1.4.4 on Wed Sep 7 20:36:37 2011
*nat
:PREROUTING ACCEPT [114:15633]
:POSTROUTING ACCEPT [1:48]
:OUTPUT ACCEPT [1:48]
-A PREROUTING -d XXX.XXX.XXX.XXX/32 -p tcp -m tcp --dport 5050 -j DNAT --to-destination 10.0.0.10:5050
-A PREROUTING -d XXX.XXX.XXX.XXX/32 -p tcp -m tcp --dport 5900 -j DNAT --to-destination 10.0.0.11:5900
-A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE
-A OUTPUT -d XXX.XXX.XXX.XXX/32 -p tcp -m tcp --dport 5050 -j DNAT --to-destination 10.0.0.10:5050
-A OUTPUT -d XXX.XXX.XXX.XXX/32 -p tcp -m tcp --dport 5900 -j DNAT --to-destination 10.0.0.11:5900
COMMIT
# Completed on Wed Sep 7 20:36:37 2011
答案1
如果您从 10.0.0.0/24 网络上的另一台计算机连接到 10.0.0.10 服务器,则数据包的路由方式可能存在问题。例如,如果您的源是 10.0.0.99,并且您通过公共 IP 地址连接到 10.0.0.10,则来自 10.0.0.10 服务器的响应数据包将直接发送到 10.0.0.99,而 10.0.0.99 会丢弃这些数据包,因为它与 10.0.0.10 没有半开连接(半开连接是与公共 IP 建立的)。
一种可能的解决方案是双重 NAT。以下是示例:
http://www.fwbuilder.org/4.0/docs/users_guide5/double_nat.html
顺便说一句,获得 fwbuilder 支持的更好地方是 fwbuilder 邮件列表或 SF 上的讨论论坛。
http://sourceforge.net/projects/fwbuilder/forums/forum/16372
https://lists.sourceforge.net/lists/listinfo/fwbuilder-discussion
答案2
如果它对全世界开放,并且您可以通过其内部 IP 访问服务器,那么我认为没有问题。如果您真的想从内部的外部 IP 访问它,那么我会要求查看 NAT 上的错误日志或访问日志的副本。您是否也位于代理或第二个 IP 后面,其中您的引用外部结束引用 iP 与 NAT 的引用外部结束引用 iP 不同?希望我们能解决这个问题。