我有一个用作 NAT(SNAT 和 DNAT)的 DSL 路由器。我在内部网络(10.0.0.2,端口 43201)上设置了一个服务器。DSL 路由器配置为将所有传入连接“端口转发”(或 DNAT)到 10.0.0.2:43201。
我在 DSL 路由器上创建了一个用于端口转发的虚拟服务器。我还添加了以下用于端口转发的 iptables 规则。
iptables -t nat -A PREROUTING -p tcp -i ppp_0_1_32_1 --dport 43201 -j DNAT --to-destination 10.0.0.2:43201
iptables -I FORWARD 1 -p tcp -m state --state NEW,ESTABLISHED,RELATED -d 10.0.0.2 --dport 43201 -j ACCEPT
# ppp_0_1_32_1 is routers external interface.
# routers internal IP address is 10.0.0.1 and server is setup at 10.0.0.2:43201
问题是来自外部 IP 地址的连接能够使用外部 IP 地址访问内部服务器,但内部客户端(在 NAT 下)无法使用外部 IP 地址访问服务器。
Example: http://<external_address>:43201 is working from external clients
But, internal clients are not able to access using http://<external_address>:43201
这似乎与http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-10.html(NAT 如何将目标 NAT 到同一网络)。
首先,我不明白为什么这对内部客户端来说是个问题?其次,哪些 iptables 规则将允许内部客户端使用外部 IP 地址访问服务器?请提出建议。
答案1
这是因为,如果您的内部客户端尝试使用公共 IP 与服务器(在同一子网内)通信,则必须通过网关(NAT 盒)发送请求。然后,网关将执行DNAT
从公共 IP 到服务器私有 IP 的转换,然后转发。
在正常情况下,Web 服务器将接收来自内部客户端 IP 地址(同一子网)的请求。因此,它将直接发回回复,而无需通过网关。客户端将拒绝处理回复,因为它正在发送到公共 IP 并从另一个(私有)IP 接收响应。这很令人困惑。不是吗?
一种解决方案是使用来自内部客户端的私有 IP 与服务器通信。这可以通过实施 DNS 拆分(内部和外部视图)来隐藏。
另一种选择是强制流量(来自/到服务器)通过网关(NAT 盒)。
答案2
不仅是相似的对于链接中描述的问题完全相同的解决链接中描述的问题。要么按照 Khaled 所述执行水平分割 DNS,要么像这样添加 SNAT(如该链接所述):
iptables -t nat -A POSTROUTING -d 1.2.3.4 -s 10.0.0.0/24 \
-p tcp --dport 43201 -j SNAT --to 10.0.0.2
我假设外部 IP 是 1.2.3.4,内部子网是 /24。