openwrt的防火墙工具iptables。这个iptables很是有趣,如果详细地添加各种规则(rule),那将可以构造一个强大的防火墙。这里简单记录一下iptables的一些基础。
netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换,包重构(修改)和数据跟踪处理。常处理的是filter表、nat表、mangle表。每个表下都有链,链其实是数据包传播的路径,每一条链包含一条或数条规则,数据包进入某一条链时会逐一检查是否满足,若满足就会按那一条规则进行处理,否则继续检查,检查完毕后,如果不满足任何一条规则,则会跳出这一条链进行上一层的检查,最终直到正确匹配或找不到相应规则而使用默认策略(policy)为止。默认的,filter表有INPUT链、FORWARD链、OUTPUT链;nat表有PREROUTING链、OUTPUT链、POSTROUTING链;mangle表有PREROUTING链、INPUT链、FORWARD链、OUTPUT链、POSTROUTING链。
PREROUTING链处理路由判断前的包规则匹配
INPUT链处理进入本机的包规则匹配
FORWARD链处理需要转发的包规则匹配
OUTPUT链处理流出本机的包规则匹配
POSTROUTING链处理路由判断后的规则匹配
数据包的流向如下(鸟哥的图):
黑色的线表示的是以本机为目的地进入本机的数据包的流向,蓝色的线表示的是以本机为源头流出本机的数据包的流向,红色的线表示的是需要本机帮忙转发的数据包的流向。它们的过程如下:
一、以本机为目的地进入本机的数据包:
1.数据包到达防火墙,先进入mangle表的PREROUTING链,修改包的一些特性,如修改TOS,对包进行mark等
2.进入nat的PREROUTING链,用来修改目的地址,即DNAT
3.接着进入路由判断,判断是发往本机,还是要本机帮忙转发的
4.判断为发往本机后进入mangle表的INPUT链,这里是在路由之后发往本机应用程序之前修改包的一些特性
5.进入filter表的INPUT链,用来过滤所有要进入本机的包,可以通过的才会最终进入本机的应用程序。
二、以本机为源头流出本机的数据包:
1.本地应用程序向外发送数据包,首先先进行路由判断,决定输出的路径
2.然后进入mangle表的OUTPUT链,修改数据包的一些特性
3.进入nat表的OUTPUT链,这里对送出去的包进行DNAT操作,修改目的地
4.进入filter的OUTPUT链,对发出去的包进行过滤操作
5.进入mangle表的POSTROUTING链,在包被发送出去之前修改包的一些特性
6.进入nat表的POSTROUTING链,这里进行的是SNAT(或MASQUERADE)操作,最后数据包发送出去。
三、需要本机帮忙转发的数据包
1.数据包到达防火墙,先进入mangle表的PREROUTING链,修改包的一些特性,如修改TOS,对包进行mark等
2.进入nat的PREROUTING链,用来修改目的地址,即DNAT
3.接着进入路由判断,判断是发往本机,还是要本机帮忙转发的
4.进入mangle表的FORWARD链,修改包的一些特性
5.进入filter表的FORWARD链,只有需要转发的包才会走到这里,并且针对这些包的所有过滤也在这里进行。需要注意的是,所有要转发的包都要经过这里,不管是外网到内网的还是内网到外网的。
5.进入mangle表的POSTROUTING链,在包被发送出去之前修改包的一些特性
6.进入nat表的POSTROUTING链,这里进行的是SNAT(或MASQUERADE)操作,修改源地址,用路由器共享上网靠的就是这条链。最后数据包发送出去。iptables的命令比较复杂,这里就不再赘述,主要记录自己一下openwrt对防火墙的一些见解。openwrt默认将防火墙划分为两个域:wan域和lan域,每个网络接口划分到特定的域中,如网卡eth0接的是宽带网线,而网卡eth1内置交换机芯片可以接4条网线供客户机连接,那么eth0就属于wan域,eth1就属于lan域,lan域的数据需要由wan域帮忙转发,才能够共享上网,而作为热点的无线网卡如wlan0或wlan1自然也属于lan域了。
在控制台输入iptables-save,观察其输入后可以发现,openwrt使用了大量自定义的链来分层规划规则。
一、openwrt在启动防火墙时,读取了uci config文件后,一开始就将表的默认链的动作交给了代理链。例如filter表中,就有如下三条:
也就是说,filter表的三个链都只有一个动作,那就是全权丢给代理链。
二、之后代理链会根据接口所在的域不同而分配不同的域代理链,例如对于delegate_input代理链,则有如下:
对于delegate_input代理链,首先对于进入回环接口的数据包一定是ACCEPT,接着就进入一个自定义的用户链input_rule,再接着就根据状态如果是已经建立好的链接或类似于FTP协议那样有相关的数据包就允许通过,然后就是syn_flood防御,最后根据各个网络接口所在的域,再次将他们导向各自的域的相应代理链,如br-lan接口属于lan域,而且现在的顶层父链是默认的INPUT链,所以就将这类包导向zone_lan_input代理链来处理。
三、到达了域的代理链,就开始进行各种的处理,例如zone_wan_input,有如下:
这里就算是默认的最终处理了,首先还是先导向一个名为input_wan_rule的自定义链,让用户添加特殊的处理,然后就是一些服务所需要的一些允许特定数据包通过的规则,因为路由器与外界网络通信是靠wan域的,wan域不能轻易让数据包进入路由器,所以wan域的INPUT的默认策略是REJECT,所以这里添加的都是一些需要通过的包的规则。最后的这个zone_wan_src_REJECT链,其实就有一条规则,那就是REJECT(对应默认策略)。
openwrt的防火墙大概就是分为以上三个层。我们在手动添加一些自定义规则时可以用config文件来添加,当然也可以使用iptables命令按需要在以上这些代理链中添加,个人认为后者比较好,毕竟config要写起来没有iptables命令直观。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/126.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~