为什么我的 DD-WRT 设置不需要发夹 NAT?

为什么我的 DD-WRT 设置不需要发夹 NAT?

我的旧 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

来源:https://forum.dd-wrt.com/phpBB2/viewtopic.php?p=545301

答案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

相关内容