码迷,mamicode.com
首页 > 其他好文 > 详细

iptables

时间:2016-04-26 14:25:40      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:防火墙   管理工具   路由表   数据包   filter   


iptables只是Linux防火墙的管理工具,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。 

iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。     

4个表:

   filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。

    filter:一般的过滤功能

    nat:用于nat功能(端口映射,地址映射等)

    mangle:用于对特定数据包的修改

    raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

    PREROUTING:数据包进入路由表之前

    INPUT:通过路由表后目的地为本机

    FORWARDING:通过路由表后,目的地不为本机

    OUTPUT:由本机产生,向外转发

    POSTROUTING:发送到网卡接口之前。


规则表:
1.filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包  内核模块:iptables_filter.
2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
4.Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理  内核模块:iptable_raw
(这个是REHL4没有的,不过不用怕,用的不多)


规则链:
1.INPUT——进来的数据包应用此规则链中的策略
2.OUTPUT——外出的数据包应用此规则链中的策略
3.FORWARD——转发数据包时应用此规则链中的策略
4.PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5.POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)


规则表之间的优先顺序:
raw——mangle——nat——filter


iptables的命令管理

命令格式:iptables [-t table] SUBCOMMAND chain [matches...] [target]   
   -t table:
      raw, mangle, nat, [filter]    默认表为filter
 SUBCOMMAND:
   链管理:
       -N: new,新增一条自定义链;
       -X:delete,删除自定义的空链;
       -P:policy,设置链的默认策略;
         ACCEPT:接受
         DROP:丢弃
         REJECT:拒绝
       -E:rename,重命名自定义的未被引用(引用计数为0)的链;
   规则管理:
       -A:append,追加,默认为最后一个;
       -I:insert,插入,默认为第一个;
       -D:delete,删除
         (1) rule specification
         (2) rule number
       -R:replace,替换
       -F:flush,清洗
       -Z:zero,置0;
          iptables的每条规则都有两个计数器:
             (1) 由本规则匹配到的所有的packets;
             (2) 由本规则匹配到的所有的bytes;
       -S:selected,以iptables-save命令的格式显示链上的规则;
   查看:
       -L: list,列出规则
       -n:numeric,以数字格式显示地址和端口;
       -v:verbose,详细信息;-vv, -vvv
       -x:exactly,显示计数器的精确值而非单位换算后的结果;
       --line-numbers:显示链上的规则的编号;           
       组合:-nvL
    
 匹配条件:
   基本匹配:netfilter自带的匹配机制
       [!] -s, --source address[/mask][,...]:原地址匹配
       [!] -d, --destination address[/mask][,...]:目标地址匹配
       [!] -i, --in-interface name:限制报文流入的接口,只能用于PREROUTING,INPUT及FORWARD;
       [!] -o, --out-interface name:限制报文流出的接口,只能用于OUTPUT,FORWARD及POSTROUTING;
   扩展匹配:经由扩展模块引入的匹配机制,-m matchname
    隐式扩展:可以不用使用-m选项专门加载响应模块;前提是要使用-p选项可匹配何种协议;

        tcp、udp、icmp

    显式扩展:必须由-m选项专门加载响应模块;
        multiport
        iprange
        string
        time
        connlimit
        limit
        state


隐式扩展:
   [!]  -p, --protocol PROTOCOL PROTOCOL:
   协议:tcp, udp, icmp, icmpv6, esp, ah, sctp, mh or "all"
                    
   tcp: 隐含指明了“-m tcp”,有专用选项:
     [!] --source-port,--sport  port[:port]:匹配报文中的tcp首部的源端口;可以是端口范围;
     [!] --destination-port,--dport port[:port]:匹配报文中的tcp首部的目标端口;可以是端口范围;
      [!] --tcp-flags mask comp:检查报文中mask指明的tcp标志位,而要这些标志位comp中必须为1;
     --tcp-flags  syn,fin,ack,rst  syn
      --tcp-flags  syn,fin,ack,rst  ack,fin
     [!] --syn:
       --syn相当于“--tcp-flags  syn,fin,ack,rst  syn”;tcp三次握手的第一次                      
   udp:隐含指明了“-m udp”,有专用选项:
     [!] --source-port,--sport  port[:port]:匹配报文中的udp首部的源端口;可以是端口范围;
     [!] --destination-port,--dport port[:port]:匹配报文中的udp首部的目标端口;可以是端口范围;
                        
   icmp:隐含指明了“-m icmp”,有专用选项:
     [!] --icmp-type {type[/code]|typename}
      type/code:
         0/0:echo reply 应答ping请求
         8/0:echo request 自己可以ping
                        
 处理动作:
    -j targetname [per-target-options]
      ACCEPT, DROP, REJECT
      RETURN:返回调用的链
      REDIRECT:端口重定向
      LOG:日志
      MARK:防火墙标记
      DNAT:目标地址转换
      SNAT:源地址转换
      MASQERADE:地址伪装

