我的旧 DD-WRT 路由器快要坏了,所以我买了一个 UniFi EdgeRouter,从风格上看,它更像一个“真正的路由器”。我有多个公共 IP,我为它们设置了 1 对 1 NAT,即内部系统的 IP 为 192.168.123.134 ,任何对 173.13.139.236 的外部请求都会被转换到内部 IP 并返回。
使用新路由器,我必须额外设置发夹 NAT 规则,以便内部系统能够通过将其请求转换为内部 IP 来访问 173.13.139.236 ,但来源路由器上的 IP(即伪装 NAT)。
(据我了解,具体问题是,如果你只是对一个数据包进行 NAT,那么从一个内部地址,以便其目的地也是到内部地址,那么答复将直接返回给请求者,但请求者将其数据包发送到路由器,因此当它看到来自非路由器的回复时,它会将该数据包视为无效数据包。)
使用我的 DD-WRT 路由器,我不需要执行发夹 NAT 规则,我不明白为什么。
具体来说,据我所知,我的 DD-WRT 系统上该 IP 的完整配置是:
iptables -t nat -I PREROUTING -d 173.13.139.236 -j DNAT --to 192.168.123.134
iptables -t nat -I POSTROUTING -s 192.168.123.134 -j SNAT --to 173.13.139.236
iptables -I FORWARD -d 192.168.123.134 -j ACCEPT
事实上,这个办法确实奏效了。事实上,这个办法已经奏效多年。为什么呢?
DD-WRT 设置中完全有可能存在其他配置来处理这个问题,但如果有的话,我不知道它会在哪里;我查看了全部的当我更换路由器时,我检查了配置,没有看到与这些 IP 相关的其他内容。
答案1
我认为 DD-WRT 接口使用了术语“互联网 NAT 重定向”用于纠正默认情况下处于活动状态的发夹 NAT 问题,因为它可能“按预期工作”,所以您根本不知道它的存在。
而不是针对特定的 IP 地址(和端口号),这可能在 iptables 中实现,它有一个通用的、不太明显的规则来控制到广域网界面(不一定按其 IP 地址列出)源自您的 LAN 网络/接口或具有类似效果,对于并非源自 WAN 的流量。
思考一下
insmod ipt_mark
insmod xt_mark
iptables -t mangle -A PREROUTING -i ! `get_wanface` -d `nvram get wan_ipaddr` -j MARK --set-mark 0xd001
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
iptables -t nat -A POSTROUTING -m mark --mark 0xd001 -j MASQUERADE
答案2
根据 HBruijn 的回答,以及路由器本身的一些 iptables 转储,我想我找到了它。如果没有 HBruijn 的回答,我不可能找到它,但它没有达到我想要的详细程度,所以我想分享一下。
https://svn.dd-wrt.com/ticket/1868是关于环回中断问题的错误报告,它给出了以下简单命令示例:
iptables -t nat -I POSTROUTING -o br0 -s 192.168.1.0/24 -d 192.168.1.0/24 -j MASQUERADE
许多地方都提到了特定的选项,例如https://forum.dd-wrt.com/phpBB2/viewtopic.php?t=82919&postdays=0&postorder=dsc&start=0:
在您的 webgui 中的“安全”>“防火墙”下
您确定未选中“过滤 WAN NAT 重定向”吗?
这让我https://forum.dd-wrt.com/phpBB2/viewtopic.php?p=643132,其中显示了该选项导致的具体变化,我可以直接在自己的路由器上进行确认。
取消选中“过滤 WAN NAT 重定向”:
root@Basement Router:~# iptables -L -v -n -t nat
Chain PREROUTING (policy ACCEPT 2438 packets, 173K bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT 0 -- * * 0.0.0.0/0 173.13.139.237 to:192.168.123.133
0 0 DNAT 0 -- * * 0.0.0.0/0 173.13.139.236 to:192.168.123.134
0 0 DNAT 0 -- * * 0.0.0.0/0 173.13.139.235 to:192.168.123.132
0 0 DNAT icmp -- * * 0.0.0.0/0 173.13.139.233 to:192.168.123.254
0 0 TRIGGER 0 -- * * 0.0.0.0/0 173.13.139.233 TRIGGER type:dnat match:0 relate:0
Chain POSTROUTING (policy ACCEPT 3 packets, 174 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT 0 -- * * 192.168.123.133 0.0.0.0/0 to:173.13.139.237
0 0 SNAT 0 -- * * 192.168.123.134 0.0.0.0/0 to:173.13.139.236
0 0 SNAT 0 -- * * 192.168.123.132 0.0.0.0/0 to:173.13.139.235
2444 140K SNAT 0 -- * vlan1 0.0.0.0/0 0.0.0.0/0 to:173.13.139.233
0 0 RETURN 0 -- * br0 0.0.0.0/0 0.0.0.0/0 PKTTYPE = broadcast
1 339 MASQUERADE 0 -- * br0 192.168.123.0/24 192.168.123.0/24
Chain OUTPUT (policy ACCEPT 847 packets, 55575 bytes)
pkts bytes target prot opt in out source destination
勾选“过滤 WAN NAT 重定向”后:
root@Basement Router:~# iptables -L -v -n -t nat
Chain PREROUTING (policy ACCEPT 957 packets, 64933 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT 0 -- * * 0.0.0.0/0 173.13.139.237 to:192.168.123.133
0 0 DNAT 0 -- * * 0.0.0.0/0 173.13.139.236 to:192.168.123.134
0 0 DNAT 0 -- * * 0.0.0.0/0 173.13.139.235 to:192.168.123.132
0 0 DNAT icmp -- * * 0.0.0.0/0 173.13.139.233 to:192.168.123.254
0 0 TRIGGER 0 -- * * 0.0.0.0/0 173.13.139.233 TRIGGER type:dnat match:0 relate:0
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT 0 -- * * 192.168.123.133 0.0.0.0/0 to:173.13.139.237
0 0 SNAT 0 -- * * 192.168.123.134 0.0.0.0/0 to:173.13.139.236
0 0 SNAT 0 -- * * 192.168.123.132 0.0.0.0/0 to:173.13.139.235
1025 57947 SNAT 0 -- * vlan1 0.0.0.0/0 0.0.0.0/0 to:173.13.139.233
0 0 DROP 0 -- * br0 192.168.123.0/24 192.168.123.0/24
Chain OUTPUT (policy ACCEPT 348 packets, 22743 bytes)
pkts bytes target prot opt in out source destination
区别在于,如果未经检查则有:
Chain POSTROUTING (policy ACCEPT 3 packets, 174 bytes)
pkts bytes target prot opt in out source destination
1 339 MASQUERADE 0 -- * br0 192.168.123.0/24 192.168.123.0/24
,并对其进行检查,这将成为 DROP 规则。
因此,如果我理解正确的话,在未选中“过滤 WAN NAT 重定向”的情况下(这似乎什么也不做),实际上发生的是,正如大家所说,路由器伪装的默认行为每一个来自任何非 WAN 端口的本地网络连接。
因此,从随机 DHCP 地址(在我的情况下为 192.168.123.10)到我的某个静态 IP(比如 173.13.139.236)的连接将如下所示:
192.168.123.10 -> 173.13.139.236
After PREROUTING: 192.168.123.10 -> 192.168.123.134
After POSTROUTING: 192.168.123.254 [that's the router] on some high port -> 192.168.123.134
然后返回数据包:
192.168.123.134 -> 192.168.123.254/high-port
After ... whatever un-does MASQUERADE: 192.168.123.134 -> 192.168.123.10
After PREROUTING: 173.13.139.236 -> 192.168.123.10