[收藏整理] 理解iptables 2

来源:互联网 发布:35岁男人的爱情观 知乎 编辑:程序博客网 时间:2024/04/30 00:24
原文:2000.6.6 by Jephe Wu
网址:http://www.linuxforum.net/docnew/showthreaded.php?Cat=&Board=sys&Number=348&page=0&view=collapsed&sb=5&o=all&fpart= 

iptables 是有状态的(stateful)。 

      有状态的意思是指如果一个包是对从防火墙原先发出去的包的回复,则自动不用检查任何
      规则就立即允许回复包进入并返回给请求者,这样我们不用设置许多规则定义就可实现应
      有的功能,在新的内核中使用这种有状态的能力是强烈地被推荐的,那么如何打开并使用
      这种功能呢? 见下图。 (图二) 

      我们假定某公司有如下图所示的典型的internet连接方案: 

_______
10.0.0.2 | |
|PC | (10.0.0.1)eth1| |eth0(1.2.3.4)
B|___|_ ___________________|防火墙 |---------Internet
(LAN: 10.0.0.0/24) | A |
|_______|

      可使用下面的规则集使用iptables的有状态的能力并打开IP伪装功能。 

     1 modprobe ip_tables 
      2 echo 1 > /proc/sys/net/ipv4/ip_forward 
      3 iptables -F INPUT 
      4 iptables -F FORWARD 
      5 iptables -F POSTROUTING -t nat 
      6 iptables -P FORWARD DROP 

      7 iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT
      8 iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j   ACCEPT 

      9 iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE

    10 iptables -A INPUT -p tcp -i eth0 --syn --dport 80 -j ACCEPT 
    11 iptables -A INPUT -p tcp -i eth0 --syn -j DROP 

      注:

      1. 当使用redhat 的模块化内核时,装入ip_tables模块后,以后的命令将根据需要自行
      装入需要的模块。 
      另外注意,如果你装入了ipchains或者ipfwadm模块,则不能再装入iptables模块,可用
      rmmod命令移走它 们再装入iptables模块。在redhat下,可用ntsysv移走ipchains和
      iptables标记重启后运行上面的命令。 
      或者放入/etc/rc.d/rc.local中自动运行。

      2. 第二行打开IP转发功能。

      3. 第三四五行清除INPUT,FORWARD和POSTROUTING键规则

      4. 第六行设置默认转发策略是DROP,当一个包被转发转则应用但不能应用到任何一条转
      发规则上则应用默认 规则。

      5. 第七行转发本网段的机器到任何地方去的包。

      6. 第八行利用了有状态的能力,只要是对先前从防火墙外部接口出去的请求包的回复,允许。 
      ESTABLISHED是指TCP连接,RELATED是指象主动FTP,ICMP ping请求等,当回复包到达
      时,实际上是检查文 件 /proc/net/ip_conntrack看是否在里面,如果在表中,则不检
      查任何链,包允许通过。

      7. 第九行打开IP伪装能力,从eth0出去的包被重写源地址后伪装出去,是源地址SNAT的
      特例。这里要注意的是 -o eth0, 而不是 -i eth0,在iptables中,从一个接口出去的
      包用 -o,进来的包用 -i

      8. 第十行说明如果这台防火墙也是WEB服务器,则允许外部的新建立的请求且目标端口为
      80的包可以进入

      9. 第十一行对不是目标端口是80的所求TCP新的连接请求包,拒绝进入。 
      注: NAT 与 FORWARD 链的关系 

      a. 不管执行任何NAT,对包过滤规则看到的源和目的地址是真实的源和目的地址,尽管在
      执行IP伪装(DNAT)时 会对包进行地址重写,这一点你可以从文件 /proc/net/ip_conntrack中看到。

      b. 如果我们没有利用iptables的有状态的能力,象上面的情况,要是允许网段
      10.0.0.0/24中的机器可以IP伪装的话,我们不得不加上一条转发规则 iptables -A
      FORWARD -d 10.0.0.0/24 -j ACCEPT,否则对伪装包的回复不会通过转发链回复给内部
      机器,因为回复包需要通过转发链。 


      注: 如何证明仅仅一个规则链被应用了? 
      在以前的ipchains中一个包要经过input,forward,output链才能从防火墙送出到
      internet,现在使用iptables,仅仅一个链被应用,你可以加入下面的规则测试 

      iptables -A INPUT -s 10.0.0.2/24 -j DROP 

      上面的这行在iptables中仅仅是指任何本网段的机器当目标就是防火墙时被拒绝,但绝不
      影响NAT和转发包, 
      这在以前的ipchains中是不可能的。