说起iptables就要提起netfilter,其实它们就像现实生活中立法和执法部门,由iptabeles这个立法部门确定法规,然后由netfilter这个执法部门在城市的主要口设置路卡对来往的车辆和人员进行检查,下图以北京为例详细说解iptables:

   

    当卡车这个数据包到达红色立交桥(在netfilter中叫PREROUTING)选择判断是否进入北京市,如果进入北京市就要到达入京道路检测口(在netfilter中叫input)对卡车进行检查看是否符合入京条件,符合则放行允许进入;不符合直接丢弃。

    另外一个情况,卡车这个数据包在红色立交桥(也就是netfilter中的PREROUTING)选择了不进入北京,它会经由绿色桥梁(在netfilter中叫forward)到达绿色立交桥(在netfilter中叫POSTROUTING),去往其它城市。

    有入京的自然有出京的,红色轿车这个出京的数据包到达出京道路检查口(在netfilter中叫output),如果是去往北方的直接走北方出京通道,到达红色立交桥也就是(nefilter中的PREROUTING)出京;去往南方车辆则经由出京道路检测口(netfilter中output)到达绿色立交桥(netfilter中POSTROUTING)转而去往目的地。

   每当过年或者有重大事件的时候,公安部和解放军就在入京和出京的道路上设置重重关卡,而军警部署的位置表格,就是netfilter的四表:

  1、filter:过滤器,一般部署在INPUT,FORWARD,OUTPUT

  2、 nat:网络地址转换,一般部署在PREROUTING,FORWARD,POSTROUTING

  3、mangle:包拆封和封包工具,可部署在上诉五个点中任意一点。

  4、raw:包跟踪器,一般部署在OUTPUT和PREROUTING上。

   了解了netfilter,下面我们就iptales做深入了解,并书写规则做详细说明。

iptables 的语法格式

iptables –t [表名] [操作选项] [链名] [行号][匹配条件]-j[策略动作]

一)表名:filter(可省略)、nat、mangle、raw

  由高到低的优先级为raw --> mangle --> nat --> filter

二)操作选项:

     -F:flush,清空指定表的指定链上所有规则;省略链名时,清空表中的所有链;

     -N:new, 新建一个用户自定义的链;自定义链只能作为默认链上的跳转对象,即在默认链通过引用来生效自定义链;
     -X:drop,删除用户自定义的空链;非空自定义链和内置链无法删除;
     -Z:zero,将规则的计数器置0;
     -P:policy,设置链的默认处理机制;当所有都无法匹配或有匹配有无法做出有效处理机制时,默认策略即生效,filter表的可用策略:ACCEPT, DROP, REJECT;
     -E:rename,重命名自定义链;注意:被引用中的链,无法删除和改名

     -A:append,在链尾追加一条规则;

     -I:insert,在指定位置插入一条规则;
     -D:delete,删除指定的规则;
     -R:replace,替换指定的规则;

     -L:list,列出指定链上的所有规则;

     —L后面还可跟以下选项:

           -n: numeric,以数字格式显示地址和端口号,即不反解;

           -v: verbose,详细格式,显示规则的详细信息,包括规则计数器等;

            --line-numbers: 显示规则编号;

            -x: exactly,显示计数器的精确值;

         

            pkts: 被本规则所匹配到的包个数;

            bytes:被本规则所匹配到的所包的大小之和;
           target: 处理目标 (目标可以为用户自定义的链)
            prot: 协议 {tcp, udp, icmp}
            opt: 可选项
            in: 数据包流入接口
            out: 数据包流出接口
            source: 源地址
            destination: 目标地址;

三)链名:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING;

四)行号 在插入和删除时使用

