尝试理解番茄路由器上的 iptables 规则

尝试理解番茄路由器上的 iptables 规则

我正在将一台 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 的接口),那么数据包将命中表中的规则 #9 natMASQUERADE

下面是数据包如何穿过 netfilter 框架的流程图:

https://en.wikipedia.org/wiki/Netfilter#/media/File:Netfilter-packet-flow.svg

iptables(和ip6tables)实现绿色标题的流程框。

相关内容