iptables:
      
        防火墙分为两类:
                    硬件防火墙:有厂商设定好的主机硬件,以提供数据包数据的过滤机制为主。
                    软件防火墙:保护系统网络安全的一套软件机制。
         软件防火墙:
                 功能:可以限制某些服务的访问来源。
                 工作于网络或主机的边缘(通信报文的进出口),对于进出本网络或主机的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理;

          报文流向:
                 流入本机:prerouting--->input==>用户空间进程
                 流出本机:用户空间进程==>output-->postrouting
                 转发:prerouting--->forward--->postrouting

wKiom1ce5KDhprXyAANU-GsOJPc898.png     iptables四表:raw, mangle, nat, filter
             五链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING;


            四表:(table)
                  filter:过滤器,主要跟进入Linux本机的数据包有关,是默认的table。
                  mangle:拆解报文,按需修改
                  nat:network address translation---网络地址转换。(Ip层地址,传输层地址)用来进行来源于目的地的IP或port的转换,与Linux本机无关,主要与Linux主机后的局域网内计算机相关。
                  raw:关闭在nat表启用的连接追踪机制。

            五链:链分为内置和自定义
                 
            内置链 :   
                  perouting:在进行路由判断之前所要进行的规则。
                  input:主要与想进入Linux本机的数据包有关。
                  output:主要与Linux本机所要送出的数据包有关。
                  forward:与Linux本机无关,可以传递数据包到后端的计算机中,与NAT的table相关性较高。
                  postrouting :在进行路由判断之后所要进行的规则。

            自定义链:
                      表与链的对应关系
                         filter:input  forward  output
                         mangle:input  forward  output  perouting  postrouting
                         nat:IP层为例(目标地址转换) output  perouting  postrouting
                         raw:output  perouting

                   同一个链上的不同表示的规则的应用优先级(高-->低)
                        raw
                        mangle:
                        nat:
                        filter:

           规则的查看与清除:

             查看规则:
                iptables  [-t  table]  [-L]  [-nv]
                    -t table:raw, mangle, nat, [filter]
                    -L:列出目前 table的规则。
                    -n:以数字形式显示地址与端口。
                    -v:显示详细信息
                       e.g. iptables -t net -nvL(注意组合使用时L必须写在最后)         
                 iptables-save  [-t  table]
                      不指定-t则是显示全部。

wKioL1ce6oazNv8eAAA1GuB_3dM674.png

    Chain:链。

    poliy:每条链的规则。

    target:代表的操作,ACCEPT通过,REJECT拒绝,DROP,丢弃。

    prot:数据包协议,如TCP,UDP,ICMP。

    source:代表此规则针对于哪个IP来源进行限制。

    destination:代表此规则针对于哪个目标IP来源进行限制。

             清除规则:
                   iptables -F:清除所有已定制的规则。
                   iptables -X:清掉所有用户自定义的链。
                   iptables -Z:将所有的链的计数与流量统计都归零。



=====================================================



