linux iptables - iptables流程

【基本介绍】
iptables 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

【参数介绍】


1. filter是默认的表,包含input(数据发往本地)forward(数据包通过路由)output(本地生成的数据)
2. nat新的数据包遇到的时候,包含PREROUTING(当数据要进来的时候改变)OUTPUT(改变本地的数据在路径选择前)POSTROUTING(数据要出去的时候改变)
3. mangle专门用来修改数据,包含PREROUTING(改变要进来的数据在路径选择前)OUTPUT(改变本地的数据在路径选择前)FORWARD(改变数据在路径选择的时候)POSTROUTING(改变数据要出去的时候)
4. raw地址转换和数据包的链接跟踪处理,包含PREROUTING(数据包来自任何地方)OUTPUT(本地生成的数据)

【流程】



基本步骤如下:
1. 数据包到达网络接口,比如 eth0。
2. 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。
3. 如果进行了连接跟踪,在此处理。
4. 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
5. 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。
6. 决定路由,看是交给本地主机还是转发给其它主机。

到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过:
7. 进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。
8. 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。
9. 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。
10. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。
11. 进入出去的网络接口。完毕。

另一种情况是,数据包就是发给本地主机的,那么它会依次穿过:
7. 进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。
8. 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。
9. 交给本地主机的应用程序进行处理。
10. 处理完毕后进行路由决定,看该往那里发出。
11. 进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。
12. 连接跟踪对本地的数据包进行处理。
13. 进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。
14. 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。
15. 再次进行路由决定。
16. 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
17. 进入 mangle 表的 POSTROUTING 链,同上一种情况的第9步。注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。
18. 进入 nat 表的 POSTROUTING 链,同上一种情况的第10步。
19. 进入出去的网络接口。完毕。

【修改保存】
通过命令行修改的rules,等下次重启iptables的时候就会被丢弃
可以通过/etc/init.d/iptables save 保存

通过配置文件修改的rules,可以restart iptables使之生效

【简单实例】
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target       prot opt source                 destination        
Chain FORWARD (policy ACCEPT)
target       prot opt source                 destination        
Chain OUTPUT (policy ACCEPT)
target       prot opt source                 destination 
什么规则都没有.

开启80端口.
[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
匹配新的链接的时候开启80端口
[root@tp ~]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80-j ACCEPT
允许icmp包通过,也就是允许ping,
[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT
允许ip的所有访问
[root@tp ~]# iptables -A INPUT -s 0.0.0.0-j ACCEPT

【参考】
http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html
http://blog.chinaunix.net/uid-10915175-id-3381754.html
http://www.cyberciti.biz/faq/rhel-fedorta-linux-iptables-firewall-configuration-tutorial/
http://www.cyberciti.biz/tips/linux-iptables-examples.html

猜你喜欢

转载自runpanda.iteye.com/blog/2101075