可选的状态列表如下:
-
NEW:这个报文开始新的连接,是连接建立的第一个报文。例如 TCP 连接的第一 个请求报文。
-
ESTABLISHED:连接建立,这个报文关联的连接已经在双方向看到报文。
-
RELATED:这个报文开始新的连接,但是关联到一个已存在的连接上,例如一个 FTP 数据传输或者一个 ICMP 错误。
-
UNTRACKED:这个报文没有连接跟踪,如果你在 raw 表中使用-j CT -notrack 进 行了设置。
-
INVALID:这个报文没有关联到已知的连接。例如收到不属于已有连接的 ICMP 错误信息。
-
可以和任何网络协议一起来使用 iptables 连接跟踪的状态功能,状态功能支持 TCP、 UDP 和 ICMP 协议。下面的例子使用连接跟踪来只转发与已建立连接相关的分组报文,这 种情况通常是禁止转发广域网的直接发起请求报文,这样就可以只用加入一条规则来允许 局域网指定协议可以通过。
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j
ACCEPT
-
iptables 还支持很多扩展模块,例如 connlimit,用于限制并行连接数等。
八、管理防火墙规则
-
iptables 工具提供了管理防火墙规则的功能,以下将介绍增加、删除、查看规则功能 如何使用。
iptables [-t table] {-A|-C|-D} chain rule-specification
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
-
一个防火墙规则包含报文匹配规则和处理目标,处理目标在上面已经讲述,匹配规 则用于检测报文是否符合该规则标准。一般根据报文的 IP 特征进行匹配,典型根据报文 协议、IP 地址和端口进行匹配,在上面已经讲述。
-
-A --append:将防火墙规则增加到所选规则链的末尾。
-
-D --delete:在指定的规则链中删除规则。可以通过指定规则号来删除,也可以通 过规则匹配来删除。规则编号是指规则在规则链中的顺序号,顺序号从 1 开始增加。
-
注意:规则在规则链中的规则编号不是固定的,如果删除前面的规则,则后面的规则 自动往前移动。
-
-I,--insert chain [rulenum] rule-specification:插入到规则链中的指定位置,如果不 指定插入位置,则插入到规则链的第一个位置处。
-
-L,--list [chain]:查看防火墙规则,如果没有指明规则链,则所有的规则链均显 示出来。
-
所有的 iptables 命令,如果没有指定防火墙表就使用默认的 filter 表,所以查看网络地址 转换规则使用 iptables -t nat -n -L,注意经常使用的-n 选项,是为了避免长时间的 DNS 解析。
-
iptables -F 清空所选的规则链中的规则。如果没有指定链,则清空指定表中的所有链 的规则。如果什么都没有指定,就清空默认表所有的链规则。当然也可以一条一条地删除, 但用这个命令会比较方便。例如清空 filter 表中 INPUT 链的规则:
iptables -t filter -F INPUT
-
①默认策略的设置。每一条内置链的策略都是用来处理那些在相应的规则链中没有 被规则匹配的报文。也就是说,如果有一个报文没有被规则集中的任何规则匹配,那默认 策略就会命中,执行默认策略的行为。一般有两种策略行为,默认通过(ACCEPT)和默认丢弃(DROP),在白名单模式会 使用默认丢弃,在黑名单模式下会默认通过。设置命令形式如下:
iptables [-P {chain} {policy}]
例如设置输入链为默认拒绝:iptables -P INPUT DROP
-
②自定义规则链的创建。对于复杂规则,我们通常会创建自定义规则链来进行匹配, 并把自定义规则链加入到已有的规则链中,这样我们在删除及加载时非常方便。自定义规 则链设置命令如下:
iptables -N UDP_FILTER
-
③清空整个防火墙。通常在进行防火墙配置前,需要将以前的规则全部删除,因此 我们清空整个防火墙。
iptables -F
iptables -t nat -F
iptables -t mangle –F
-
④一个典型路由器的配置。如果我们没有使用其他的额外的工具,我们手动进行 配置一个典型路由器防火墙如下图所示。从局域网发起的流量均可以通过,从互联 网发起的主动流量不能通过,从互联网来的被动报文也允许通过,因为这是局域网主机 请求的响应报文。所有局域网的请求转发后均进行网络地址转换,将源地址改为路由器 地址。
-
⑤如果我们需要停止防火墙,我们可以逐条删除规则,也可以直接清空规则,并设置其 默认策略,下图将停止防火墙。
九、其他工具集(iptables-save、iptables-restore)
-
iptables提供了两个很有用的工具用来处理大规则集:iptables-save 和 iptables-restore, 它们把规则存入一个与标准脚本代码只有细微差别的特殊格式的文件中,或从中恢复 规则。
-
一般的 iptables 一次仅执行一条指令,如果对于很大的规则集也采用 iptables 来设置, 那就需要反复在内核和用户空间进行通信,这样将浪费很多的 CPU 时间,而这两个命令 通过一次调用就可以装载和保存整个规则集,这样节省了大量的时间。
-
iptables-save:
导出 iptables 规则到标准输出(即屏幕)中,我们使用 shell 的重定向命令可以将规则写入文件中。内容格式和 iptables 类似但稍有不同,这个格式便于程序解析。
-
iptables-restore:
用于加载导出的防火墙规则,使用标准输入的内容来导入,一般都是 通过 shell 提供的重定向从文件中读取规则之后来向内核导入规则。
十、UCI介绍
-
OpenWrt 使用 Netfilter 来实现报文过滤、网络地址转换和报文修改。UCI 防火墙封装 了 Netfilter 的配置接口,抽象了防火墙系统特征来提供简单的配置模型,适合大多数场景。 UCI 配置还提供了扩展接口,用户自己需要特殊 iptables 命令时也可直接配置
十一、安全域的概念
-
防火墙的核心是防火墙规则,所有的规则在一起就是规则集。这些规则允许或拒绝某 些主机去访问另外一个网络的主机。通过组合这些规则,就可以创建非常复杂的强大规则 集。但是手动维护这些规则集将非常困难,因此 OpenWrt 定义了
安全域(Zone)
的概念, 可以减少管理的负担。
-
UCI 防火墙映射一个或多个接口在一起为一个安全域
,这样可以简化配置模型。安全 域是一个相同规则的区域,一个安全域根据接口来划分,可以包含一个或多个接口。可以 同时定义多个接口的默认规则,以及接口之间的转发规则,还有前两步未覆盖到的其他规 则。安全域也用于配置网络地址转换、端口转发规则、重定向等。
-
安全域必须
映射到一个或多个接口,并最终映射到多个物理接口设备
,因此安全域
不能用于
指定子网和按照 iptables 规则来操作物理设备接口。当接口的子网包含另外一个网 关时,可以用来达到目的地不属于自己的子网网络。通常转发是在局域网和广域网之间的 接口完成,因此使用路由器作为局域网和因特网之间的边缘网关。UCI 的防火墙默认配置 提供了这样的一个共同设置。
典型智能路由器设置为两个安全域,wan-连接互联网,lan连接局域网。
十二、防火墙配置文件(/etc/config/firewall)
-
报文匹配规则:
Netfilter 系统是数据包通过各个规则的链式处理过滤器。第一个规则如果没有匹配, 则继续下一个规则匹配,直到数据报文命中 ACCEPT、DROP 或 REJECT 之一。如果直到 最后一个仍未匹配,默认规则最后生效,具体的规则首先起作用。OpenWrt 的防火墙规则 也是如此,在配置文件中,默认规则在最前面,但最后生效,同级别的规则按照配置文 件顺序先后生效。
-
路由器的最小防火墙配置通常有
一个缺省(defaults)部分
、至少两个安全域(局域网 和广域网)和一个转发——允许数据从局域网到广域网。
-
配置文件:
防火墙配置文件位于 / etc/config/firewall 中。UCI 配置文件没有区分类型,但防火墙模块解析处理过程需要区分 类型,因此配置文件的配置项需要填入指定类型的值,主要有字符串、布尔值、整型值、 MAC 地址和 IP 地址等类型。
Defaults配置节
-
Defaults 配置节定义了不属于特定区域的全局防火墙设置。配置类型为“defaults”。
-
下标所示的是这个配置节的主要定义选项。
Zones-安全域配置节
-
一个安全域根据接口来划分,可以包含一个或多个接口,在源和目的地之间进行转发、 生成规则和重定向。输出的流量伪装是每一个安全域的基础控制。注意伪装是对即将报文 离开的接口进行定义,是将报文的源 IP 地址转换为路由器的出口 IP 地址
-
INPUT 规则用于匹配流量从这个安全域的接口到达路由器本身,即目的地址为路由器 IP 地址的流量
-
OUTPUT 规则用于处理从路由器自己产生的报文并通过安全域的接口, 即作用于源地址为路由器地址的报文
-
FORWARD 规则用于处理从一个安全域到另外一个 安全域的报文,即经过路由器来转发的报文
-
安全域的配置节类型为“zone”,其主要选项在下标有详细描述
转发配置节(forwarding)
-
转发部分控制安全域之间的数据流量,可以使 MSS(最大分片大小)为特定的方向。
-
一个转发规则仅代表一个方向。允许两个区域之间的双向流量,这需要两个转发规则,src 和 dest 部分颠倒过来即可,转发配置节的类型为“forwarding”。
-
iptables 规则生成该部分依靠需要连接跟踪工作来生成状态匹配。在 src 和 dest 安全域 至少需要有一个连接跟踪通过 MASQ 或连接跟踪选项启用。如果没有启用连接跟踪机制,那 报文只能单向通过,返回的报文将被拒绝。
-
主要选项在下标中描述:
-
例如:下面表示允许局域网到广域网的报文转发。
重定向配置节(redirect)
-
目的地址转换(DNAT)定义在重定向配置节。在指定源安全域的所有进入的报文如 果匹配给定的规则将重定向到指定的内部主机上。
-
重定向也叫“端口转发”或“端口映射”。端口访问可以以“start:stop”来指定,例如 8080:8090,语法和 iptables 类似。技术上来说,端口映射是目的地址转换的另一个术语, 报文发送到防火墙并被转换为一个新的目的地址,这个处理过程完全由防火墙自动完成。 对于设置这个规则,需要新老目的地址,并且可以选择源地址或者其他约束条件进行匹配。
-
配置选项在下表详细描述。
-
下图将转发从 wan 接口的 HTTP 请求报文到 IP 地址为 192.168.1.100、端口为 80 的 Web 服务器上,没有指定转换后端口号,那就是目的端口不变。
规则(rule)
-
规则(rule)用于定义基本的接受或拒绝规则来允许或限制你访问指定主机或端口。 真正的防火墙规则在这里进行设置。
-
端口范围使用 start:stop,例如 8080:8090。这和 iptables 的语法完全一致。规则的配置 类型为“rule”,防火墙规则中如果指定了时间,则需要路由器的时间准确,否则和自己的 期望将完全不同。
-
规则定义如下:
-
如果 src 和 dest 均指定,规则作用于转发流量。
-
如果仅指定了 src,规则匹配流入本机的流量,即目的地址为防火墙的报文。
-
如果仅指定了 dest,规则匹配本机作为源地址的流量。
-
如果 src 和 dest 均没有给出,则默认作用于本机作为源地址的流量。
-
具体的配置选项在下表中详细描述。
-
默认的防火墙配置是接受所有的局域网流量,但是阻断所有的 WAN 入口主动流量, 除了当前 NAT 或连接的被动流量。如果要打开服务的端口,可以像下图一样增加规 则。下图配置将允许互联网上的主机通过 SSH 协议访问路由器。
-
下图用于阻止局域网主机到广域网主机 121.42.62.172 的全部连接。源主机将 收到目标端口不可达的 ICMP 消息。这就是把这个 IP 地址加入了访问黑名单,不允许 访问。
-
下图用于创建一个输出规则,阻止从路由器ping IP 为 8.8.8.8 的主机。这个规则没有src字段,因此仅匹配从路由器发出的报文。
-
下图用于限制从局域网到广域网的目的端口为 1024~65535 的报文转发。
include配置节
-
include 用于包含自定义的防火墙规则。在防火墙配置中可以指定一条或多条 include配置节。
-
类型为“include”,仅有一个必须的参数是包含的文件路径,所有的可选参数如下表所示。
-
包括类型的脚本可以包含任意的命令,例如高级的 iptables 规则或流量整形所需的 tc 命令。由于自定义 iptables 规则要比一般的更具体,所以必须确保使用“-I”来插入而不是 一个“-A”来附加到最后,这样自定义规则将出现在默认规则的前面。
十三、常见用法
MAC 地址黑白名单
-
MAC 地址过滤是家用路由器的一个常见功能,它可以防止未授权的 MAC 地址访问路 由器和通过路由器访问网络。例如网络上有恶意用户,可以通过 MAC 地址限制指定恶意 用户主机连接到路由器,即使他拥有路由器的密码。
-
OpenWrt 没有单独的 MAC 接入控制模块,但可以通过设置防火墙规则来实现。MAC 地址是计算机网卡的物理地址,它就像是网卡的身份证,在网络中进行通信时对网卡的 识别都是通过这个地址进行的。通常一个计算机仅有一个网卡,那这个网卡就可以代表 这个计算机,限制这个 MAC 地址即可控制计算机能否接入网络,从而有效控制了网络用户的上网权限。
-
通常有两种方式来控制:白名单和黑名单
-
黑名单是指在名单内的设备不能接入网络。例如小孩的计算机不能访问。
-
白名单是指名单内的设备可以接入网络,其他设备均不能访问。
-
下图用于阻止指定客户端连接到因特网,第一个规则禁止黑名单访问网络, 第二个规则阻止从客户端连接路由器。这样该机器就不能通过该 OpenWrt 路由器访问 任何资源。
-
如果以自定义规则来实现黑名单,则使用如下 4 条规则进行设置:第一行首先定义了自定义链 MAC_FILTER,然后紧接着将 IPNUT 链的报文转到 MAC_FILTER,由它将匹配目标地址为路由器 IP 的报文。第三行规则将 FORWARD 链转 到 MAC_FILTER 自定义链中,这个将匹配经过路由器转发的流量。最后一个规则将源 MAC 地址的规则加入到 MAC_FILTER 链中。通常防火墙是默认允许局域网报文通过的, 因此可以仅设置拒绝通过的 MAC 即可。
-
例如,某企业想要保证仅授权用户可以连接 Wi-Fi。因为通常 Wi-Fi 的连接密码只有一个,如果多个人访问,经常会导致密码透露给非授权用户。白名单技术就在这时派上用 场,将授权用户的 MAC 地址增加到防火墙中,这样即使 Wi-Fi 连接密码泄露,非授权用 户也不能通过无线路由器访问网络。如果要设置白名单模式,则需要在规则的最后增加一 个默认拒绝规则。
-
OpenWrt 没有专门的家长控制模块,我们可以在防火墙功能中实现设置。例如, 禁止小孩在周一到周五上网,通过设置小孩专用的计算机 MAC 来禁止访问任何网络。
-
下图用于禁止指定 MAC 周一到周五将报文转发到互联网,weekdays 用来表示一 周中的第几天。
-
在企业也是同样的情况,有些公司在工作的时间会禁止使用互联网,或者是根据公司 管理策略仅能访问一些授权的网站。这些策略最难的部分在于管理政策中哪些允许哪些不 允许,这通常很难做出决定。在技术上使用防火墙来实现,UCI 配置只能从 IP 层进行限 制,因此如果限制访问域名,需要转换为 IP 地址。
-
下图所示的配置实现了周一到周五的工作时间内禁止局域网用户访问网络,并允 许来自你自己 MAC 主机的网络访问。
十四、防火墙管理
-
OpenWrt 12.09 的防火墙模块脚本目录为 /lib/firewall,管理脚本为/bin/fw:
-
在配置修改之后,通过执行/etc/init.d/firewall restart 生效;调用/etc/init.d/firewall stop 将删除所有自定义的规则,并设置所有标准的规则链为接受(ACCEPT)。手动启动防火墙 执行/etc/init.d/firewall start。
①永久停用防火墙
-
防火墙可以通过执行/etc/init.d/firewall disable 永久禁用,需要 重启生效。注意:禁用不会删除已生效的规则。使用 enable 可重新激活使用防火墙。
②停用防火墙
-
运行/etc/init.d/firewall stop 以删除所有规则和设置默认策略为接受。 重启防火墙,运行/ etc/init.d/firewall start。
③删除规则
-
如果你增加了一个错误的规则,你可以通过以下方式删除。首先,错 误的命令规则可以通过以下命令找出索引:
-
现在进行删除。例如删除 OUTPUT 链的第三条规则,可执行以下命令:
④调试产生的规则集
-
观察通过防火墙程序产生的 iptables 命令是非常有用的,跟 踪防火墙重启的 iptables 错误,或者验证特定 UCI 配置规则的结果及作用。
-
为了看到执行过程中的规则,运行 fw 命令之前将 FW_TRACE 环境变量设置为 1。 FW_TRACE 变量使用在/lib/firewall/fw.sh 中,判断是否定义,如果已经定义,将输出执行 的每条规则:
-
将执行输出重定向到一个文件中供以后分析,使用以下命令:
-
在 OpenWrt 15.05 版本中防火墙使用 C 语言来重新实现,编译安装后为 fw3,使用“-d” 选项来进行输出 iptables 命令。
-
还有另外一个命令也支持输出防火墙规则:
十五、测试防火墙
-
防火墙规则配置越多,它就越复杂。在正式使用之前,首先需要对配置进行测试。在 配置修改完成后,需要调用以下命令来重启防火墙:
-
对于目标进行测试可以有非常方便的目标地址测试,但是如果有黑名单或者时间 控制,就比较麻烦。测试时间需要你改变路由器系统时间进行测试,或者等待足够长的 时间。
-
对于网络是否正常,可以使用 ping 命令进行进行测试。对于端口是否开放,可以用 NetCat 工具进行验证,NetCat 请参考在“测试工具”中描述的技术。
十六、附加
-
我是小董,V公众点击"笔记白嫖"解锁更多OpenWrt资料内容。