防火墙概述
OpenWrt 使用 firewall3 ( fw3
) netfilter/iptable 规则构建器应用程序。它在用户空间中运行,将配置文件解析为一组iptables
规则,将每个规则发送到内核 netfilter 模块。
fw3目的
对于典型的路由器,netfilter 规则集可能非常复杂。这是必然的;每个规则都针对路由器提供的离散功能进行定制,以保护其支持的网络,提供 NAT以节省稀缺的IPv4 地址。一个典型的路由器有超过 100 条旨在支持数据包路由的规则。
OpenWRT 使用 fw3 应用程序来“安全地”构建规则集,同时隐藏许多细节。
使用 fw3 print
来显示 netfilter 规则,您将看到许多没在 fw3 配置文件中明确定义的规则,要么更难以理解,netfilter 规则包括:
- A number of chains (mis-termed
_rule
) for each special target and zone - INPUT and OUTPUT for the often forgotten loopback interface
- The
option syn_flood 1
oroption mtu_fix 1
each translate to complex iptable rules - The
option masq 1
translates to the ‘-j MASQUERADE’ target for NAT -
mangle
rules that match bits in the packets TCP header and then modify the packet
fw3 配置相当简单,并自动为路由器提供基本规则集和可理解的附加规则配置文件。
由于 netfilter 的严格性质,netfilter 使用的规则相当难以理解。但是,每条规则都提供所需的功能或阻止恶意功能,因此是必要的。
fw3 描述
fw3 是一个用户空间应用程序,本质上类似于 iptables 应用程序。
两者都使用该libiptc
库与 netfilter 内核模块通信,并遵循相同的基本模式:
-
iptc_init
建立套接字,并使用getsockopt
将 netfilter 表读入应用程序。这是基于每个表(filter
默认情况下)。 - 修改表中的chains, rules等。所有的解析和错误检查都是在用户空间中完成的(基于
libiptc
)。 -
iptc_commit
替换内核中的表。
fw3过程控制
fw3
通常通过调用 shell 脚本来管理/etc/init.d/firewall
。shell 脚本接受以下参数集:
-
boot
:这是在系统初始化(启动)期间调用的 -
start
: 解析配置文件并写入 netfilter 内核模块 -
stop
:从内核模块刷新配置规则(它们不会被卸载) -
restart
,reload
: 从内核读取 netfilter 规则,使用配置文件替换,并写回 netfilter 内核模块。 -
flush
:(危险)删除所有规则,删除非默认链,并将默认策略重置为ACCEPT
。
在幕后,/etc/init.d/firewall
调用 fw3,将参数传递给二进制文件(fw3)。在某些情况下,该参数将伴随附加标志以抑制日志消息,或调用上述内部函数以验证配置文件。
调用stop
时,只会删除配置文件中的规则。那些由fw3
自动生成的规则将被保留。
如果通过调用flush
刷新所有规则,则默认策略设置为ACCEPT
并且路由器会将所有数据包传递到或转发到目标网络,不提供任何安全性。