匹配条件:       
  显式扩展:         
   multiport:多端口匹配
     以离散方式定义多端口匹配,最多可以指定15个端口;          
     [!] --source-ports,--sports port[,port|,port:port]...
     [!] --destination-ports,--dports port[,port|,port:port]...
     [!] --ports port[,port|,port:port]...

  iptables -I INPUT -s 0/0 -d 172.18.100.6 -p tcp  -m multiport --dports 22,80 -j ACCEPT
  iptables -I OUTPUT -d 0/0 -s 172.18.100.6 -p tcp  -m multiport --sports 22,80 -j ACCEPT

   iprange:指明一段连续的ip地址范围做为源地址或目标地址匹配;
     [!] --src-range from[-to]:源地址范围
     [!] --dst-range from[-to]:目标地址范围
                
   string:对报文中的应用层数据做字符串匹配检测;
     --algo {bm|kmp}:
        (bm = Boyer-Moore, kmp = Knuth-Pratt-Morris)
     [!] --string pattern:给定要检查的字符串模式;
     [!] --hex-string pattern:给定要检查的字符串模式;
                
 ~]# iptables -I OUTPUT -s 172.18.100.6 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "old" -j REJECT
                
   time:根据收到报文的时间/日期与指定的时间/日期范围进行匹配;         
      --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
      --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间; 
      --timestart hh:mm[:ss]:起始时间;
      --timestop hh:mm[:ss]:结束时间;    
      [!] --monthdays day[,day...]:匹配一个月中的哪些天;
      [!] --weekdays day[,day...]:匹配一个周中的哪些天; 


~]# iptables -R INPUT 4 -d 172.18.100.6 -p tcp --dport 23 -m iprange --src-range 172.18.100.1-172.18.100.100 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT
                
   connlimit:根据每客户端主机做并发连接数限制,即每客户端最多可同时发起的连接数量;
      --connlimit-upto n:连接数量小于等于n则匹配;
      --connlimit-above n:连接数量大于n则匹配;
                
~]# iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
                
   limit:基于令牌桶算法对报文的速率做匹配;
   This module matches at a limited rate using a token bucket filter.           
     --limit rate[/second|/minute|/hour|/day]
     --limit-burst number
                
]# iptables -R INPUT 3 -d 172.18.100.6 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT

   state:是conntrack的子集,用于对报文的状态做连接追踪;      
     [!] --state state    
       INVALID:无法识别的连接;
       ESTABLISHED:连接追踪模板当中存在记录的连接;
       NEW:连接追踪模板当中不存的连接请求;
       RELATED:相关联的连接;
       UNTRACKED:未追踪的连接;

       已经追踪到的并记录下来的连接:
         /proc/net/nf_conntrack
                    
       连接追踪功能所能够记录的最大连接数量(可调整):
         /proc/sys/net/nf_conntrack_max
                    
         sysctl -w net.nf_conntrack_max=300000
         echo  300000 > /proc/sys/net/nf_conntrack_max
                    
         conntrack所能够追踪的连接数量的最大值取决于/proc/sys/net/nf_conntrack_max的设定;已经追踪到的并记录下来的连接位于/proc/net/nf_conntrack文件中,超时的连接将会被删除;当模板满载时,后续的新连接有可能会超时;解决办法:
         (1) 加大nf_conntrack_max的值;
         (2) 降低nf_conntrack条目的超时时长;
            不同协议的连接追踪时长:/proc/sys/net/netfilter/

本文出自 “涛声依旧” 博客,请务必保留此出处http://zhaoyongtao.blog.51cto.com/10955972/1767819

iptables

标签:防火墙   管理工具   路由表   数据包   filter   

原文地址:http://zhaoyongtao.blog.51cto.com/10955972/1767819

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!