netfilter/iptables学习总结(一)

来源:互联网 发布:linux设置为中文后死机 编辑:程序博客网 时间:2024/05/16 06:52

        学习netfilter/iptables有一段时间了,由于中间断断续续,感觉对这个框架的认知还有许多模糊不清的地方。在网上也很多大牛的博客,看了之后收获颇多,我也把我学习到的东西总结一下,继续学习加深理解。纯属自己理解,要是有错请赐教。

       这篇从iptables命令行入手,我最开始学习的时候,是先从看代码开始的,当时看到代码中的chain,match和target就是一头雾水,后来看了命令行之后才算比较清楚,走了段弯路。命令行的形式从 man iptables或者 iptalbes -h都可以看得到。基本形式:iptables [-t table] -I chain [rulenum] rule-specification

       -t 的意思就是表,在内核代码中看ipt_register_table就是注册的这些表,有filter,nat,mangle,raw和security,当不显示使用-t 时,默认为filter表

       chain就是各个表在注册时候,在内核协议栈的PRE_ROUTING,LOCAL_IN,FORWARD,LOCAL_OUT,和POST_ROUTING的几个点注册钩子,来对报文进行匹配,各个table关注的chain是不一样的。

       rulenum是在chain中的顺序,用来对iptable规则操作起来很方便,可以用--line-numbers来显示。

[root@bogon zyf]# iptables -nvL INPUT --line-numbers Chain INPUT (policy ACCEPT 0 packets, 0 bytes)num   pkts bytes target     prot opt in     out     source               destination         1        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:532        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:533        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:674        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:675     1452  115K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED6        1    80 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           7       69  8042 INPUT_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0           8       69  8042 INPUT_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           9       69  8042 INPUT_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           10       5   300 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           11      57  7346 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited12       0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable13       0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

显示filter表的INPUT chain的规则,第一列是规则的rulenum,这个内核报文也是用这个顺序来做规则匹配。用rulenum来操作,结果和上图对比,发现少了第12条:

[root@bogon zyf]# iptables -D INPUT 12[root@bogon zyf]# iptables -nvL INPUT --line-numbers Chain INPUT (policy ACCEPT 0 packets, 0 bytes)num   pkts bytes target     prot opt in     out     source               destination         1        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:532        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:533        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:674        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:675     1633  130K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED6        1    80 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           7      100 13266 INPUT_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0           8      100 13266 INPUT_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           9      100 13266 INPUT_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           10       5   300 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           11      88 12570 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited12       0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable[root@bogon zyf]# ^C[root@bogon zyf]# 
rule-specification就是各种的详细内容了,这个很多文档也有介绍,这个主要是跟代码中的match和target对照,在编译内核是有很多netfilter的选项可以支持,有兴趣可以看一下,如果在自己的系统中发现有点命令提示是iptables: No chain/target/match by that name.有可能是就是选项没有打开。我举一个自己的规则,就是让我的环境不能被ping,可以添加规则iptables -I INPUT 10 -p icmp -j REJECT。


     这样顺了一下,自己就发现对这个框架有了一个比较清晰的理解,代码细节学习起来也就不那么苦涩难懂了。

原创粉丝点击