关于Tomato路由器iptables规则的解析与迁移疑问
关于Tomato路由器iptables规则的解析与迁移疑问
嗨,我来帮你逐一拆解这些从Tomato路由器导出的iptables规则,验证你的理解是否正确,同时把你搞不懂的部分讲明白~
一、*mangle表规则解析
*mangle -I PREROUTING -i vlan2 -j DSCP --set-dscp 0 -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu COMMIT
- 你的理解:第一条是重写DSCP位,不知道作用 → 完全正确,这条的作用是清空外网接口(vlan2) incoming数据包的DSCP标记。DSCP是用来做QoS(流量优先级)的,外网过来的包可能带有运营商或上游设备的DSCP标记,如果直接带进内网,会干扰你自己配置的内网QoS策略,清零后就能让内网的QoS规则完全生效。
- 第二条规则你完全不懂 → 这是TCP网络中非常实用的MSS调整规则:
不同网络的MTU(最大传输单元)可能不一样(比如外网PPPoE链路MTU通常是1492,而内网是1500),如果内网主机发起TCP连接时的MSS(最大分段大小)值超过了外网链路的MTU,数据包会被迫分片,甚至直接丢包导致连接失败。这条规则会自动把SYN包的MSS值 clamp(限制)到路径MTU减去IP+TCP头的大小(通常是40字节),确保数据包不用分片就能正常传输,避免跨MTU网络的连接问题。
二、*nat表规则解析
*nat -A PREROUTING -d 67.162.98.230 -j WANPREROUTING -A PREROUTING -i vlan2 -d 192.168.1.1/255.255.255.0 -j DROP -A WANPREROUTING -p icmp -j DNAT --to-destination 192.168.1.1 -A WANPREROUTING -p tcp --dport 4662 -j DNAT --to-destination 192.168.1.12:4662 ...(其他端口转发规则省略) -A POSTROUTING -o vlan2 -j MASQUERADE -A POSTROUTING -o br0 -s 192.168.1.1/255.255.255.0 -d 192.168.1.1/255.255.255.0 -j SNAT --to-source 192.168.1.1 COMMIT
- 你的理解基本都对:
- 第2-3行:把指向公网IP的流量跳转到WANPREROUTING链,同时丢弃外网接口进来的、目的是内网网段的数据包(防止外网恶意扫描内网IP);
- 后续的WANPREROUTING规则就是典型的端口转发(DNAT),把外网特定端口的流量转发到内网对应设备;
MASQUERADE就是动态SNAT,替内网设备做地址转换,让它们能通过公网IP访问外网,这是路由器NAT的核心规则。
- 你疑惑的最后一条规则:
这条是处理内网同网段设备之间通过路由器转发流量的场景(比如有些内网设备默认把所有流量都发往网关,即使访问同网段设备也不走直接链路)。它会把这类数据包的源IP改成路由器的内网IP(192.168.1.1),这样被访问的内网设备看到的请求源是路由器,而非发起设备的IP。Tomato加这条主要是为了兼容一些特殊内网应用,或者避免同网段转发时的ARP/路由异常。
三、*filter表规则解析
*filter 1 -A INPUT -m state --state INVALID -j DROP 2 -A INPUT -i lo -j ACCEPT 3 -A INPUT -i br0 -j ACCEPT 4 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 5 -A FORWARD -i br0 -o br0 -j ACCEPT 6 -A FORWARD -m state --state INVALID -j DROP 7 -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT 12 -A FORWARD -i vlan2 -j wanin 13 -A FORWARD -i br0 -j ACCEPT 14 -A wanin -p tcp -m tcp -d 192.168.1.12 --dport 4662 -j ACCEPT ...(其他wanin规则省略)
- 你的1-4行理解正确:丢弃无效状态的入站包,放行回环接口、内网接口的所有入站包,以及已建立/相关连接的回应包。
- 5-7行的解析:
- 第5行
-A FORWARD -i br0 -o br0 -j ACCEPT:br0是Tomato的内网桥接接口(通常包含有线LAN和无线WiFi),这条是允许同一个桥接接口内的数据包转发,也就是内网设备之间的通信(比如有线电脑和无线手机互传文件),保证内网互通不受限。 - 第6-7行和INPUT链逻辑一致:丢弃无效的转发包,放行已建立/相关连接的转发包(比如内网设备访问外网后的回应包)。
- 第5行
- 12-18行的解析:
- 你的理解没错,12行把外网接口进来的转发包跳转到wanin链,14-18行则是放行那些已经做了DNAT的端口流量(因为nat表做了地址转换后,filter表需要允许这些流量才能真正到达内网设备);
- 第13行
-A FORWARD -i br0 -j ACCEPT:这条是允许所有从内网接口进来的转发流量,也就是内网设备主动访问外网的请求全部放行,这是路由器默认的“内网出外网不受限”规则。
整体来看,你的大部分理解都是正确的,这些规则是Tomato路由器的标准防火墙+NAT配置,迁移到Linux路由器上基本可以直接用,只需要根据你的实际网卡名称(比如把vlan2/br0换成你的外网/内网接口名)调整即可~
备注:内容来源于stack exchange,提问作者Cattus
相关产品推荐
相关产品推荐

