如何理解 OpenWrt 中的 iptables 链配置

如何理解 OpenWrt 中的 iptables 链配置

这是关于如何理解链条iptables可以在运行 OpenWrt(用于路由器设备的精简 Linux)的典型家庭路由器的默认配置中找到,但最终可能并不特定于该特定系统。

这里我们重点关注INPUT主链,忽略FORWARDOUTPUT来自同一个桌子,以及表中的PREROUTING和。POSTROUTINGnat

做一个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

正如您所看到的,我剪断了 和 引用的链FORWARDOUTPUT以便专注于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

但是,有两条规则分支成两条链,称为inputinput_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?另一种可能是接受数据包,但这让我想知道……的策略INPUTACCEPT,那么为什么要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内置链引用。只是为了完整性,并看到它们似乎具有类似的构造。INPUTnet

# 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 的输入,将拒绝不匹配的流量

相关内容