Iptables基础

   Firewall:防火墙,工作于主机或网络的边缘处,对于进出本主机或网络的报文根据事先定义好的检查规则左匹配检测,对于能够被规则所匹配到的报文进行相应的处理的组件。

  防火墙可分为:硬件防火墙,在硬件级别实现部分功能的防火墙;软件防火墙,应用软件处理逻辑运行于通用硬件平台之上的防火墙;主机防火墙,服务范围为当前主机;网络防火墙,服务范围为局域网。

   在设置防火墙时建议设置白名单,这样要更加稳妥。

iptables的组成,四表五链:

    功能()

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

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

      natnetwork address
translation
,用于修改源IP或目标IP,也可以修改端口;

      filter:过滤,防火墙;

    Chain

      PREROUTINGINPUT、FORWARDOUTPUT、POSTROUTING

    功能–链:

      rawPREROUTINGOUTPUT

      manglePREROUTINGINPUT、FORWARDOUTPUT、POSTROUTING

      natPREROUTINGOUTPUTPOSTROUTING

      filterINPUTFORWARDOUTPUT

报文流向

    流入本机:PREROUTING–>INPUT

    由本机流出:OUTPUT–>POSTROUTING

    转发:PREROUTING–>FORWARD–>POSTROUTING

Iptables基础

      

规则

   组成部分根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作做出处理;

  查看规则

    iptables -L list,列出指定链上的所有规则;

          –line-numbers:显示规则在当前链上的序号;

    注意:下边的是选项用来修饰命令的放在前边

         -nnumberic,以数字格式显示地址和端口号,跳过反解;

          -vverbose,详细信息;pkts包数量 bytes字节数

           -vv, -vvv

         -xexactly,显示计数器结果的精确值;

    查看某个特定的链后边直接加上链名即可:iptables -vnL INPUT

定义规则的格式

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

       [-t table]默认是filter

    COMMAND

        -Nnew,自定义一条新的规则链

        -Xdelet,删除自定义的规则链;注意:若是有引用、规则、不是自定义链的都删不掉;

        -Ppolicy,设置默认策略;对于filter表中的链而言,默认的策略有:ACCEPT:接受DROP:丢弃;REJECT:拒绝,立即回应;

        -E:重新命名自定义链;引用记数不为0的自定义链不能够重命名。

        规则管理:

           -Aappend,追加;

           -Iinsert, 插入,要指明位置,省略时表示第一条;

           -Ddelete,删除;

              (1)指明规则序号;

              (2)指明规则本身;

           -Rreplace,替换指定链上的指定规则,要替换整个规则本身;

           -Fflush,清空指定的规则链;

           -Zzero,置零;后加上指定置零的链,不加默认为将指定表上的链的规则全部置零

匹配条件:

    基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供

       -s:源地址;

       -d:目标地址;

       -p:协议tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh or “all”

       -i,–in-interface name(网卡名):数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTINGINPUTFORWARD链;

       -o–out-interface name(网卡名):数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARDOUTPUTPOSTROUTING

       

    扩展匹配条件:需要加载扩展模块,方可生效;

      隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;

        tcp

         –source-port, –sport port[:port]:匹配报文的源端口;可以是端口范围;

         –destination-port,–dport port[:port]:匹配报文的目标端口;可以是端口范围;

         –tcp-flags  mask  comp

             mask是我们应该检查的flag,写成逗号分隔的列表: SYN,ACK,FIN,RST

            comp是以逗号分隔的必须设置的标志列表 :SYN

         例如:“–tcp-flags  SYN,ACK,FIN,RST  SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0

         –syn:用于匹配第一次握手,相当于”–tcp-flags  SYN,ACK,FIN,RST  SYN“;                             

       udp

         –source-port, –sport port[:port]:匹配报文的源端口;可以是端口范围;

         –destination-port,–dport port[:port]:匹配报文的目标端口;可以是端口范围;

                               

       icmp ping)用来探测网络通信的

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

               echo-request8

               echo-reply0

eg:

    允许其他主机ping通本机

     iptables -A INPUT -d 172.16.250.31 -p icmp -j ACCEPT

     iptables -A OUTPUT -s 172.16.250.31 -p icmp -j ACCEPT

    允许自己ping别人而别人无法ping自己

    iptables -I OUTPUT 2 -s 172.16.250.31 -p tcp icmp –icmp-type 8 -j ACCEPT

    iptables -I INPUT 2 -s 172.16.250.31 -p tcp icmp –icmp-type 0 -j ACCEPT

                        

    显式扩展:必须要手动加载扩展模块, [-m matchname [per-match-options]]

          1multiport扩展,以离散或连续的方式定义多端口匹配条件;最多指定15个端口;

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

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

              –ports port[,port|,port:port]…:指明多个端口;

 egiptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport –dports 22,80 -j ACCEPT

         2iprange扩展指明连续的ip地址范围;

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

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

