一、概念理解


iptables是如何对包进行控制的:

             对包的控制是我们在不同的链(chain)上添加不同的规则来实现的,而链,则是由一条或者多条规则组成的,可是如果有多条规则同时对一个包进行了定义,会发生什么呢?在chain中,所有的规则都是按从上而下的顺序来执行的(即,如果匹配第一行,就按照第一行的规则来执行,一行一行 的往下找,直到找到符合这个包的规则为止),但是如果没有找到符合规则的包,那就按照Policy来处理。iptables使用 -P 来设置Chain的策略。

 

二、链操作


            对链的操作有以下几种:

            -I(插入)

            -A(追加)

            -R(替换)

            -D(删除)

            -L (列表显示)


             注意:这里的-I与-A选项功能差不多,但是-I将规则放在第一行,-A放在最后一行。


        例:添加一个规则至filter表中的FORWARD链

   

               iptables  -t  filter  -A  FORWARD  -s  10.1.1.11  -d  202.1.1.1  -j  ACCEPT

   

               该命令意思为:追加一个规则至filter表中的FORWARD链尾,允许源地址为10.1.1.11,目标地址为202.1.1.1的数据包通过。其中 -t 后面跟的是表名,-A 后面跟的是链名,-s 表示源地址,-d 表示目标地址,-j 表示处理方向。(在iptables中,默认的表名是filter,所以此处可以省略 -t  filter)


三、匹配参数


      -s:匹配源地址

      -d:匹配目标地址

      -p:协议匹配

      -i:入接口匹配

      -o:出接口匹配

      --sport,--dport:源端口与目的端口的匹配

      -j:包的处理方向(如 -j  ACCEPT)

       !:取反


      -s 这个参数呢就是指定源地址的,如果使用这个参数也就是告诉netfilter,对于符合这样一个源地址

的包怎么去处理,可以指定某一个单播ip地址,也可以指定一个网络,如果单个的ip地址其实隐含了一个

32位的子网掩码,比如-s 10.1.1.11 其实就是-s 10.1.1.11/32,同样我们可以指定不同的掩码用以实现

源网络地址的规则,比如一个C类地址我们可以用-s 10.1.1.0/24来指定。


      -d参数与-s格式一样。


      -i参数是指定入接口的网络接口,比如我仅仅允许从eth3接口过来的包通过FORWARD链,就可以这样指定iptables -A FORWARD -i eth3 -j ACCEPT


      -o是出接口,与上同。


实例:简单的nat路由器


      环境介绍


             linux 2.4 +

 

            2个网络接口


            Lan口:10.1.1.254/24 eth0


            Wan口:60.1.1.1/24 eth1


            目的:实现内网中的节点(10.1.1.0/24)可控的访问internet。

           

            首先将Lan的节点pc的网关指向10.1.1.254。

 

            确定你的linux的ip配置无误,可以正确的ping通内外的地址。同时用route命令查看linux的本地路由表,确认指定了可用的ISP提供的默认网关。


            打开linux的转发功能:sysctl net.ipv4.ip_forward=1

  

            将FORWARD链的策略设置为DROP,这样做的目的是做到对内网ip的控制,你允许哪一个访问internet就可以增加一个规则,不在规则中的ip将无法访问internet.

 

            iptables -P FORWARD DROP


            这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条,否则你只允许lan IP访问没有用,至于为什么,下面我们再详细说。


            iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


           这条规则做了一个SNAT,也就是源地址转换,将来自10.1.1.0/24的地址转换为60.1.1.1

(Deven:因为是让内网上网,因此对于代理服务器而言POSTROUTING(经过路由之后的包应该要把源地址改变为60.1.1.1,否则包无法返回))


           iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j SNAT --to 60.1.1.1


           有这几条规则,一个简单的nat路由器就实现了。这时你可以将允许访问的ip添加至FORWARD链,他们就能访问internet了。


           比如我想让10.1.1.9这个地址访问internet,那么你就加如下的命令就可以了。


           iptables -A FORWARD -s 10.1.1.9 -j ACCEPT


          也可以精确控制他的访问地址,比如我就允许10.1.1.99访问3.3.3.3这个ip


          iptables -A FORWARD -s 10.1.1.99 -d 3.3.3.3 -j ACCEPT

        

          或者只允许他们访问80端口。


          iptables -A FORWARD -s 10.1.1.0/24 -p tcp --dport http -j ACCEPT