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

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻标题:如何进行iptables的使用-创新互联
本文路径:http://pwwzsj.com/article/gggis.html