×

openwrt的防火墙工具iptables

hqy hqy 发表于2019-01-21 13:38:30 浏览3241 评论0

抢沙发发表评论

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表中,就有如下三条:

-A INPUT -j delegate_input-A FORWARD -j delegate_forward-A OUTPUT -j delegate_output123

  也就是说,filter表的三个链都只有一个动作,那就是全权丢给代理链。 
  二、之后代理链会根据接口所在的域不同而分配不同的域代理链,例如对于delegate_input代理链,则有如下:

-A delegate_input -i lo -j ACCEPT-A delegate_input -m comment --comment "user chain for input" -j input_rule-A delegate_input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT-A delegate_input -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn_flood-A delegate_input -i br-lan -j zone_lan_input-A delegate_input -i eth0 -j zone_wan_input-A delegate_input -i pppoe-pppoe -j zone_wan_input1234567

  对于delegate_input代理链,首先对于进入回环接口的数据包一定是ACCEPT,接着就进入一个自定义的用户链input_rule,再接着就根据状态如果是已经建立好的链接或类似于FTP协议那样有相关的数据包就允许通过,然后就是syn_flood防御,最后根据各个网络接口所在的域,再次将他们导向各自的域的相应代理链,如br-lan接口属于lan域,而且现在的顶层父链是默认的INPUT链,所以就将这类包导向zone_lan_input代理链来处理。 
  三、到达了域的代理链,就开始进行各种的处理,例如zone_wan_input,有如下:

-A zone_wan_input -m comment --comment "user chain for input" -j input_wan_rule-A zone_wan_input -p udp -m udp --dport 68 -m comment --comment Allow-DHCP-Renew -j ACCEPT-A zone_wan_input -p icmp -m icmp --icmp-type 8 -m comment --comment Allow-Ping -j ACCEPT-A zone_wan_input -p tcp -m tcp --dport 1723 -m comment --comment "@rule[9]" -j ACCEPT-A zone_wan_input -p udp -m udp --dport 1723 -m comment --comment "@rule[9]" -j ACCEPT-A zone_wan_input -m conntrack --ctstate DNAT -m comment --comment "Accept port redirections" -j ACCEPT-A zone_wan_input -j zone_wan_src_REJECT1234567

  这里就算是默认的最终处理了,首先还是先导向一个名为input_wan_rule的自定义链,让用户添加特殊的处理,然后就是一些服务所需要的一些允许特定数据包通过的规则,因为路由器与外界网络通信是靠wan域的,wan域不能轻易让数据包进入路由器,所以wan域的INPUT的默认策略是REJECT,所以这里添加的都是一些需要通过的包的规则。最后的这个zone_wan_src_REJECT链,其实就有一条规则,那就是REJECT(对应默认策略)。 
  openwrt的防火墙大概就是分为以上三个层。我们在手动添加一些自定义规则时可以用config文件来添加,当然也可以使用iptables命令按需要在以上这些代理链中添加,个人认为后者比较好,毕竟config要写起来没有iptables命令直观。


打赏

本文链接:https://www.kinber.cn/post/126.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客