iptables和netfilter

1.iptables和netfilter说明


  netfilter/iptables组成Linux平台下的包过滤防火墙,iptables是用户空间的管理工具,netfilter是内核空间的包处理框架。

2.数据包处理流程


 

  

  首先数据包进入PREROUTING链,之后根据路由决策进入INPUT(本机)还是FORWARD(转发),进入INPUT后会继续进入OUTPUT链,最后都走到POSTROUTING链。

  另外,如果加入各种规则之后,则数据包进入某个链之后,还要顺序执行链上的规则,如果匹配某个规则,则根据匹配的规则来处理数据包(例如ACCEPT、DROP或者REJECT),如果都不匹配则使用默认的策略处理数据包。

3.表、链、规则


  理论上,只要在链上添加规则就可以了,这样每个链上就有一个规则链表,只要数据包到链上之后,顺序检查这些规则就可以了。实现中又根据规则的功能的不同,又分为了四张表,即raw、mangle、nat、filter(优先级raw > mangle > nat > filter)。最终,数据包依次进入链中进行处理,然后根据每个链上的表的优先级,依次执行每个链上的表(里面的规则)。关于表链的关系,其实这个很简单,实际使用时以表作为入口,就是根据规则的功能添加规则到特定的表中,然后再把这个规则放到链上,另外就是一个表上的规则只存在固定的几个链上,例如raw表的规则只能在PREROUTING和OUTPUT链。

  filter表:负责包过滤功能

  nat表  :负责地址转换

  mangle表:修改数据包的TOS、TTL,和为数据包设置标记,用来实现Qos调整以及策略路由功能

  raw表  :主要用来关闭连接跟踪,即配置参数时使用-j NOTRACK

   

4.iptables工具用法



  -t table 指定表名,默认为"filter"表 -A chain 向链上追加规则 -D chain 从链上删除规则 -L [chain] 列出链上的规则,这个打印的是规则列表,即把规则参数放到一个表格中 -S [chain] 打印链上的规则,这个打印的是规则的命令行参数,例如-A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT -F [chain] 清除链上的规则 -P chain target 设置指定链的策略,也就是默认策略 -v verbose mode,用作输出命令,表示详细输出 -p proto 规则指定的协议,proto可以为tcp、udp、icmp、all。 -s address[/mask] 源地址[掩码]。 -d address[/mask] 目的地址[掩码]。 -i input name 匹配报文入接口 -o output name -j target 规则匹配后跳转到的目标,也就是动作,因为在内核函数中,匹配某个条件后,使用goto的方式跳转到下一个流程,所以是jump target。 target可以为ACCEPT、DROP、REJECT、SNAT、DNAT、REDIRECT、NOTRACK、LOG 扩展匹配项: --src-range from[-to] 匹配源IP的范围 --dst-range from[-to] 匹配目的IP的范围 --mark value[/mask] 匹配标记,而不是打标记,和匹配IP地址一样有掩码。 这些只是常用的选项,基本每条规则都要用到,主要的目的是实际用。

  例子:

    [1]iptables -P INPUT DROP              //设置链的策略

    [2]iptables -A INPUT -i eth0 -s 10.0.1.1 -j DROP     //阻止某个IP地址

    [3]iptables -t mangle -A PREROUTING !-d 10.0.1.1 -p tcp -j TPROXY --on-port 10000 --on-ip 0.0.0.0 --tproxy-mark 0x1/0x1  //对非目的地址10.0.1.1,并且标记匹配0x1/0x1的报文,透明代理到0.0.0.0:10000地址

5.netfilter


  例如,数据包达到ip_rcv()之后进行一系列检查,函数最后调用:

  return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish);

  这行代码的意思就是首先执行NF_INET_PRE_ROUTING链上面钩子函数(用iptables命令添加规则),执行完钩子函数后,再调用ip_rcv_finish()函数。

  所以用iptables命令添加一条防火墙规则时,就像是在某个链上面添加了一个钩子,例如在ip_rcv()和ip_rcv_finish()之间挂了一个钩子。

  同理,其他的INPUT等链也是这样的调用方式。

 

 

 

 

posted on 2019-03-04 14:09  能量星星  阅读(524)  评论(0编辑  收藏  举报

导航