![尝试理解番茄路由器上的 iptables 规则](https://linux22.com/image/792964/%E5%B0%9D%E8%AF%95%E7%90%86%E8%A7%A3%E7%95%AA%E8%8C%84%E8%B7%AF%E7%94%B1%E5%99%A8%E4%B8%8A%E7%9A%84%20iptables%20%E8%A7%84%E5%88%99.png)
我正在将一台 Linux 机器配置为路由器,我从 Tomato 路由器中获取了 /etc/iptables 文件。我想使用此文件作为 Linux 机器上防火墙规则的起点。
那里有很多我认为我理解的东西,但有些东西我完全不知道,希望能得到一些帮助。“vlan2”是外部接口,“br0”是内部接口。
该文件的第一部分是
*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
第一行重写了 IP 标头中 TOS 八进制中的 DSCP 位,我不确定为什么。第二行我完全不明白。
下一节是
*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 WANPREROUTING -p udp --dport 4665 -j DNAT --to-destination 192.168.1.12:4665
-A WANPREROUTING -p udp --dport 4672 -j DNAT --to-destination 192.168.1.12:4672
-A WANPREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.1.12:22
-A WANPREROUTING -p udp --dport 1195 -j DNAT --to-destination 192.168.1.12:1195
-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 行设置 WANPREROUTING 目标,用于接收任何进入外部接口的数据,但目的地为专用网络的数据包除外,这些数据包会被丢弃。接下来几行设置用于端口转发的某些端口和协议的目标。MASQUERADE 行设置 NAT。我不确定 COMMIT 之前的最后一行是做什么的。
我会将最后一节分成几个部分,并在规则前面插入行号。
*filter
1 -A INPUT -m state --state INVALID -j DROP
2 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
3 -A INPUT -i lo -j ACCEPT
4 -A INPUT -i br0 -j ACCEPT
行 1、2 丢弃状态无效的传入数据包(到任何接口)并接受来自已建立连接的数据包。行 3、4 接受进入环回和内部接口的所有数据包。
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
真的不确定上面三行的作用,尤其是第一行(数据包从 br0 转发到 br0?)
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
15 -A wanin -p udp -m udp -d 192.168.1.12 --dport 4665 -j ACCEPT
16 -A wanin -p udp -m udp -d 192.168.1.12 --dport 4672 -j ACCEPT
17 -A wanin -p tcp -m tcp -d 192.168.1.12 --dport 22 -j ACCEPT
18 -A wanin -p udp -m udp -d 192.168.1.12 --dport 1195 -j ACCEPT
第 12、14-18 行处理端口转发。不确定第 13 行,它是否意味着接受通过 br0 接口路由的所有内容?
您能否评论一下我上述的假设是否正确,并解释一下我无法理解的规则。感谢您的阅读。
答案1
让我们逐一进行分析。
-I PREROUTING -i vlan2 -j DSCP --set-dscp 0
这是路由器试图通过将所有类设置为 0 来使所有流量(我认为是从 WAN 传入的)“公平”
-I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
这里有一篇很好的文章:https://www.frozentux.net/iptables-tutorial/chunkyhtml/x4721.html
去引用:
这是为了克服一些 ISP 和服务器阻止 ICMP 碎片化数据包的问题,这可能会导致非常奇怪的问题
-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
这看起来像是自动生成配置的产物,特别是因为原始源地址和 SNAT 后的源地址完全相同。您应该可以删除它。
5 -A FORWARD -i br0 -o br0 -j ACCEPT
br0
是“桥接设备”,即“绑定”多个端口的虚拟设备,使路由器充当交换机。两个设备连接到不同的物理端口,但同一个“桥接设备”需要这条线路才能够互相沟通。该规则实际上并不是必需的,因为规则#13是该规则的超集。
1 -A INPUT -m state --state INVALID -j DROP 2 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 6 -A FORWARD -m state --state INVALID -j DROP 7 -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
第 6 行和第 7 行与第 1 行和第 2 行相同,只是第 6 行和第 7 行处理将被转发的数据包的情况(而不是目标地址是路由器本身的数据包)。
这是必要的,因为数据包将击中任何一个
INPUT
连锁,链条或者链FORWARD
,因此需要有某种重复。
13 -A FORWARD -i br0 -j ACCEPT
链式
FORWARD
传输发生在输出路由之前。这条规则意味着全部进入(虚拟)接口的数据包br0
将被允许启动输出路由过程。如果输出路由决定数据包应通过接口转发
vlan2
(我假设是面向 WAN 的接口),那么数据包将命中表中的规则 #9nat
,MASQUERADE
下面是数据包如何穿过 netfilter 框架的流程图:
https://en.wikipedia.org/wiki/Netfilter#/media/File:Netfilter-packet-flow.svg
iptables
(和ip6tables
)实现绿色标题的流程框。