zoukankan      html  css  js  c++  java
  • iptables之精髓(二)

    iptables实际操作

     使用-v选项后,iptables为我们展示的信息更多了,那么,这些字段都是什么意思呢?我们来总结一下

    pkts:对应规则匹配到的报文的个数。
    
    bytes:对应匹配到的报文包的大小总和。
    
    target:规则对应的target,往往表示规则对应的"动作",即规则匹配成功后需要采取的措施。
    
    prot:表示规则对应的协议,是否只针对某些协议应用此规则。
    
    opt:表示规则对应的选项。
    
    in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
    
    out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。
    
    source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。
    
    destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。

    policy:表示当前链的默认策略

    packets:表示当前链(上例为INPUT链)默认策略匹配到的包的数量,0 packets表示默认策略匹配到0个包。 bytes:表示当前链默认策略匹配到的所有包的大小总和。

    其实,我们可以把packets与bytes称作"计数器",上图中的计数器记录了默认策略匹配到的报文数量与总大小,
    "计数器"只会在使用-v选项时,才会显示出来。

    常用基本命令:

    1.1、查看对应表的所有规则,-t选项指定要操作的表,省略"-t 表名"时,默认表示操作filter表,-L表示列出规则,即查看规则。

    iptables -t 表名 -L

    1.2、查看指定表的指定链中的规则。

    iptables -t 表名 -L 链名

    1.3、查看指定表的所有规则,并且显示更详细的信息(更多字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出"计数器"的信息,由于上例中使用的选项都是短选项,所以一般简写为iptables -t 表名 -vL

    iptables -t 表名 -v -L

    1.4、表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址。

    iptables -t 表名 -n -L

    1.5、表示查看表的所有规则,并且显示规则的序号,--line-numbers选项表示显示规则的序号,注意,此选项为长选项,不能与其他短选项合并,不过此选项可以简写为--line,注意,简写后仍然是两条横杠,仍然是长选项。

    iptables --line-numbers -t 表名 -L

    1.6、表示查看表中的所有规则,并且显示更详细的信息(-v选项),不过,计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值,-x选项表示显示计数器的精确值。

    iptables -t 表名 -v -x -L

     1.7、当然,也可以只查看某张表中的某条链,此处以filter表的INPUT链为例

    iptables --line -t filter -nvxL

    添加规则

    注意点:添加规则时,规则的顺序非常重要

    2.1、在指定表的指定链的尾部添加一条规则,-A选项表示在对应链的末尾添加规则,省略-t选项时,表示默认操作filter表中的规则

    命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动作
    示例:iptables -t filter -A INPUT -s 192.168.1.146 -j DROP

    2.2、在指定表的指定链的首部添加一条规则,-I选型表示在对应链的开头添加规则

    命令语法:iptables -t 表名 -I 链名 匹配条件 -j 动作
    示例:iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT

    2.3、在指定表的指定链的指定位置添加一条规则

    命令语法:iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作
    示例:iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT

    2.4、设置指定表的指定链的默认策略默认动作),并非添加规则。

    命令语法:iptables -t 表名 -P 链名 动作
    示例:iptables -t filter -P FORWARD ACCEPT

    上例表示将filter表中FORWARD链的默认策略设置为ACCEPT

    删除规则

    注意点:如果没有保存规则,删除规则时请慎重

    3.1、按照规则序号删除规则,删除指定表的指定链的指定规则,-D选项表示删除对应链中的规则。

    命令语法:iptables -t 表名 -D 链名 规则序号
    示例:iptables -t filter -D INPUT 3

    上述示例表示删除filter表中INPUT链中序号为3的规则。

    3.2、按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则。

    命令语法:iptables -t 表名 -D 链名 匹配条件 -j 动作
    示例:iptables -t filter -D INPUT -s 192.168.1.146 -j DROP

    上述示例表示删除filter表中INPUT链中源地址为192.168.1.146并且动作为DROP的规则。

    3.3、删除指定表的指定链中的所有规则,-F选项表示清空对应链中的规则,执行时需三思。

    命令语法:iptables -t 表名 -F 链名
    示例:iptables -t filter -F INPUT

    3.4、删除指定表中的所有规则,执行时需三思。

    命令语法:iptables -t 表名 -F
    示例:iptables -t filter -F

    修改规则

    注意点:如果使用-R选项修改规则中的动作,那么必须指明原规则中的原匹配条件,例如源IP,目标IP等。

    4.1、修改指定表中指定链的指定规则,-R选项表示修改对应链中的规则,使用-R选项时要同时指定对应的链以及规则对应的序号,并且规则中原本的匹配条件不可省略。

    命令语法:iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作
    示例:iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT

    上述示例表示修改filter表中INPUT链的第3条规则,将这条规则的动作修改为ACCEPT, -s 192.168.1.146为这条规则中原本的匹配条件,如果省略此匹配条件,修改后的规则中的源地址可能会变为0.0.0.0/0。

    其他修改规则的方法先通过编号删除规则,再在原编号位置添加一条规则。

    4.2、修改指定表的指定链的默认策略(默认动作),并非修改规则,可以使用如下命令。

    命令语法:iptables -t 表名 -P 链名 动作
    示例:iptables -t filter -P FORWARD ACCEPT

    保存规则

    5.1、保存规则命令如下,表示将iptables规则保存至/etc/sysconfig/iptables文件中,如果对应的操作没有保存,那么当重启iptables服务以后

    service iptables save

    注意点:centos7中使用默认使用firewalld,如果想要使用上述命令保存规则,需要安装iptables-services,具体配置过程请回顾上文。

    5.2、或者使用如下方法保存规则

    iptables-save > /etc/sysconfig/iptables

    5.3、可以使用如下命令从指定的文件载入规则,注意:重载规则时,文件中的规则将会覆盖现有规则。

    iptables-restore < /etc/sysconfig/iptables

    基本匹配条件

    6.1、-s用于匹配报文的源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段。

    #示例如下
    iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP
    iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT
    iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT

    6.2、-d用于匹配报文的目标地址,可以同时指定多个目标地址,每个IP之间用逗号隔开,也可以指定为一个网段。

    #示例如下
    iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP
    iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT
    iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT

    6.3、-p用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh)

    #示例如下
    iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT
    iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT

    6.4、-i用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项。

    #示例如下
    iptables -t filter -I INPUT -p icmp -i eth4 -j DROP
    iptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP

    6.5、-o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。

    #示例如下
    iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP
    iptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP

    扩展匹配条件

    I)不是基本匹配条件的就是扩展匹配条件

    II)基本匹配条件我们可以直接使用,而如果想要使用扩展匹配条件,则需要依赖一些扩展模块,或者说,在使用扩展匹配条件之前,需要指定相应的扩展模块才行

    III)想要使用--dport这个扩展匹配条件,则必须依靠某个扩折模块完成,如果在没有使用-m指定对应的扩展模块名称的情况下,使用了扩展匹配条件,  iptables默认会调用与-p选项对应的协议名称相同的模块

    注意,-p tcp与 -m tcp并不冲突,-p用于匹配报文的协议,-m 用于指定扩展模块的名称,正好,这个扩展模块也叫tcp;如果协议和模块相同,则可以省略-m选项; iptables默认会调用与-p选项对应的协议名称相同的模块。

    7.1、tcp扩展模块

    常用的扩展匹配条件如下:

    -p tcp -m tcp --sport 用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围

    -p tcp -m tcp --dport 用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围

    -p tcp -m tcp --tcp-flags   "--tcp-flags"指的就是tcp头中的标志位

    -p tcp -m tcp --syn             可以使用"--syn"选项去匹配tcp新建连接的请求报文   

    用于匹配报文的tcp头的标志位

    #示例如下
    iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
    iptables
    -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT

    iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
    iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
    iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT
    iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT

    iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT

    7.2、multiport扩展模块

    常用的扩展匹配条件如下:

    -p tcp -m multiport --sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用"逗号"隔开

    -p udp -m multiport --dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用"逗号"隔开

    #示例如下
    iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
    iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
    iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT
    iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT
    iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT

     7.3、iprange模块

    包含的扩展匹配条件如下

    --src-range:指定连续的源地址范围

    --dst-range:指定连续的目标地址范围

    #示例
    iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP
    iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP
    iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP

    7.4、string模块

    常用扩展匹配条件如下

    --algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。

    --string:指定需要匹配的字符串

    #示例
    iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT
    iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT

    7.5、time模块

    常用扩展匹配条件如下

    --timestart:用于指定时间范围的开始时间,不可取反

    --timestop:用于指定时间范围的结束时间,不可取反

    --weekdays:用于指定"星期几",可取反

    --monthdays:用于指定"几号",可取反

    --datestart:用于指定日期范围的开始日期,不可取反

    --datestop:用于指定日期范围的结束时间,不可取反

    #示例
    iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
    iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
    iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 6,7 -j REJECT
    iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --monthdays 22,23 -j REJECT
    iptables -t filter -I OUTPUT -p tcp --dport 80  -m time ! --monthdays 22,23 -j REJECT
    iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
    iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
    iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT

    7.6、connlimit 模块

    常用的扩展匹配条件如下

    --connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。

    --connlimit-mask:此选项不能单独使用,在使用--connlimit-above选项时,配合此选项,则可以针对"某类IP段内的一定数量的IP"进行连接数量的限制,如果不明白可以参考上文的详细解释。

    #示例
    iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
    iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT
    iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT

    7.7、limit模块

    常用的扩展匹配条件如下

    --limit-burst:类比"令牌桶"算法,此选项用于指定令牌桶中令牌的最大数量,上文中已经详细的描述了"令牌桶"的概念,方便回顾。

    --limit:类比"令牌桶"算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second、minute 、hour、day。

    #示例 #注意,如下两条规则需配合使用,具体原因上文已经解释过,忘记了可以回顾。
    iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
    iptables -t filter -A INPUT -p icmp -j REJECT

    7.8、udp模块

    常用的扩展匹配条件

    --sport:匹配udp报文的源地址

    --dport:匹配udp报文的目标地址

    #示例
    iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
    iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT
    #可以结合multiport模块指定多个离散的端口

    7.9、icmp模块

    常用的扩展匹配条件

    --icmp-type:匹配icmp报文的具体类型

    #示例
    iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
    iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT
    iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT
    iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT
    iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT

    7.10、state模块

    从字面上理解,state可以译为状态,但是我们也可以用一个高大上的词去解释它,state模块可以让iptables实现"连接追踪"机制。

    注意:如下报文状态都是对于state模块来说的。

    NEW:连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW。
    
    ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。
    
    RELATED:从字面上理解RELATED译为关系,但是这样仍然不容易理解,我们举个例子。

      INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文。

      UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接。

    #示例:在filter表中创建IN_WEB自定义链
    iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    自定义链

    注意:自定义链并不能直接使用,而是需要被默认链引用才能够使用,空口白话说不明白,等到示例时我们自然会明白

    8.1、创建自定义链

    #示例:在filter表中创建IN_WEB自定义链
    iptables -t filter -N IN_WEB

    8.2、引用自定义链

    #示例:在INPUT链中引用刚才创建的自定义链
    iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB

    8.3、重命名自定义链

    #示例:将IN_WEB自定义链重命名为WEB
    iptables -E IN_WEB WEB

    8.4、删除自定义链

    删除自定义链需要满足两个条件

    1、自定义链没有被引用

    2、自定义链中没有任何规则

    #示例:删除引用计数为0并且不包含任何规则的WEB链
    iptables -X WEB

    网络防火墙

    #如果想要iptables作为网络防火墙,iptables所在主机开启核心转发功能,以便能够转发报文。
    #使用如下命令查看当前主机是否已经开启了核心转发,0表示为开启,1表示已开启
    cat /proc/sys/net/ipv4/ip_forward
    #使用如下两种方法均可临时开启核心转发,立即生效,但是重启网络配置后会失效。
    方法一:echo 1 > /proc/sys/net/ipv4/ip_forward
    方法二:sysctl -w net.ipv4.ip_forward=1
    #使用如下方法开启核心转发功能,重启网络服务后永久生效。
    配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中将 net.ipv4.ip_forward设置为1
     
    #由于iptables此时的角色为"网络防火墙",所以需要在filter表中的FORWARD链中设置规则。
    #可以使用"白名单机制",先添加一条默认拒绝的规则,然后再为需要放行的报文设置规则。
    #配置规则时需要考虑"方向问题",针对请求报文与回应报文,考虑报文的源地址与目标地址,源端口与目标端口等。
    #示例为允许网络内主机访问网络外主机的web服务与sshd服务。
    iptables -A FORWARD -j REJECT
    iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
    iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT
    iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
    iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 22 -j ACCEPT
     
    #可以使用state扩展模块,对上述规则进行优化,使用如下配置可以省略许多"回应报文放行规则"。
    iptables -A FORWARD -j REJECT
    iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
    iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
    iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

    一些注意点:

    1、当测试网络防火墙时,默认前提为网络已经正确配置。

    2、当测试网络防火墙时,如果出现问题,请先确定主机防火墙规则的配置没有问题。

  • 相关阅读:
    (转载)SAPI 包含sphelper.h编译错误解决方案
    C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
    504. Base 7(LeetCode)
    242. Valid Anagram(LeetCode)
    169. Majority Element(LeetCode)
    100. Same Tree(LeetCode)
    171. Excel Sheet Column Number(LeetCode)
    168. Excel Sheet Column Title(LeetCode)
    122.Best Time to Buy and Sell Stock II(LeetCode)
    404. Sum of Left Leaves(LeetCode)
  • 原文地址:https://www.cnblogs.com/liugp/p/11673381.html
Copyright © 2011-2022 走看看