五)匹配条件:

      1、通用匹配:

      [!] -s, --src, --source  IP|Network:检查报文中的源IP地址;
      -d, --dst, --destination:检查报文中的目标IP地址;
      -p, --protocol:检查报文中的协议,即ip首部中的protocols所标识的协议;tcp、udp或icmp三者之一;
      -i, --in-interface:数据报文的流入接口;通常只用于PREROUTING, INPUT, FORWARD链上的规则;
      -o, --out-interface:检查报文的流出接口;通常只用于FORWARD, OUTPUT, POSTROUTING链上的规则;

      2、扩展匹配:使用iptables的模块实现扩展性检查机制

       隐式扩展:如果在通用匹配上使用-p选项指明了协议的话,则使用-m选项指明对其协议的扩展就变得可有可无了;
         tcp: 
             --dport PORT[-PORT]
             --sport
             --tcp-flags LIST1 LIST2
             LIST1: 要检查的标志位;
             LIST2:在LIST1中出现过的,且必须为1标记位;而余下的则必须为0; 
           例如:--tcp-flags syn,ack,fin,rst syn
                --syn:用于匹配tcp会话三次握手的第一次;
                  udp:
                   --sport
                   --dport
                   icmp:
                   --icmp-types
                        8: echo request
                        0:echo reply

     iptables -A INPUT  -s 192.168.3.50 -p tcp -d 192.168.3.55 --dport 22 -j ACCEPT

     

        此例的意思是追加一条规则在filter的input链上允许客户端192.168.3.50 访问服务器192.168.3.55的22号端口

       [root@www ~]# iptables -A OUTPUT -s 192.168.3.55 -p tcp --dport 53 -j ACCEPT

     [root@www ~]# iptables -A OUTPUT -s 192.168.3.55 -p udp --dport 53 -j ACCEPT

  开放dns解析

      3、  -m 扩展模块名称

     模块:iptables,netfilter各拥有一部分代码

     multiport: 多端口匹配

    可用于匹配非连续或连续端口;最多指定15个端口;

      专用选项:

         --source-ports, --sports port[,port,port:port]
         --destination-ports, --dports
          --ports

        4、state: 状态检查

        专用选项:
           --state

            连接追踪中的状态:

             NEW: 新建立一个会话
             ESTABLISHED:已建立的连接
             RELATED: 有关联关系的连接
             INVALID: 无法识别的连接

           [root@www ~]# iptables -A OUTPUT -d 192.168.3.55 -p tcp -m multiport --sports 53,22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

          

        5、time扩展:

               基于时间区间做访问控制:
                专用选项:
                 --datestart YYYY[-MM][-DD]    [hh[:mm[:ss]]]
                 --dateend
                  --timestart
                  --timestop
                 --weekdays

        6、connlimit 扩展:

            基于连接数作限制:对每个ip能够发起的并发连接数;
            专用选项:
                   --connlimit-above n

       7、limit扩展:

         基于发包速率作限制:
          专用选项:
            --limit n[/second|/minute|hour|/day]
            --limit-burst n

        8、string: 字符串匹配,能够检测报文应用层中的字符串

           字符匹配检查高效算法
           kmp, bm

           专用选项:

             --algo {kmp|bm}
             --string "STRING"
             --hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;

       9、flags扩展:

         -p tcp --tcp-flags

         #匹配指定的TCP标记,有两个参数列表,列表内部用逗号为分隔符,两个列表之间用空格分开。

         #第一个列表用作参数检查,第二个列表用作参数匹配。

         #可用以下标志:

         SYN、ACK、FIN、RST 、URG、PSH、ALL、NONE

         #ALL是指选定所有的标记,NONE是指未选定任何标记。

     10、iprange: 匹配指定范围内的地址;

           匹配一段连续的地址而非整个网络时有用;

            专用选项:

              [!] --src-ragne IP[-IP]
              [!] --dst-range

  六)nat详解

      1、仅从请求报文判断,地址转换:

              源地址转换:SNAT
              目标地址转换:DNAT
              端口转换:PNAT
       2、NAT Server :能根据需要实现所谓的SNAT、DNAT、或PNAT:
        并非是用户空间运行的进程完成转换功能,靠的是内核中地址转换规则:
        SNAT:CIP-->SIP:CIP-->SNAT(PIP)-->SIP
        CIP:本地客户端地址
        DNAT:RemoteIP-->PIP:RemoteIP-->DNAT(SIP)-->SIP   
        RemoteIP:远程客户端地址
        PNAT:
        3、私有的客户端访问互联网方法:
          1)SNAT
          2)proxy
                iptables -t nat -A POSTROUTING -s 192.168.9.0/24 -j SNAT --to-source 192.168.3.55

               

          cat /proc/sys/net/ipv4/ip_forward  值是否为1 如果为1表示可以转发

          iptables -t nat -A prerouting  -d 172.16.100.11   -p tcp --dport 80 -j DNAT --to-destiation 192.168.10.7
