免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1917 | 回复: 0
打印 上一主题 下一主题

IPTable 原理概述 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-19 12:00 |只看该作者 |倒序浏览



    当数据包到达防火墙时,如果MAC地址符合,就会由内核里相应的驱动程序接收,然后会经过一系列操作,从而决定是发送给本地的程序,还是转发给其他机子,还是其他的什么。而iptables中的所有的规则都是针对某个表中的某个链来说的(至少基本上是),iptables中有“三表五链”之说,即nat表, filter表,mangle表;和PERROUTING链,POSTROUTING链,OUTPUT链,INPUT链,和FORWARD链,但不是所有的表都包括这五个链。其具体转发过程如下:



步骤一、在线路上传输(比如,Internet)
步骤二、进入接口 (比如, eth0)
步骤三、这个链用来mangle数据包,比如改变TOS等
步骤四、这个链主要用来做DNAT。不要在这个链做过虑操作,因为某些情况下包会溜过去。
步骤五、路由判断,比如,包是发往本地的,还是要转发的。
步骤六、在路由之后,被送往本地程序之前,mangle数据包。
步骤七、所有以本地为目的的包都要经过这个链,不管它们从哪儿来,对这些包的过滤条件就设在这里。
步骤八、到达本地程序了(比如,服务程序或客户程序)

    以本地为源的包

步骤一、本地程序(比如,服务程序或客户程序)
步骤二、路由判断,要使用源地址,外出接口,还有其他一些信息。
步骤三、在这儿可以mangle包。建议不要在这儿做过滤,可能有副作用哦。
步骤四、这个链对从防火墙本身发出的包进行DNAT操作。
步骤五、对本地发出的包过滤。
步骤六、这条链主要在包DNAT之后(译者注:作者把这一次DNAT称作实际的路由,虽然在前面有一次路由。对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个包具体到哪儿去,要由NAT代码处理之后才能确定。所以把这称作实际的路由。),离开本地之前,对包 mangle。有两种包会经过这里,防火墙所在机子本身产生的包,还有被转发的包。
步骤七、在这里做SNAT。但不要在这里做过滤,因为有副作用,而且有些包是会溜过去的,即使你用了DROP策略。
步骤八、离开接口(比如: eth0)
步骤九、在线路上传输(比如,Internet)

    被转发的包

步骤一、在线路上传输(比如,Internet)
步骤二、进入接口(比如, eth0)
步骤三、mangle数据包,,比如改变TOS等。
步骤四、这个链主要用来做DNAT。不要在这个链做过虑操作,因为某些情况下包会溜过去。稍后会做SNAT。
步骤五、路由判断,比如,包是发往本地的,还是要转发的。
步骤六、包继续被发送至mangle表的FORWARD链,这是非常特殊的情况才会用到的。在这里,包被mangle(还记得mangle的意思吗)。这次 mangle发生在最初的路由判断之后,在最后一次更改包的目的之前(译者注:就是下面的FORWARD链所做的,因其过滤功能,可能会改变一些包的目的地,如丢弃包)。
步骤七、包继续被发送至这条FORWARD链。只有需要转发的包才会走到这里,并且针对这些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是外网到内网的还是内网到外网的。在你自己书写规则时,要考虑到这一点。
步骤八、这个链也是针对一些特殊类型的包(译者注:参考第6步,我们可以发现,在转发包时,mangle表的两个链都用在特殊的应用上)。这一步mangle是在所有更改包的目的地址的操作完成之后做的,但这时包还在本地上。
步骤九、这个链就是用来做SNAT的,当然也包括Masquerade(伪装)。但不要在这儿做过滤,因为某些包即使不满足条件也会通过。
步骤十、离开接口(比如: eth0)
步骤十一、又在线路上传输了(比如,LAN)
以下是一个添加规则的范例:
#!/bin/bash
# This is a script
# establish a static firewall
# define const here
Open_ports="80 25 110 10" # 自己机器对外开放的端口
Allow_ports="53 80 20 21" # internet的数据可以进入自己机器的端口
#init
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT DROP #we can use another method to instead it
iptables -A INPUT -i ! ppp0 -j ACCEPT
# define ruler so that some data can come in.
for Port in "Allow_ports" ; do
iptables -A INPUT -i ppp0 -p tcp -sport $Port -j ACCEPT
iptables -A INPUT -i ppp0 -p udp -sport $Port -j ACCEPT
done
for Port in "Open_ports" ; do
iptables -A INPUT -i ppp0 -p tcp -dport $Port -j ACCEPT
iptables -A INPUT -i ppp0 -p udp -dport $Port -j ACCEPT
done

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/109143/showart_2152896.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP