学习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:53
2 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
3 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
4 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
5 1452 115K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
6 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-prohibited
12 0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
13 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:53
2 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
3 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
4 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
5 1633 130K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
6 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-prohibited
12 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。
这样顺了一下,自己就发现对这个框架有了一个比较清晰的理解,代码细节学习起来也就不那么苦涩难懂了。