SNAT:主要用于实现让内网客户端访问外部主机时使用:
     注意:要定义在POSTROUTING链,也可以在OUTPUT上使用,但OUTPUT链上使用很少。
      4、定义方法:
       iptables -t nat -A POSTROUTING -s 内网网络或主机地址 -j SNAT --to-source  NAT服务器上的某外网地址

       5、 另外一个TARGET:

         MASQUERADE:地址伪装:iptables -t nat -A POSTROUTING -s 内网网络或主机地址 -j MASQUERADE
            能自行判断该转为哪个源地址
       6、DNAt:主要用于发布内部服务器,让内网中的服务器在外网中可以被访问到:
        注意:要定义在PREROUTING链:

iptables -t nat -A  PREROUTING -d NAT服务器上的某外网地址 -p 某协议 --dport -j DNAT --to-destiation 内网网络或主机地址[:port]

   
       7、FULLNAT:全地址转换
       在请求报文到达时:既修改源地址,又修改目标地址。  

七)RAW表

     1、RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.

    RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。

    实际测试发现filter链仍然处理一些NOTRACK的包,但没有进行connect tracking,所以filter链条里必须将UNTRACKED状态的包放行

   2、 iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。

    所以解決方法一般有两个:

    (1) 加大 ip_conntrack_max 值
    vi /etc/sysctl.conf
    net.ipv4.ip_conntrack_max = 393216
    net.ipv4.netfilter.ip_conntrack_max = 393216
    (2): 降低 ip_conntrack timeout时间
    vi /etc/sysctl.conf
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

八)练习

iptables类作业

    前提:INPUT和OUTPUT默认策略为DROP;

    1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机?

      答:iptables –A INPUT –d 192.168.3.55 –p tcp –dport 22 –j ACCEPT

        iptables -A OUTPUT -s 192.168.3.55 -p tcp --sport 22 -j ACCEPT

        iptables –P INPUT DROP

        iptables -P OUTPUT DROP

        iptables -A INPUT -d 192.168.3.55 -p tcp --dport 80 -m limit --limit 100/s -m time --weekdays Sun,Sat,Fri,Wed,Tues,Thur -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

         iptables -I INPUT 4 -d 192.168.3.55 -p tcp --dport 80 -m string  --algo kmp --string "admin" -j REJECT

         iptables -A OUTPUT -s 192.168.3.55 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

         

    2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;

      [root@www ~]# iptables -A INPUT -d 192.168.3.55 -p tcp -s 172.16.0.0  --dport 21 -m time --timestart 08:30 --timestop 18:00 --weekdays Mon,Tues,Wed,Thur,Fri -m state –state   NEW,ESTABLISHED,RELATED -m connlimit --connlimit-above 5 -j ACCEPT

    [root@www ~]# iptables -A OUTPUT -s 192.168.3.55 -p tcp --dport 21 -m state --state RELATED,ESTABLISHED -j ACCEPT

        modprobe nf_conntrack_ftp

      

    3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;

     答:  iptables -I INPUT 1  -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP

           iptables -R INPUT  2  -p tcp --dport 22 -m state --state NEW -m recent  --set --name SSH -j ACCEPT

             iptables -I INPUT 3 -d 192.168.3.55 -p tcp  --dport 22 -m state --state NEW -m iprange --src-range 192.168.3.20-192.168.3.120 -m recent --name SSH --rcheck --second 60 --hitcount 2 -j DROP

           iptables -R OUTPUT 1 -s 192.168.3.55 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

              

    4、拒绝TCP标志位全部为1及全部为0的报文访问本机;

    iptables -A INPUT -p tcp --tcp-flags all all -j DROP

    iptables -A INPUT -p tcp --tcp-flags all none -j DROP

    5、允许本机ping别的主机;但不开放别的主机ping本机;

    答: iptables -A OUTPUT -s 192.168.3.55 -p icmp --icmp-type 8 -j ACCEPT

         iptables -A INPUT  -d 192.168.3.55 -p icmp --icmp-type 0 -j ACCEPT