eg iptables -A INPUT -d 172.16.100.67 -p tcp –dport 80 -m iprange –src-range 172.16.100.5-172.16.100.10 -j DROP

         3string扩展,对报文中的应用层数据做字符串模式匹配检测;

            –algo {bm|kmp}:字符串匹配检测算法;

                bmBoyer-Moore

                kmpKnuth-Pratt-Morris

            –string pattern:要检测的字符串模式;

            –hex-string pattern:要检测的字符串模式,16进制格式;

    eg iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp –sport 80 -m string –algo bm –string “gay” -j REJECT

        4time扩展,根据将报文到达的时间与指定的时间范围进行匹配;

            –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…]

            –kerneltz:使用内核上的时区,而非默认的UTC

    eg iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp –dport 80 -m time –timestart 14:30 –timestop 18:30 –weekdays Sat,Sun –kerneltz -j DROP

       5connlimit扩展,根据每客户端IP做并发连接数数量匹配限制;

           –connlimit-upto n:连接的数量小于等于n时匹配;

           –connlimit-above n:连接的数量大于n时匹配;

    egiptables -A INPUT -d 172.16.100.67 -p tcp –dport 21 -m connlimit –connlimit-above 2 -j REJECT

       6limit扩展,基于收发报文的速率做限制;

          令牌桶过滤器;

           –limit rate[/second|/minute|/hour|/day]

           –limit-burst number 最多能有多少报文

    eg iptables -I INPUT -d 172.16.100.67 -p icmp –icmp-type 8 -m limit –limit 3/minute –limit-burst 5 -j ACCEPT

       iptables -I INPUT 2 -p icmp -j REJECT

    限制本机某tcp服务接收新请求的速率:–syn -m limit

       7state扩展,根据”连接追踪机制“去检查连接的状态;

           conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:

           NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;

           ESTABLISHEDNEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;

           RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;要想开放ftp功能需要手动装载 nf_conntrack_ftp

           INVALID:无效的连接;

           UNTRACKED:未进行追踪的连接;

               –state STATE

eg

    iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport –dports 22:23,80,139,445,3306 -m state –state NEW -j ACCEPT

iptables -A INPUT -d 172.16.100.67 -m state –state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 172.16.100.67 -m state –state ESTABLISHED -j ACCEPT

iptables -A INPUT -d 172.16.100.67 -j REJECT

iptables -A OUTPUT -s 172.16.100.67 -j REJECT

这一套下来,将IP地址为172.16.100.67的主机的基于tcp22,23,80,139,4453306端口开放,其他主机都可以访问,而其他未开放的端口无法访问。

 

这里对于规则优化提出一些建议

    服务器端规则设定:任何不允许的访问,应该在请求到达时给予拒绝;

    (1)优先放行双方向状态为ESTABLSHED的报文

    (2)服务于不同类别的功能的规则,匹配到报文可能性更大的放前面

    (3)服务于同一类别的功能的规则,匹配条件较严格的放在前面

    (4)设置默认策略:白名单机制

      aiptables -P,不建议;

      b)建议在规则的最后定义规则作为默认策略

处理动作:

   -j targetname [per-target-options]

      ACCEPT

      DROP

      REJECT

      RETURN:返回调用链;

      REDIRECT:端口重定向;

      LOG:记录日志;

      MARK:做防火墙标记;

      DNAT:目标地址转换;

      SNAT:源地址转换;

      MASQUERADE:地址伪装;

                             

 

   添加规则时要考虑:1、实现哪种功能:判断添加到那个表上;

            2、报文流经的路径:判断添加到哪个链上;

     链上的规则次序,即为检查的顺序,要注意:

             1、同类规则(访问同一应用),范围小的要放在上面;

            2、不同类的规则(访问不同规则),匹配到报文频率较大的放在上面;

            3、将那些可由一条规则描述的多个规则合并起来;

            4、设置默认策略。

    规则读取优先级:由上到下,所以编写规则先小范围再大范围

