这是关于如何理解链条iptables
可以在运行 OpenWrt(用于路由器设备的精简 Linux)的典型家庭路由器的默认配置中找到,但最终可能并不特定于该特定系统。
这里我们重点关注INPUT
主链,忽略FORWARD
和OUTPUT
来自同一个桌子,以及表中的PREROUTING
和。POSTROUTING
nat
做一个iptables -L -t filter
展示了大量的规则。我重新排列了下面的输出,以使其不那么令人生畏,并试图找出妨碍我理解的部分。
表中有三个内置链filter
,它们出现在输出的顶部。(我之所以特别指出,-v
是因为我发现它不那么混乱.)
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1260 133K ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
8 544 ACCEPT all -- lo any anywhere anywhere
787 41632 syn_flood tcp -- any any anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN
13012 1249K input_rule all -- any any anywhere anywhere
13012 1249K input all -- any any anywhere anywhere
Chain FORWARD … # not considering this chain here
Chain OUTPUT … # not considering either
正如您所看到的,我剪断了 和 引用的链FORWARD
,OUTPUT
以便专注于INPUT
. (我可以选择其他两个中的任何一个,因为它们是以类似的方式构建的。)
INPUT
有一个策略ACCEPT
,它指定了五个规则。前三个对我来说很清楚。首先,接受“既定”或“相关”的东西。 (例如,接受我发出的 HTTP 或 DNS 请求的响应。)几秒钟后,接受发送到环回设备 ( 127.0.0.1
) 的所有内容。 (这可能只来自本地主机本身,我确实希望它能够工作。否则就没有意义。)第三,有一个 synflood 保护。 (这可以防止某种攻击。)
Chain syn_flood (1 references)
pkts bytes target prot opt in out source destination
787 41632 RETURN tcp -- any any anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN limit: avg 25/sec burst 50
0 0 DROP all -- any any anywhere anywhere
但是,有两条规则分支成两条链,称为input
和input_rule
,问题是,为什么有两条规则,以及您应该使用哪一条做什么?
让我们深入了解这些规则的跳转堆栈。
Chain input_rule (1 references)
pkts bytes target prot opt in out source destination
这里还什么都没有。这是为了让我添加规则。但什么样的规则呢?
Chain input (1 references)
pkts bytes target prot opt in out source destination
6315 482K zone_lan all -- br-lan any anywhere anywhere
6697 767K zone_wan all -- pppoe-wan any anywhere anywhere
好吧,这个确实有东西,可以进一步跳转到 LAN 和 WAN,这对于家庭路由器来说很有意义。
Chain zone_lan (1 references)
pkts bytes target prot opt in out source destination
6315 482K input_lan all -- any any anywhere anywhere
6315 482K zone_lan_ACCEPT all -- any any anywhere anywhere
Chain zone_wan (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT udp -- any any anywhere anywhere udp dpt:bootpc
0 0 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
6697 767K input_wan all -- any any anywhere anywhere
6697 767K zone_wan_REJECT all -- any any anywhere anywhere
正如您所看到的,这些规则中的每一个都会进一步向下跳转到更多用户定义的规则。
Chain input_lan (1 references)
pkts bytes target prot opt in out source destination
Chain zone_lan_ACCEPT (2 references)
pkts bytes target prot opt in out source destination
4 1322 ACCEPT all -- any br-lan anywhere anywhere
6315 482K ACCEPT all -- br-lan any anywhere anywhere
目的是什么input_lan
?另一种可能是接受数据包,但这让我想知道……的策略INPUT
是ACCEPT
,那么为什么要ACCEPT
在这里重复呢?
现在,从 WAN 输入。如果向上滚动,您可以看到一些 UDP 和 ICMP 内容被接受。这适用于 DHCP,并且基本上适用于ping
.这已经很清楚了。不太清楚的是,遵循这些规则的部分空的东西:
Chain input_wan (1 references)
pkts bytes target prot opt in out source destination
与 相同的问题input_lan
。
Chain zone_wan_REJECT (2 references)
pkts bytes target prot opt in out source destination
0 0 reject all -- any pppoe-wan anywhere anywhere
6697 767K reject all -- pppoe-wan any anywhere anywhere
好的,这是来自 WAN 的输入(未建立或相关),是的,我们可能想要拒绝它,现在这里有两种拒绝,一种为 TCP 连接尝试关闭套接字 ( tcp-reset
),另一种通过 ICMPicmp-port-unreachable
对 ICMP 消息的回复 ( )(思考ping
)。
Chain reject (5 references)
pkts bytes target prot opt in out source destination
595 31817 REJECT tcp -- any any anywhere anywhere reject-with tcp-reset
4858 582K REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
最后一个是包罗万象的。所以这里什么都不会被接受。
最后,这是表中找到的其他链的列表,这些链未从表中的filter
内置链引用。只是为了完整性,并看到它们似乎具有类似的构造。INPUT
net
# other chains, not reached from the INPUT chain, so truncated and moved here
Chain forward (1 references)
Chain forwarding_lan (1 references)
Chain forwarding_rule (1 references)
Chain forwarding_wan (1 references)
Chain nat_reflection_fwd (1 references)
Chain output (1 references)
Chain output_rule (1 references)
Chain reject (5 references)
Chain zone_lan_DROP (0 references)
Chain zone_lan_REJECT (1 references)
Chain zone_lan_forward (1 references)
Chain zone_wan_ACCEPT (2 references)
Chain zone_wan_DROP (0 references)
Chain zone_wan_forward (1 references)
那么,好吧。抱歉发这么长的帖子。一路上有几个问题。我不知道如何以更简单或更简短的方式表达它。这种iptables
配置并不容易掌握,因为到处都存在不清楚的细节。希望您能澄清这一点并解释其基本原理。感谢您的关注。
答案1
这是一个明确的关注点分离。 WAN 的访问规则应与 LAN 的访问规则不同。
默认配置不为您的网络上不一定提供的服务提供接受规则。通常,大多数用户不应向 Internet 提供任何服务。将适当的规则添加到适当的规则集中将启用服务。 OpenWrt Web 界面应通过下拉菜单提供帮助。
这Shorewall 基本二接口防火墙文档应该让您很好地理解正在发生的事情和应该发生的事情。可以用 Shorewall-lite 防火墙替换 OpenWrt 防火墙,但对于基本防火墙,现有防火墙就可以了。有些软件包会假设它们正在使用默认防火墙,如果没有,则需要一些工作。
答案2
我写正是用于此任务的工具。当输出被应用时,它会将iptables -S
输出重新格式化为链树。
通过分析其输出,我推断_rule
链是用于手动添加规则的。
该工具对于规则诊断也很有用:如果您重置规则计数器,进行网络测试,然后向其提供数据包计数器的输出,您将能够看到测试流量在树中的走向。
答案3
据我所知,防火墙是由openwrt上的一些更高级别的配置文件生成的。由于需要支持许多不同的可能性,因此实际生成的规则并未优化,因此可能包含不必要的/未使用的/空链。参见 OpenWRT 的维基文章更多细节。
回答您的一些问题
为什么“input_rule”为空
正如您所提到的,它可能是用户可以轻松插入自定义规则的地方。另一种可能性是“input”最初是“input_rule”,并且仍然创建“input_rule”是为了向后兼容旧脚本。
input_lan/input_wan 的用途是什么?
在那里,您可以阻止从 LAN 上的内部主机到路由器的流量(例如保护其配置接口)或启用来自外部的访问。
INPUT 的默认值是 ACCEPT,那么为什么这里要重复 ACCEPT 呢?
正如您正确注意到的那样,这里没有必要这样做。但由于 zone_lan_REJECT 存在,看起来脚本想要独立于策略。
答案4
其实openwrt的iptables规则组织得很好。
以delegate_input为例(其他链也有类似的结构):
- 两个接受:接受 lo 和 tcp RELATED,ESTABLISHED 流量
- syn_flood:丢弃 syn 洪水流量
- input_rule:处理来自 lan 和 wan 流量的输入
- zone_lan:仅处理来自 lan 的输入,将接受不匹配的流量
- zone_wan:仅处理来自 wan 的输入,将拒绝不匹配的流量