如何进行iptables的使用

这篇文章给大家介绍如何进行iptables的使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

目前创新互联已为上千家的企业提供了网站建设、域名、虚拟主机绵阳服务器托管、企业网站设计、郸城网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

一.iptables 简介

   当一台主机接入至一个网络中的时候,就不可避免的会受到来至网络的可能***,为了解决这一问题,诞生了防火墙(Firewall)的技术,通过防火墙可以阻隔绝大多数的来路不明的网络请求,从而保护自己的主机。

   防火墙可以分为硬件防火墙和软件防火墙,软件防火墙即是通过软件处理逻辑对通过主机的各种报文,信息等进行监控阻隔等,而硬件防火墙则可以基于硬件直接进行阻隔,硬件防火墙中部分功能也需要基于软件实现。

    Iptables是基于软件实现的防火墙,主要有两个部分组成。内核空间中的netfilter,提供了整个防火墙框架,而iptables则位于用户空间,主要是给用户提供一个接口,使得用户可以根据需要对位于内核的netfilter进行管理操作。

    Netfilter主要是通过5个hookfunction(钩子函数)在内核级别实现报文的监控修改等操作,他们分别为prerouting,input,forward,output,postrouting。而用户空间的iptables则分别使用5条链对应这五个hookfunction。为了便于管理iptables还设定了4个不同的功能(tables)

    filter:过滤,防火墙;

    nat:networkaddress translation;用于修改报文的源地址或目标地址,甚至是端口;

    mangle:拆解报文,做出修改,并重新封装起来;

    raw:关闭nat表上启用的连接追踪机制;

        优先级次序(由高而低):

                              raw--> mangle --> nat --> filte

        其中功能与钩子的关系为:

功能<-->钩子:

raw:PREROUTING,OUTPUT

mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

nat:PREROUTING,INPUT,OUTPUT,POSTRUTING

filter:INPUT,FORWARD,OUTPUT