命令格式:iptables  [-t  table]   SUBCOMMAND  chain     [matches...]   [target]    
            
            -t table:
                raw, mangle, nat, [filter]
                
            SUBCOMMAND:
                链管理:
                    -N: new,新增一条自定义链;
                    e.g.iptables -N name
                    -X:delete,删除自定义的空链;
                    e.g.iptables -X name
                    -P:policy,设置链的默认策略;
                        ACCEPT:接受
                        DROP:丢弃
                        REJECT:拒绝
                    e.g. iptables -P FORWARD DROP(注意会断开远程连接)

                    -E:rename,重命名自定义的未被引用(引用计数为0)的链;
                    e.g.iptables -N name原名 name
                规则管理:
                    -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][,...]:目标地址匹配
                      e.g. 仅允许 172.18.0.0这台主机自由访问
                           iptables -A INPUT -s  172.18.0.0/16 -d 172.168.110.138/16 -j ACCEPT
                           iptables -A OUTPUT -d  172.18.0.0/16 -s 172.168.110.138/16 -j ACCEPT
                      e.g. 或者除了 172.18.0.0这台主机以外,其他主机都可访问。
                           iptables -A INPUT !-s 172.18.0.0/16 -d 172.168.110.138/16 -j ACCEPT
                    [!] -i, --in-interface name:限制报文流入的接口,只能用于PREROUTING,INPUT及FORWARD;
                    [!] -o, --out-interface name:限制报文流出的接口,只能用于OUTPUT,FORWARD及POSTROUTING;

                扩展匹配:经由扩展模块引入的匹配机制,-m matchname(-m指明扩展名称)
         隐式扩展:可以不用使用-m选项专门加载相应模块;前提是要使用-p选项可匹配何种协议;
         显式扩展:必须由-m选项专门加载相应模块;
                
            隐式扩展:
                [!]  -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首部的目标端口;可以是端口范围;
                            e.g.开放80端口。
                         iptables -A INPUT -s 0/0 -d 172.168.110.138/16 -p tcp --dport 80 -j ACCEPT
                         iptables -A OUTPUT -d 0/0 -s 172.168.110.138/16 -p tcp --sport 80 -j ACCEPT
 
                        [!] --tcp-flags mask comp:检查报文中mask指明的tcp标志位,而要这些标志位comp中必须为1;
                            --tcp-flags  syn,fin,ack,rst  syn(四个标志位中syn必须为1其他必须为0,,也就是三次握手中的第一次)
                            --tcp-flags  syn,fin,ack,rst  ack,fin (定义了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回显应答
                                8/0:echo request (ping请求)自己ping别人是8,别人回应是0
                      e.g.:允许自己ping别人,不允许别人ping自己
                        iptables -A OUTPUT -s 0/0 -d 172.168.110.138/16 -p icmp --icmp-type 8 -j ACCEPT
                        iptables -A INPUT -s 172.168.110.138/16 -d 0/0 -p icmp --icmp-type 0 -j ACCEPT
                       e.g.   允许别人ping自己
                           iptables -A INPUT -d 172.168.110.138/16 -p icmp --icmp-type 8 -j ACCEPT
                           iptables -A OUTPUT -s 172.168.110.138/16 -p icmp --icmp-type 0 -j ACCEPT

                        
        处理动作:
            -j  targetname  [per-target-options]
                ACCEPT, DROP, REJECT
                RETURN:返回调用的链
                REDIRECT:端口重定向
                LOG:日志
                MARK:防火墙标记
                DNAT:目标地址转换
                SNAT:源地址转换
                MASQERADE:地址伪装

    
            显式扩展:必须使用-m指定
            
            multiport:多端口匹配
                以离散方式定义多端口匹配,最多可以指定15个端口;
                
                (原端口)[!] --source-ports,--sports port[,port|,port:port]...(,表示离散:表示连续)
                (目标端口)[!] --destination-ports,--dports port[,port|,port:port]...
                [!] --ports port[,port|,port:port]...
                e.g. 一次开放80 ,22两个端口
                iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp  -m multiport --dports 22,80 -j ACCEPT
                iptables -A 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]:目标地址范围
               e.g. 仅允许在172.18.100.1至172.18.100.100内的主机访问。
                      iptables -A INPUT -d 172.168.110.136 -p tcp --dport 23 -m iprange --src-range 172.18.100.1-172.18.100.100 -j ACCEPT
                      iptables -A OUTPUT -s 172.168.110.136 -p tcp --sport 23 -m iprange --dst-range 172.18.100.1-172.18.100.100 -j ACCEPT

                
            string:对报文中的应用层数据做字符串匹配检测;
                --algo {bm|kmp}:
                    (bm 、 kmp :基于这两种算法来匹配)
                [!] --string pattern:给定要检查的字符串模式;
                [!] --hex-string pattern(16进制编码以后的字符串):给定要检查的字符串模式;
                e.g. 拒绝访问含有某字符串的页面
                ~]# 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...]:匹配一个周中的哪些天;
                e.g. 一周内上班时间允许172.18.100.1-172.18.100.100内的主机访问

               ~]# 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则匹配;
                e.g.限制客户端并发连接数量小于2
                ~]# 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突发速率
                 e.g.限制服务器1秒响应1个请求,一次性突发最多3个。
                 iptables -A INPUT -d 192.168.110.136 -p icmp --icmp-type 8 -m limit --limit 1/second --limit-burst 3 -j ACCEPT
                 iptables -A OUTPUT -s 172.168.110.136 -p icmp --icmp-type 0 -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条目的超时时长;
                        查看不同协议的连接追踪时长:#] ls /proc/sys/net/netfilter



     示例:
                1、e.g.允许本机的ssh,telnet和web服务仅允许本地网络172.18.0.0开放。
                 iptables -A INPUT -s 172.18.100.6 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT
                 iptables -A OUTPUT -d 172.18.100.6 -p tcp -m multiport --sports 22,23,80 -m state --state ESTABLISHED -j ACCEPT
                2、e.g.允许所有主机可以ping
                  # iptables -A INPUT -d 192.168.110.136 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
                  # iptables -A OUTPUT -s 192.168.110.136 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
               3、优化1,2规则:
                   # iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
                   #iptables -A INPUT -d 172.168.110.6 -p tcp -m multiport --dports 22,23,80 -m state --state NEW -j ACCEPT
                   # iptables -A INPUT -d 172.168.100.6 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
                   # iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT



                如何放行被动模式的ftp服务?
                    (1) 内核加载nf_conntrack_ftp模块;
                        modprobe  nf_conntrack_ftp
                    (2) 放行命令连接
                        iptables  -A INPUT  -d  $sip -p tcp --dport 21  -m state --state NEW,ESTABLISHED -j  ACCEPT
                        iptables  -A  OUTPUT  -s  $sip  -p tcp --sport  21  -m state --state  ESTABLISHED -j ACCEPT
                    (3) 放行数据连接
                        iptables  -A INPUT  -d  $sip -p tcp  -m state --state RELATED,ESTABLISHED -j  ACCEPT
                        iptables  -A  OUTPUT  -s  $sip  -p tcp  -m state --state  ESTABLISHED -j ACCEPT
                        
        规则的检查次序:规则在链接上的次序即为其检查时的生效次序;因此,其优化使用有一定法则;
            (1) 同类规则(访问同一应用),匹配范围小的放前面;用于特殊处理;
            (2) 不同类的规则(访问不同应用),匹配范围大的放前面;哪个应用访问的频繁就放在前面。
            (3) 应该将那些可由一条规则描述的多个规则合并为一;
            (4) 设置默认策略;
    
        规则的有效期限:
            iptables命令添加的规则,手动删除之前,其生效期限为kernel的生命周期;
            
            保存规则:
                CentOS 6:
                    ~]# service  iptables  save
                    ~]# iptables-save  > /etc/sysconfig/iptables(系统启动是便会自定启动)
                    
                    ~]# iptables-save  >  /PATH/TO/SOME_RULE_FILE
                    
                CentOS 7:
                    ~]# iptables  -S  > /PATH/TO/SOME_RULE_FILE
                    ~]# iptables-save  >  /PATH/TO/SOME_RULE_FILE
                    
            重载预存的规则
                ~]# iptables-restore  <  /PATH/FROM/SOME_RULE_FILE
                
                CentOS 6:
                    service  iptables  restart
                    会自动从/etc/sysconfig/iptables文件中重载规则;
                    
            自动生效规则文件中的规则:
                (1) 把iptables命令放在脚本文件中,让脚本文件开机自动运行;
                  /etc/rc.d/rc.local
                    /usr/bin/iptables.sh
                    
                (2) 用规则文件保存规则,开机自动重载命令;
                    /etc/rc.d/rc.local         

                    iptables-restore  <  /PATH/FROM/SOME_RULE_FILE