iptables防火墙

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables防火墙相关的知识,希望对你有一定的参考价值。

iptables:
  iptables/netfilter:包过滤器防火墙;
   iptables:用户空间的命令
   netfilter:位于内核中的tcp/ip协议的报文处理框架
    Centos5/6:iptables命令编写规则
    Centos7:firewalld建议关闭systemctl disable firewall.service
   
   
    防火墙(Firewall):隔离工具;工作与主机或网络的边缘,对经过的报文根据预先定义的规则进行检测,对于能够被规则匹配到的报文实行某些预定义的处理机制的组件

    硬件防火墙:在硬件级别 能实现部分的防火墙,另一部分功能要基于软件实现
    软件防火墙:应用软件处理的逻辑运行通用于硬件实现的防火墙
 
    主机防火墙:为当前主机提供服务
    网络防火墙:为局域网提供服务
 
  hook function:钩子函数
    prerouting 刚刚进入本地
    input 进入
    forward 本地转换
    output 本地出去
    postprerouting 马上离开本地
    
  iptables的链:
    PREROUTING      刚刚进入
    INPUT           进入
    FORWARD         本地转换
    OUTPUT          出去
    POSTROUTING     马上离开本地
    
  tables:
    filter:过滤,防火墙
    nat:network address translation 网络地址转化 :用于修改报文的源地址或目录地址,甚至是端口
    mangle:拆解报文,做出修改,并重新封装起来
    raw:关闭nat(网络地址转化)表上启用的连接追踪机制
    
    优先级次序:raw-->mangle-->nat-->filter
    
  功能<-->钩子
    raw:PREROUTING,OUTPUT
    mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
    nat:PREROUTING,OUTPUT,OUTPUT,POSTROUTING
    filter:INPUT,FORWARD,OUTPUT
    
   报文的流向:
    到本机某进程的报文:PREROUTING-->INPUT
    由本机转发的报文:PREROUTING-->FORWARD-->POSTROUTING
    由本机进程发出:OUTPUT-->POSTROUTING
    
  规则的组成的部分:
    匹配条件:
      网络层首部属性值
      传输层首部属性值
      附加的条件
    处理动作:
    
  TCP/IP协议
    数据链接层:物理到物理设备之间的通信
    网络层:源主机到目标主机之间的通信
    传输层:进程到进程之间的通信
        
iptables命令:
    规则:根据指定的匹配条件来尝试每个流经过此处的报文,一旦匹配成功,就由规则后面指明的处理动作进行处理
      匹配条件:
        基本匹配条件:简单检查IP、TCP、UDP等报文的某属性进行匹配的机制
        扩展匹配条件:需要借助于扩展模块进行的匹配条件指定即为扩展匹配
      处理动作:
        基本动作:ACCEPT,DROP,...
        扩展动作:需要借组扩展模块进行的动作
    
    添加规则之时需要考量的问题
        1、报文的流的路径,判断添加规则至哪个链上
        2、确定要实现的功能,判断添加规则至哪个表上
        3、指定匹配条件,以用于匹配目标白报文
        