二.iptables 设置

   获取帮助:

      CentOS7:man iptables-extensions

      CentOS6:man iptables

   使用格式

      iptables [-t table] COMMAND chain[-m matchname [per-match-options]] [-j targetname [per-target-options]]

      -t table:默认为filter;其它可用的有raw, mangle, nat;

      COMMAND:

      对链操作:

         -P:policy,策略,定义默认策略; 一般有两种选择,ACCEPT和DROP;

         -N:new,新建一条自定义的规则链;被内建链上的规则调用才能生效

         -X:drop,删除自定义的引用计数为0的空链;

         -F:flush,清空指定的链;

         -E:重命名自定义的引用计数和为0的链;

      管理规则:

         -A:append,追加,在指定链的尾部追加一条规则;

         -I:insert,插入,在指定的位置(省略位置时表示链首)插入一条规则;

         -D:delelte,删除,删除指定的规则;

         -R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是整条规则完全替换;

      查看:

         -L:list,列出表中的链上的规则;

           -n:numeric,以数值格式显示;

           -v:verbose,显示详细格式信息;

           -vv,-vvv

           -x:exactly,计数器的精确结果;

           --line-numbers:显示链中的规则编号;

         计数器:

        规则,以及默认策略有专用的计数器;

        记录被当前规则所匹配到的:

            (1)报文个数;

            (2)字节总数;

        重置规则计数器:

             -Z:zero,置0;

      chain:

      (1)内建链;PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

      (2)自定义链;

      匹配条件:

      一条规则中存在多条匹配规则时,逻辑关系为“与”

        1)基本匹配条件:

          [!]-s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;

          [!]-d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;

         e.g.禁止172.16.10.17连接172.16.10.7主机

       ~]#iptables -A INPUT -s 172.16.10.17 -d 172.16.10.7 -j DROP

          [!]-p, --protocol protocol:

          protocol:{tcp|udp|icmp}

          [!]-i, --in-interface name:数据报文的流入接口;INPUT, FORWARD,PREROUTING

          [!]-o, --out-interface name:数据报文的流出接口:FORWARD,OUTPUT, POSTROUTING

        e.g. 将通过eno16777736网卡的所有请求全都拒绝

       ~]#iptables -A INPUT -i eno16777736 -j REJECT

       2)扩展匹配条件

         隐式扩展:不用-m选项指出matchname即可使用此match的专用选项进行匹配;

          -p tcp:隐含了-m tcp;

          [!]--source-port,--sport port[:port]:匹配报文中传输层的源端口;

      e.g.禁止所有请求访问tcp的23端口

       ~]#iptables -A INPUT -p tcp --dport 23 -j DROP

          [!]--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,RST  SYN

          [!]--syn:

          相当于--tcp-flags  SYN,ACK,FIN,RST  SYN

          -p udp:隐含了-m udp:

          [!]--source-port,--sport port[:port]:匹配报文中传输层的源端口;

          [!]--destination-port,--dport port[:port]:匹配报文中传输层的目标端口;

          -p icmp:隐含了-m icmp:

          [!] --icmp-type{type[/code]|typename}

            8:echo-request  用于请求

            0:echo-reply   用于应答

          e.g.禁止除172.16.10.17外的所有主机对本机进行ping操作

          ~]#iptables -A INPUT ! -s 172.16.10.17 -d 172.16.10.7 -p icmp --icmp-type 8 -jDROP

          ~]#iptables -A OUTPUT ! -d 172.16.10.17 -s 172.16.10.7 -p icmp --icmp-type 0 -j DROP

       显式扩展:必须使用-m选项指出matchname,有的match可能存在专用的选项;

          multiport扩展

          以离散或连续的方式定义多端口匹配条件;

          [!]--source-ports,--sports port[,port|,port:port]...:指定多个源端口;

          [!]--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;

       e.g.禁止所有请求访问tcp的21,22,23,80端口

       ~]#iptables -A INPUT -p tcp –m multiport --dports 21:23,80 -j DROP

          [!] --portsport[,port|,port:port]...:指定多个端口;

          iprange扩展

          以连续的ip地址范围指明连续的多地址匹配条件;

          [!]--src-range from[-to]:源IP地址;

          [!]--dst-range from[-to]:目标IP地址;

          string扩展

          对报文中的应用层数据做字符串匹配检测;

          [!]--string pattern:要检测字符串模式;

          [!]--hex-string pattern:要检测的字符串模式,16进制编码;

          --algo{bm|kmp}

          time扩展

          根据报文到达的时间与指定的时间范围进行匹配度检测;

          --datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;

          --datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;

          --timestarthh:mm[:ss]  开始时间

          --timestop  hh:mm[:ss] 结束时间

          [!]--monthdays day[,day...]  开始日

          [!]--weekdays day[,day...]   结束日

         e.g.在周二,四,六的工作时间开放23号端口

         ~]#iptables -I INPUT -d 172.16.10.7 -p tcp --dport 23 -m time --timestart 09:00:00--timestop 18:00:00 --weekdays Tue,Thu,Sat -j ACCEPT

          connlimit扩展

          根据每客户端IP做并发连接数匹配; 

          --connlimit-upton:连接数数量小于等于n,此时应该允许;

          --connlimit-aboven:连接数数量大于n,此时应该拒绝; 

         ~]#iptables -A INPUT -d 172.16.100.67 -p tcp --dport 23 -m connlimit --connlimit-upto2 -j ACCEPT

          limit扩展

            基于收发报文的速率进行匹配;

          --limitrate[/second|/minute|/hour|/day]:平均速率

          --limit-burstnumber:峰值速率

          state扩展

          state STATE

          状态检测;连接追踪机制(conntrack);

               INVALID:无法识别的状态;

               ESTABLISHED:已建立的连接;

               NEW:新连接;

               RELATED:相关联的连接;

               UNTRACKED:未追踪的连接;

          状态追踪需要挂载nf_conntrack内核模块;

          追踪到的连接:/proc/net/nf_conntrack文件中 

          能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max

          此值可自行定义,建议必要时调整到足够大;

          不同的协议的连接追踪的时长:/proc/sys/net/netfilter/  

        e.g.如何开放被模式的ftp服务:

        装载追踪ftp协议的模块;

        ~]#modprobe nf_conntrack_ftp 

        放行命令连接

        ~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state ESTABLISHED -jACCEPT

        ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW -jACCEPT

        放行数据连接

        ~]iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED -j ACCEPT

     在FORWARD链上定义时需要注意下列几个问题:

       (1)请求-响应均经由FORWARD链,要注意规则的方向性;

       (2)如果可以启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行;

         e.g.仅让外部主机仅能访问192.168.10.27主机的httpd服务以及ftpd服务

         1)~]# iptables-A FORWARD 1 -d 192.168.10.27 -p tcp -m multiport --dports 21,80 -m state--state NEW -j ACCEPT

         2)~]# iptables-A FORWARD 3 -d 192.168.10.27 -m state --state ESTABLISHED,RELATED -j ACCEPT

         3)~]# iptables-A FORWARD -s 172.16.0.0/16 -d 192.168.10.27 -j DROP

         4)~]# modprobenf_conntrack_ftp

      自定义链:

         iptables-N chain_name  添加一条自定义链

         iptables-X chian_name    删除自定义链(删除前需要清空规则)

         iptables-E old_name new_name  重命名自定义链

         -j  chain_name  引用指定的自定义链

           通常自定义链最后需要添加一条RETURN已回到之前的主链

     处理动作

         ACCEPT:接收

         DROP:丢弃

         REJECT:拒绝

         REDIRECT:重定目标端口,只能使用在nat表上,以及PREROUTING,OUTPUT链上面,其他地方要使用则必须引用

         --to-portsport[-port]:映射至哪个目标端口;

         e.g.  将httpd服务的80端口映射至8088端口

         ~]#iptables -t nat -A PREROUTING -d 192.168.10.27 -p tcp --dport 80 -j REDIRECT--to-port 8088

        SNAT:修改源地址,只能使用在nat表上,以及POSTROUTING,INPUT链上面,其他地方要使用则必须引用,如果IP地址为动态引用则使用MASQUERADE

        --to-source  [ipaddr[-ipaddr]][:port[-port]]

        ~]#iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j SNAT --to-source172.16.10.17

      设置上述规则后,192.168.0.0网段的主机经过该路由时IP地址都会被转换为172.16.10.17,从而可以实现内网对外网的各种服务的访问

       DNAT:修改源地址,只能使用在nat表上,以及PREROUTING,OUTPUT链上面,其他地方要使用则必须引用

        --to-destination[ipaddr[-ipaddr]][:port[-port]]

        ~]#iptables -t nat -A PREROUTING -d 172.16.10.17 -p tcp --dport 80 -j DNAT--to-destination 192.168.10.27:8088

      当外部主机访问172.16.10.17主机的tcp协议的80端口时,会自动转至内网中的192.168.10.27主机的8088端口

       LOG:日志功能,日志保存在/var/log/messages中

         --log-prefix:给日志添加前缀

         --log-ip-options:日志中记录IP首部的信息

         e.g.将访问172.16.10.7主机tcp协议80端口情况记录日志

         ~]#iptables -A INPUT -d 172.16.10.7 -p tcp --dport 80 -j LOG --log-prefix "STRING"--log-ip-options

三.总结

   添加规则之时需要考量的问题:

      (1)报文的流经路径,判断添加规则至哪个链上;

      (2)确定要实现的功能,判断添加规则至哪个表上;

      (3)要指定的匹配条件,以用于匹配目标报文;

    添加规则后注意优化:

      (1)可安全放行所有入站及出站,且状态为ESTABLISHED的连接;

      (2)服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;

      (3)服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;

      (4)设置默认策略;

        (a)最后一条规则设定,在每个表的最后添加一条拒绝或接受的默认规则;

           iptables–A INPUT –d 172.16.10.17 –j DROP

        (b)默认策略设定;

关于如何进行iptables的使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


本文名称:如何进行iptables的使用
网页地址:http://scjbc.cn/article/iishse.html

其他资讯