Iptables基础

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

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

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

iptables的组成,四表五链:

    功能(表):

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

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

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

      filter:过滤,防火墙;

    链Chain:

      PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

    功能–链:

      raw:PREROUTING、OUTPUT

      mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

      nat:PREROUTING、OUTPUT、POSTROUTING

      filter:INPUT、FORWARD、OUTPUT

报文流向:

    流入本机:PREROUTING–>INPUT

    由本机流出:OUTPUT–>POSTROUTING

    转发:PREROUTING–>FORWARD–>POSTROUTING

Iptables基础

      

规则:

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

  查看规则:

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

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

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

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

          -v:verbose,详细信息;pkts包数量 bytes字节数

           -vv, -vvv

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

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

定义规则的格式:

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

       [-t table] :默认是filter

    COMMAND:

        -N:new,自定义一条新的规则链

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

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

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

        规则管理:

           -A:append,追加;

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

           -D:delete,删除;

              (1)指明规则序号;

              (2)指明规则本身;

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

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

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

匹配条件:

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

       -s:源地址;

       -d:目标地址;

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

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

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

       

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

      隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-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-request:8

               echo-reply:0

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]];

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

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

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

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

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

         2、iprange扩展指明连续的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

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

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

                bm:Boyer-Moore

                kmp:Knuth-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

        4、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…]

            –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

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

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

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

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

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

          令牌桶过滤器;

           –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

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

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

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

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

           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的主机的基于tcp的22,23,80,139,445,3306端口开放,其他主机都可以访问,而其他未开放的端口无法访问。

 

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

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

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

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

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

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

      (a)iptables -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)
Immortals、zcyImmortals、zcy
上一篇 2017-06-19 16:15
下一篇 2017-06-19 17:22

相关推荐

  • 一次完整的HTTP事务是怎样一个过程?

    声明:本文章中的说法仅是个人理解总结,不一定完全正确,但是可以有助于理解。 关于HTTP协议可以参考以下: HTTP协议漫谈 http://kb.cnblogs.com/page/140611/ HTTP协议概览 http://www.cnblogs.com/vamei/archive/2013/05/11/3069788.html 了解HTTP Heade…

    Linux干货 2015-03-10
  • Linux 文本处理,文本工具,查看,分析,统计文本文件,grep,正则表达式

    文本处理 各种文本工具,查看,分析,统计文本文件 grep 正则表达式 扩展正则表达式 sed cat -n f1 加行号(空格行都计算) cat -b f1 加行号(只计算有字符的行) cat -ns f1 加行号(压缩空行) cat -v f1 能看windows文件的M`符号 cat -T f1 能够显示里面的tab空位,显示为^I cat -A f1…

    Linux干货 2016-08-07
  • 文件通配符练习

    课后资料补充 * : 通配符,代表任意字符(0到多个)? : 通配符,代表一个字符# : 注释/ : 跳转符号,将特殊字符或通配符还原成一般符号| : 分隔两个管线命令的界定; : 连续性命令的界定~ : 用户的根目录$ : 变量前需要加的变量值! : 逻辑运算中的&q…

    Linux干货 2016-08-08
  • 马哥教育面授班22期:第一天课程练习

    Linux发展史:        1984年:Richard Stallman发起GNU项目和自由软件基金会创建开源的UNIX实用工具版本        创建通用公共许可证(GPL)        1991年:Linux Torvalds发…

    Linux干货 2017-05-16
  • 笔记–8.2–用户管理,权限管理

    ·硬链接,软链接区别 大小 链接数 设备,分区 类型 硬连接 一样大,显示的是本身的大小 会增加 不能跨分区 是一个文件,相同inode号,忘了位置可通过inode号找到源文件 软链接 不一样大,链接文件大小是路径的大小 不会增加 可以跨分区,跨设备 两个文件,不同inode号,像发小广告,忘了源连接,文件就找不到了 软链接格式:ln -s +绝对路径或相对…

    Linux干货 2016-08-05