iptabels的使用格式:
    man iptables    以Centos7 为例:
    iptables [-t table] {-A|-C|-D} chain rule-specification

       ip6tables [-t table] {-A|-C|-D} chain rule-specification

       iptables [-t table] -I chain [rulenum] rule-specification

       iptables [-t table] -R chain rulenum rule-specification

       iptables [-t table] -D chain rulenum

       iptables [-t table] -S [chain [rulenum]]

       iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

       iptables [-t table] -N chain

       iptables [-t table] -X [chain]

       iptables [-t table] -P chain target

       iptables [-t table] -E old-chain-name new-chain-name

        rule-specification = [matches...] [target]

       match = -m matchname [per-match-options]

       target = -j targetname [per-target-options]
 
    规则的编写格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j targetname [per-target-options]]
        -t table:默认为filter;也可以用raw,mangle,nat
        
        命令:
          链:
            -P:policy,策略,定义默认策略 一般有两种选择,ACCEPT(同意)和DROP(终止)
            -N:new,新建一条自定义的规则链 被内建链上的规则调用才能生效
            -X:drop,删除自定义的引用计数为0空链
            -F:flush 清空一个表中的所有或者指定的链
            -E:重命名自定义的引用计数为0的链
            
          规则:
            -A:追加,在指定链的尾部追加一条规则
            -I:插入,在指定的位置插入一条规则
            -D:删除,删除指定的规则
            -R:替换,将指定的规则替换成新规则 不能修改规则中部分,而是整条规则完全替换
            
          查看:
            -L:列出表的链上的规则
            -n:以数值格式显示
            -v:显示详细格式信息
            -x:计数器的精确结果
            --line-numbers:显示链中的规则编号
                
          计数器:
            规则,以及默认策略有专用的计数器
            记录被当前规则所匹配到的:
              1、报文个数
              2、字节总数
          
          重置规则计数器:
            -Z:zero,置0
         
          chain:链
            1、内建链
            2、自定义链
            
          匹配条件:
            多重条件:逻辑关系为“与”
            
            基本匹配条件:
              [!]-s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围
              [!]-d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围
              [!] -p, --protocol protocol
                protocol:{tcp|udp|tcp}
              [!] -i, --in-interface name  数据报文的流入接口 INPUT FORWARD and PREROUTING
              [!] -o, --out-interface name 数据报文的流出接口 FORWARD OUTPUT and POSTROUTING
              
            扩展匹配条件:
              隐式扩展:不用-m选择指出matchname(比赛名称)即可使用此match的专用选项进行匹配
              man iptables-extensions   详细说明
                -p tcp 隐含了 -m tcp
                  [!] --source-port,--sport port[:port]:匹配报文中传输层的源端口
                  [!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口
                  [!] --tcp-flags mask comp
                    SYN,ACK,FIN,RST,URG,PSH;
                    mask 要检查的标志为列表,以逗号为分隔
                    comp 必须为1的标志位,余下的出现在mask列表中的标志位就必须为0
                    
                    --tcp-flags SYN ACK FIN FIN RST SYN
                  [!]--syn 相当于--tcp-flags SYN ACK FIN FIN RST SYN(三次握手)
                -p udp 隐含了-m udp
                  [!] --source-port,--sport port[:port]:匹配报文中传输层的源端口
                  [!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口
                 -p lcmp 隐含了-m lcmp
                  [!] --lcmp-type {type[/code]|typename}
                    8:echo-request
                    0:echo-reply
                    
              显示扩展:必须使用-m选项指出matchname,有的match可能存在专用的选项
            
          处理动作(目标)
            -j targetname [perl-target-options]
            
            targetname:
              ACCEPT:接受
              DROP:丢弃
              REJECT:拒绝
            事例:
            本机ip地址:192.168.31.124
            
            iptables -t filter -A INPUT -s 192.168.0.0/16 -d 192.168.31.124 -j ACCEPT   入站的全部放行
            iptables -t filter -A OUTPUT -d 192.168.0.0/16 -s 192.168.31.124 -j ACCEPT   出站的全部放行
            
            iptables -vnL   查看规则的信息
            Chain INPUT (policy ACCEPT 12 packets, 936 bytes)   进站报文
            pkts bytes target     prot opt in     out     source               destination         
            128 10216 ACCEPT     all  --  *      *       192.168.0.0/16       192.168.31.124      

            Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)       出站报文
            pkts bytes target     prot opt in     out     source               destination         
            12  1120 ACCEPT     all  --  *      *       192.168.31.124       192.168.0.0/16      
            
            事例:拒绝192.168.31.169主机连上192.168.31.124主机
            要是iptables 里面什么都没有的话:
              iptables -A INPUT -s 192.168.31.169 -d 192.168.31.124 -j REJECT
            要是iptables 里面有别的规则的话:
              iptables -I -s INPUT 192.168.31.169 -d 192.168.31.124 -j REJECT
            
            添加放行ssh 22端口:
            iptables -A INPUT -s 192.168.0.0/16 -d 192.168.31.124 -p tcp --dport 22 -j ACCECT
            iptables -A OUTPUT -d 192.168.0.0/16 -s 192.168.31.124 -p tcp --sport 22 -j ACCECT
            iptabels -P INPUT DROP
            iptables -P OUTPUT DROP
            iptables -P FORWARD DROP
            
            iptabels -vnL
            Chain INPUT (policy DROP 10 packets, 1027 bytes)
             pkts bytes target     prot opt in     out     source               destination         
              615 44372 ACCEPT     tcp  --  *      *       192.168.0.0/16       192.168.31.124       tcp dpt:22
            
            Chain FORWARD (policy DROP 0 packets, 0 bytes)
             pkts bytes target     prot opt in     out     source               destination         
            
            Chain OUTPUT (policy DROP 0 packets, 0 bytes)
             pkts bytes target     prot opt in     out     source               destination         
              310 41160 ACCEPT     tcp  --  *      *       192.168.31.124       192.168.0.0/16       tcp spt:22
            注意当添加玩规则之后 别人无法连上192.168.31.124这台主机 别人无法ping通你 192.168.31.124这台主机也无法连上别人 ping不出去的
            
            如果开放192.168.31.124主机可以ping别人的主机:    
            iptabels -A OUTPUT -s 192.168.31.124 -p icmp --icmp-type 8 -j ACCEPT        指定出去的是8
            iptables -A INPUT -d 192.168.31.124 -p icmp --icmp-type 0 -j ACCEPT         指定进入的是0
            
            iptables -vnL
            Chain INPUT (policy DROP 650 packets, 65280 bytes)
             pkts bytes target     prot opt in     out     source               destination         
             1883  138K ACCEPT     tcp  --  *      *       192.168.0.0/16       192.168.31.124       tcp dpt:22
                4   336 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.31.124       icmptype 0
            
            Chain FORWARD (policy DROP 0 packets, 0 bytes)
             pkts bytes target     prot opt in     out     source               destination         
            
            Chain OUTPUT (policy DROP 194 packets, 15079 bytes)
             pkts bytes target     prot opt in     out     source               destination         
             1177  167K ACCEPT     tcp  --  *      *       192.168.31.124       192.168.0.0/16       tcp spt:22
                4   336 ACCEPT     icmp --  *      *       192.168.31.124       0.0.0.0/0            icmptype 8

            如果让别人也可以连接自己 ping自己的话:
            iptables -A INPUT -d 192.168.31.124 -p icmp --icmp-type 8 -j ACCEPT    
            iptables -A OUTPUT -s 192.168.31.124 -p icmp --icmp-type 0 -j ACCEPT
            
            iptables -vnL
            
            要是清空iptables内的规则的话:
            iptables -P INPUT ACCEPT
            iptables -P OUTPUT ACCEPT
            iptables -P FORWADR ACCEPT
            iptabels -F
            注意:千万不能直接iptables -F 不然就进入不了
            
    扩展:
    1、multiport扩展    多端口
      支持以离散或连续的方式定义多个端口匹配条件
            [!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口
            [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口
            [!] --ports port[,port|,port:port]...:指定多个端口

        测试:主机地址:192.168.31.169
        yum -y install httpd telnet-server.x86_64 vsftpd.x86_64 mariadb-server.x86_64  做为测试
        systemctl start httpd.service telnet.socket     启动服务
        useradd CK      创建用户
        echo "chen" | passwd --stdin CK     给用户添加密码
        下面可以添加iptables规则:
        iptables -A INPUT -d 192.168.31.169 -p tcp -m multiport --dports 22:23,80 -j ACCEPT     开放进站的端口
        iptables -A OUTPUT -s 192.168.31.169 -p tcp -m multiport --dports 22:23,80 -j ACCEPT    开放出去的端口
        
        iptables -vnL
        Chain INPUT (policy ACCEPT 13 packets, 1264 bytes)
         pkts bytes target     prot opt in     out     source               destination         
          167 11616 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.31.169       multiport dports 22:23,80
        
        Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
         pkts bytes target     prot opt in     out     source               destination         
        
        Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
         pkts bytes target     prot opt in     out     source               destination         
           16  1416 ACCEPT     tcp  --  *      *       192.168.31.169       0.0.0.0/0            multiport sports 22:23,80
        
        iptables -A INPUT -j DROP       将所有进入本地的都给DROP
        iptables -A OUTPUT -j DROP      将所有出去的都给DROP
        
        iptables -vnL
        Chain INPUT (policy ACCEPT 90 packets, 8326 bytes)
         pkts bytes target     prot opt in     out     source               destination         
          328 23012 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.31.169       multiport dports 22:23,80
            0     0 DROP       all  --  *      *       0.0.0.0/0            192.168.31.169      
        
        Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
         pkts bytes target     prot opt in     out     source               destination         
        
        Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
         pkts bytes target     prot opt in     out     source               destination         
          118 13996 ACCEPT     tcp  --  *      *       192.168.31.169       0.0.0.0/0            multiport sports 22:23,80
            4   304 DROP       all  --  *      *       192.168.31.169       0.0.0.0/0           
        
                注意:这是添加在开放端口规则的下面一条,如果在前面的话什么都无法连上去

    2、iprange扩展  ip的范围扩展
      连续的ip地址范围指明连续的多地址匹配的条件
            [!] --src-range from[-to]:源IP地址;
            [!] --dst-range from[-to]:目标IP地址;
        
        
        iptables -vnL
         Chain INPUT (policy ACCEPT 90 packets, 8326 bytes)
         pkts bytes target     prot opt in     out     source               destination         
          328 23012 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.31.169       multiport dports 22:23,80
            0     0 DROP       all  --  *      *       0.0.0.0/0            192.168.31.169      
        
        Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
         pkts bytes target     prot opt in     out     source               destination         
        
        Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
         pkts bytes target     prot opt in     out     source               destination         
          118 13996 ACCEPT     tcp  --  *      *       192.168.31.169       0.0.0.0/0            multiport sports 22:23,80
            4   304 DROP       all  --  *      *       192.168.31.169       0.0.0.0/0           
        
        现在添加开放进入本地和出去的规则:
        iptables -I INPUT 2 -d 192.168.31.169 -p tcp --dport 3306 -m iprange --src-range 192.168.31.0-192.168.31.200 -j ACCEPT
        iptables -I OUTPUT 2 -s 192.168.31.169 -p tcp --sport 3306 -m iprange --dst-range 192.168.31.0-192.168.31.200 -j
        
        iptables -vnL
        Chain INPUT (policy ACCEPT 44 packets, 3932 bytes)
         pkts bytes target     prot opt in     out     source               destination         
         2538  196K ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.31.169       multiport dports 22:23,80
            0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.31.169       tcp dpt:3306 source IP range 192.168.31.0-192.168.31.200
            0     0 DROP       all  --  *      *       0.0.0.0/0            192.168.31.169      
        
        Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
         pkts bytes target     prot opt in     out     source               destination         
        
        Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
         pkts bytes target     prot opt in     out     source               destination         
         1830  224K ACCEPT     tcp  --  *      *       192.168.31.169       0.0.0.0/0            multiport sports 22:23,80
            0     0 ACCEPT     tcp  --  *      *       192.168.31.169       0.0.0.0/0            tcp spt:3306 destination IP range 192.168.31.0-192.168.31.200
           30  2046 DROP       all  --  *      *       192.168.31.169       0.0.0.0/0           

        测试启用之前安装的mariadb
        systemctl start mariadb.service     端口3306
        
        mysql   给mysql添加一个用户和密码
        GRANT ALL ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘chen123‘;
        
        用192.168.31.124的主机mysql 测试连接mysql:
        mysql -uroot -h192.168.31.169 -pchen123     
        
    3、string扩展   字符串扩展
     对报文中的应用层数据做字符串匹配检测
          
        [!] --string pattern:要检测字符串模式
        [!] --hex-string pattern:要检测的字符串模式,16进制编码
        
        测试:vim /var/www/html/test.html       192.168.31.169
               <h1>admin</h1>
        用192.168.31.124主机测试:
        curl http://192.168.31.169/test.html
        在添加一条规则:    注意:访问时ip地址必须是192.168.31.0-192.168.31.200地址范围内的地址才可访问
        iptables -I OUTPUT -s 192.168.31.169 -p tcp --sport 80 -m iprange ! --dst-range 192.168.31.0-192.168.31.200 -m string --string "admin" --algo kmp -j REJECT
        
    4、time扩展     时间扩展
      根据报文到达的时间与指定的时间范围进行匹配度检测
      
        --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:开始日期时间
        --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间
        
        --timestart hh:mm[:ss]      开始时间
        [!] --weekdays day[,day...] 结束时间
        
        iptables -I INPUT -d 192.168.31.169 -p tcp --dport 23 -m time --timestart 18:00:01 --timestop 08:59:59 -j REJECT
        iptables -I INPUT 2 -d 192.168.31.169 -p tcp --dport 23 -m time ! --weekdays Tue,Thu,Sat -j REJECT
        或直接有一条命令解决:
        iptables -I INPUT -d 192.169.31.169 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Tue,Thu,Sat -j ACCEPT
        
    5、connlimit扩展
      根据每客户端ip做并发连接数匹配
      --connlimit-upto n:连接数的数量小于等于n,此时应该允许
      --connlimit-above n:连接数数量大于n,此时应该拒绝
      
      测试:
      iptables -A INPUT -p tcp --dport -m connlimit --connlimit-upto 2 -j ACCEPT
      检测192.168.31.124主机能都否登录192.168.31.169
      ssh [email protected]
      
    6、limit扩展    
      基于收发报文的速率进行匹配
      
      --limit rate[/second|/minute|/hour|/day]:平均速率
      --limit-burst number:峰值速率
      
      限制访问的速率: 超出就会卡顿
      iptables -I INPUT -d 192.168.31.169 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 20/minute -j ACCEPT
    
    7、state扩展
      状态检测;连接追踪机制(conntrack)
      
      INVALID 无法识别的状态
      ESTABLISHED 已建立的连接
      NEW 新连接
      RELATED 相关联的连接
      UNTRACKED 未追踪的连接
      
      nf_conntrack 内核模块
            追踪到的连接:/proc/net/nf_conntrack文件中
            
            能够追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max
                此值可自行定义,建议必要时调整到足够大
                
            不同的协议的连接追踪的时长
                /proc/sys/net/netfilter
    
     [!]--state STATE
     如何开放被模式的ftp服务:
     (1) 装载追踪ftp协议的模块
        modprobe nf_conntrack_ftp
        
     (2) 放行命令连接
      iptables -A INPUT -d 192.168.31.169 -p tcp -m state --state ESTABLISHED -j ACCEPT
      iptables -A INPUT -d 192.168.31.169 -p tcp --dport 21 -m state --state NEW -j ACCEPT
      
     (3) 放行数据连接
     iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED -j ACCEPT
     
     测试:启用mariadb服务监听3306的端口
    systemctl start mariadb.service
    添加规则:
    iptables -A INPUT -d 192.168.31.169 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -s 192.168.31.169 -m state --state ESTABLISHED -j ACCEPT
    
    iptables -A INPUT -d 192.168.31.169 -p tcp -m multiport --dports 21,22,23,80,3306 -m state --state NEW -j ACCEPT   开放后面进入的端口
    iptables -A INPUT -d 192.168.31.169 -j DROP
    iptables -A OUTPUT -s 192.168.31.169 -j DROP
    
    启用vsftpd:
    systemctl start vsftpd.service
    
    iptables -R INPUT 1 -d 192.168.31.169 -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    modprobe nf_conntrack_ftp   装载这个模块:nf_conntrack_ftp
    lsmod | grep conntrack  用于查看启用的模块
     nf_conntrack_ftp       18638  0
    
    用另外一台192.168.31.169主机测试能否登录上ftp
    [[email protected] ~]# ftp 192.168.31.169
    Connected to 192.168.31.169 (192.168.31.169).
    220 (vsFTPd 3.0.2)
    Name (192.168.31.169:root): chen
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> ls
    227 Entering Passive Mode (192,168,31,169,161,77).
    150 Here comes the directory listing.
    drwxr-xr-x    2 1000     1000            6 May 12  2016 Desktop
保存和重新载入的规则:
    iptables-save 后面跟路径        相当于将规则存入一个文件
    iptables-restore 后面跟路径     相当于把规则文件重新载入
    
    演示:
    iptables-save > /etc/sysconfig/iptable.guiz     将规则存入这个文件
    iptables -F     清除所有规则
    iptables-restore < /etc/sysconfig/iptable.guiz  将规则文件重新读取
    
    centos6:开机自动启动:
    保存规则:
        service iptables save
        自动保存规则至/etc/sysconfig/iptables文件中;
    重载规则:
        server iptables restore
            从/etc/sysconfig/iptables文件中重载规则
    
规则的优化:
    1、可以安全放行所有入站及出站,并且状态为ESTABLISHED的连接
    2、服务于同一类功能的规则,匹配条件严格的放前面,宽松的放后面
    3、服务于不同功能的规则,匹配报文可能性较大的扩前面,较小的放在后面
    4、设置默认策略

      (1)最后一条规则设定
      (2)默认策略设定
       


本文出自 “linux” 博客,请务必保留此出处http://001230.blog.51cto.com/11559496/1897805

以上是关于iptables防火墙的主要内容,如果未能解决你的问题,请参考以下文章

请教iptables防火墙的脚本问题。

iptables详解(11):iptables之网络防火墙

iptables详解:iptables概念

CentOS 7.2 里iptables防火墙怎么关闭

iptables防火墙

iptables防火墙