eg1

            设置白名单,将所有的链置为DROP

   允许172.16.网段的ip地址以tcp协议的服务访问本机(能够放行ssh服务,注意在做测试时先放行自己的ssh服务)

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.250.31 -p tcp -j ACCEPT

iptables -A OUTPUT -s 172.16.250.31 -d 172.16.0.0/16 -p tcp -j ACCEPT

(为防止不小心清空规则后,无法通过ssh连接主机)

之后可以设置:iptables -P INPUT DROP

 iptables -P OUTPUT DROP

 iptables -P FORWARD DROP

 将其他规则都设置为DROP(默认规则是ACCEPT

eg2

加入一条只开放ssh服务的规则

iptables I INPUT -s 172.16.0.0/16 -d 172.16.250.31 -p tcp –dport 22 -j ACCEPT

iptables I OUTPUT -s 172.16.250.31 -d 172.16.0.0/16 -p tcp –sport 22 -j ACCEPT

加入上一条规则后,可以加入 :iptables -A INPUT -d 172.16.250.31 -j REHECT

iptables -A OUTPUT -s 172.16.250.31 -j REJECT

或者修改网卡<一般用这个>iptables -A INPUT -i ens33 -j REJECT

iptables -A OUTPUT -i ens33 -j REJECT

因为此规则范围很大,将其放在最后,之后再添加规则要放在其前面)

若是默认规则修改过,则将默认规则修改为:

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT

规则的用效期限:

    使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限;

保存规则:

    保存规则至指定的文件:

     CentOS 6

       service iptables save

        将规则保存至/etc/sysconfig/iptables文件中;

            iptables-save  >  /PATH/TO/SOME_RULES_FILE

                    

     CentOS 7:

       iptables-save > /PATH/TO/SOME_RULES_FILE

重新载入预存规则文件中规则:

 CentOS 7:          

   iptables-restore < /PATH/FROM/SOME_RULES_FILE

       -n,–notfush:不清除原有规则

     他,-test:仅分析生成规则集,但不提交

 CentOS 6

    service iptables restart

默认重载/etc/sysconfig/iptables文件中的规则

配置文件:/etc/sysconfig/iptables-config

                    

自动生效规则文件中的规则

      (1) 用脚本保存各iptables命令;让此脚本开机后自动运行;

            /etc/rc.d/rc.local文件中添加脚本路径;

               /PATH/TO/SOME_SCRIPT_FILE  

      (2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则;

            /etc/rc.d/rc.local文件添加:

               iptables-restore
< /PATH/FROM/IPTABLES_RULES_FILE

 

原创文章,作者:Immortals、zcy,如若转载,请注明出处:http://www.178linux.com/78268

(0)
上一篇 2017-06-19 16:15
下一篇 2017-06-19 17:22

相关推荐

  • shell编程之条件判断和find查询

    使用read 来把输入值分配给一个或多个shell 变量: -p 指定要显示的提示 -t TIMEOUT read 从标准输入中读取值,给每个单词分配一个变量 所有剩余单词都被分配给最后一个变量 read -p “Enter a filename: “ FILE   条件选择if语句  多分支 if  CONDITION1 ; …

    Linux干货 2016-08-18
  • N22-℡浮生.若夢 ╮第四周作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 ~]# cp -r /etc/skel/ /home/tuser1 ~]# chmod -R 700 /home/tuser1 ~]#&nbsp…

    Linux干货 2016-09-19
  • 集中练习4-bash脚本、计划任务

    集中练习4-bash脚本、计划任务

    Linux干货 2017-10-27
  • 有关脚本的一些使用及其注意事项

    1,shell 脚本 格式要求:首行shebang机制                  #!/bin/bash       &n…

    2017-08-05
  • Shell脚本编程 流程控制—选择

    流程控制可根据不同的情况做不同的处理,而且可重复执行指定的程序区域,在shell bash中流程控制可分为两大类: "选择"和"循环" 1.选择:if、case、select 2.循环:for、while、until、select 命令结束状态返回值: 在shell中命令执行状态返回值分两种,成功和失败,0表示成功,非…

    Linux干货 2016-08-24
  • linux命令简单应用

    创建/tmp目录下的:a_c, a_d, b_c, b_d touch /tmp/{a,b}_{c,d} [root@bogon ~]# tree /tmp /tmp |– a_c |– a_d |– b_c |– b_d 创建/tmp/mylinux目录下的: mylinux/ ├── bin ├── boo…

    Linux干货 2016-11-06