iptables 速查(二)
iptables深入理解:
———— 下面是重点的提纲,详细查阅存档 ”iptables指南 1.1.19“
一、体系结构:
整个iptables的理念是任何包都要经过两条路线(下面大写表示小路线,就是链名):
1、外来的包: PREROUTING -> routing decision(判断IP目的地址是不是本机),然后:
(1)目的地址不是本机: FORWARD -> POSTROUTING
(2)目的地址就是本机: INPUT -> 用户进程
2、自己的包: routing decision -> OUTPUT -> POSTROUTING
>>> 要点:
总体上: 可以看出,在routing decision这个动作前后,放置了一些链,检查和处理路过的包。
细节上: iptables设置了4张表,每张表用于处理一个方面(见二),他们将自己的链放置于routing decision的前后,链名大概体现着包被处理的“位置“!!。然后再理解rules就好多了,即在这个“位置”添加rules来处理经过的包。
但他们的链可能同名,比如对于外来的包,在routing decision前,mangle表和nat表都放置了PREROUTING链。
他们的链可能不同名,对于外来的包,在routing decision后,filter表放置了FORWARD链,而nat表放置了POSTROUTING链。
详细的体系(包到底经过哪些表的哪些链),见存档 ”iptables指南 1.1.19“
二、四张表的分工:
1、filter: 主要的包过滤器,虽然其他的表可能用于过滤,但一般由这个表来做。用于routing decision之后。其INPUT链用于上面路线1(2),FORWARD链用于上面路线1(1),OUTPUT链用于上面2。
2、nat: 就是作NAT工作的,包括DNAT(多个服务器通过一个IP向外提供服务)和SNAT(多个PC通过一个IP上网)
3、mangle: 就是修改包的表
4、raw: 未知
三、表的target:
1、filter: 几乎各种target都可以用,但其主要目的已说了,用于过滤包,如DROP,ACCEPT,REJECT是常用的target。
2、nat: 可用DNAT,SNAT,MASQUERADE (DNAT:Destination Network Address Translation,SNAT同理)
3、mangle: 只能用TOS,TTL,MARK
4、raw:未知
四、状态防火墙:
(一)概述:
称iptables为状态防火墙是因为,他能跟踪连接——即对包的处理和上下文有关。而如果你不把iptables配置为状态防火墙,则他对包的处理,就仅仅依靠规则,不会考虑历史。这会引入一些不安全的因素。(连接跟踪被写为conntrack=connection track)
每个包的状态会在相应阶段被自动标记为NEW,ESTABLISHED,RELATED和INVALID,实际上
记住: 包状态的改变和计算都是在nat表中的PREROUTING链和OUTPUT链里完成的。(参见一和”iptables指南 1.1.19“,你会知道这里指的是哪个阶段)比如: 如果第一个包不是本地产生的,那它就会在PREROUTING链里被设置为NEW状态。
然后,你只需要在之后的某个链里(看你想在哪个表的哪段链里进行处理)加入 -m state --state XXX -j REJECT 类似的句子,就可以判断包是不是XXX状态,是的话采取什么操作(target)
(二)连接:
1、有三种连接可以监测:
这里的连接指的是:对于client,发出一个包,收到一个包则连接建立了;对于server,收到一个包,发出一个包则连接建立了。这里的包可以是下面三种。其中对于TCP来将,期望的是三次握手(虽然可能会用虚假的syn,如果是这样,就需要一些更高级的特性,能够检查包的内容,而不仅仅是看这是不是一个新的TCP包,就判断是三次握手的syn)
(1)TCP
(2)UDP
(3)ICMP
2、状态总规则:
由conntrack控制。情况为client发包或者server端收包,都适用。下面的conntrack为client端和server端。
(1)NEW:
conntrack看到的新的连接的包(什么是新的连接,比如对UDP来讲,就是新的“sip,dip,spt,dpt”组合),就会将包的状态设置为NEW。
(2)ESTABLISHED:
当NEW的包得到回复(在client端是收到server发出的reply,在server端是自己收到NEW的包,然后自己回复一个包,当这个包经过防火墙时),这个包和之后的包都会被conntrack设置为ESTABLISHED状态。对于TCP来讲,不考虑虚假的syn的话,则这个过程是三次握手的前两次,如果是UDP的话,这个就是认为关联的包和回复包。
(3)RELATED:
当一个连接和某个已处于ESTABLISHED状态的连接(即它的连接中的包会被设置为ESTABLISHED状态)有关时,这个连接的包就会被设置为RELATED状态。
(4)INVALID:
INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。
3、特殊的协议:
conntrack机制并不知道如何处理某个特殊的协议,尤其是在它不了解这个协议或不知道协议如何工作时,又没有相应的内核模块支持。比如,NETBLT,MUX还有EGP。这种情况下,conntrack使用缺省的操作。这种操作很象对UDP连接的操作,就是第一个包被认作NEW,其后的应答包等等数据都是 ESTABLISHED。
(三)为什么状态防火墙比无状态防火墙更强大举例:
1、client不希望外来连接,但允许自己访问外面的网络。或者防火墙不希望外来连接,但允许内网访问外面的网络,这时就是体现ESTABLISHED作用的地方。
2、FTP的passive模式下,数据连接由client发起,这就是RELATED发挥作用的地方,而不需要server端打开一大堆实际上不会用到的端口。
3、配合状态检查的,可以细致到包的内容,比如你写一个iptable -A INPUT -p tcp的,你除了可以检查是否是NEW状态外,还可以检查这个包是不是真正的syn包,详细见”iptables指南 1.1.19“ ———— 只要内核有相应的模块支持,你可以检查任何协议的细致内容。
(四)另外的注意:
1、各种状态是有时间限制的:比如一个链接为ESTABLISHED的时间肯定有限,新来一次包会刷新一次,但不来,就会超时,状态消失。
五、用自定义链进行分类处理:
你可以自定义三个链: icmp_packets、tcp_packets、udp_packets, 然后把包导向他们(用 -p tcp -j TARGET 方式),这样把不同的包的处理分开写,比较清晰。
六、有用的工具:
1、用脚本不断调用iptables来设置规则会效率低下:
因为他的添加方式是,每次iptables都将rule插入内核空间的iptables,这样要插无数次。
2、用iptables-save保存当前table,用iptables-restore恢复:
这两个命令的好处是,用restore的时候,只需要一次性把保存下来的table载入内存,效率很高的。
直接运行iptables-save默认会打印该特殊格式的文件到屏幕上。