使用-v选项后,iptables为我们展示的信息更多了,那么,这些字段都是什么意思呢?我们来总结一下
policy:表示当前链的默认策略packets:表示当前链(上例为INPUT链)默认策略匹配到的包的数量,0packets表示默认策略匹配到0个包。bytes:表示当前链默认策略匹配到的所有包的大小总和。其实,我们可以把packets与bytes称作"计数器",上图中的计数器记录了默认策略匹配到的报文数量与总大小,"计数器"只会在使用-v选项时,才会显示出来。常用基本命令:
1.1、【查】看对应表的所有规则,-t选项指定要操作的表,省略"-t表名"时,默认表示操作filter表,-L表示列出规则,即查看规则。
iptables-t表名-L1.2、查看指定表的指定链中的规则。
iptables-t表名-L链名1.3、查看指定表的所有规则,并且显示更详细的信息(更多字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出"计数器"的信息,由于上例中使用的选项都是短选项,所以一般简写为iptables-t表名-vL
iptables-t表名-v-L1.4、表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址。
iptables-t表名-n-L1.5、表示查看表的所有规则,并且显示规则的序号,--line-numbers选项表示显示规则的序号,注意,此选项为长选项,不能与其他短选项合并,不过此选项可以简写为--line,注意,简写后仍然是两条横杠,仍然是长选项。
iptables--line-numbers-t表名-L1.6、表示查看表中的所有规则,并且显示更详细的信息(-v选项),不过,计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值,-x选项表示显示计数器的精确值。
iptables-t表名-v-x-L1.7、当然,也可以只查看某张表中的某条链,此处以filter表的INPUT链为例
iptables--line-tfilter-nvxL【增】加规则注意点:添加规则时,规则的顺序非常重要
2.1、在指定表的指定链的尾部添加一条规则,【-A】选项表示在对应链的末尾添加规则,省略-t选项时,表示默认操作filter表中的规则
命令语法:iptables-t表名-A链名匹配条件-j动作示例:iptables-tfilter-AINPUT-s192.168.1.146-jDROP2.2、在指定表的指定链的首部添加一条规则,【-I】选型表示在对应链的开头添加规则
命令语法:iptables-t表名-I链名匹配条件-j动作示例:iptables-tfilter-IINPUT-s192.168.1.146-jACCEPT2.3、在指定表的指定链的指定位置添加一条规则
命令语法:iptables-t表名-I链名规则序号匹配条件-j动作示例:iptables-tfilter-IINPUT5-s192.168.1.146-jREJECT2.4、设置指定表的指定链的默认策略(默认动作),并非添加规则。
命令语法:iptables-t表名-P链名动作示例:iptables-tfilter-PFORWARDACCEPT上例表示将filter表中FORWARD链的默认策略设置为ACCEPT
注意点:如果没有保存规则,删除规则时请慎重
3.1、按照规则序号删除规则,删除指定表的指定链的指定规则,【-D】选项表示删除对应链中的规则。
命令语法:iptables-t表名-D链名规则序号示例:iptables-tfilter-DINPUT3上述示例表示删除filter表中INPUT链中序号为3的规则。
3.2、按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则。
命令语法:iptables-t表名-D链名匹配条件-j动作示例:iptables-tfilter-DINPUT-s192.168.1.146-jDROP上述示例表示删除filter表中INPUT链中源地址为192.168.1.146并且动作为DROP的规则。
3.3、删除指定表的指定链中的所有规则,【-F】选项表示清空对应链中的规则,执行时需三思。
命令语法:iptables-t表名-F链名示例:iptables-tfilter-FINPUT3.4、删除指定表中的所有规则,执行时需三思。
命令语法:iptables-t表名-F示例:iptables-tfilter-F修【改】规则注意点:如果使用-R选项修改规则中的动作,那么必须指明原规则中的原匹配条件,例如源IP,目标IP等。
4.1、修改指定表中指定链的指定规则,-R选项表示修改对应链中的规则,使用-R选项时要同时指定对应的链以及规则对应的序号,并且规则中原本的匹配条件不可省略。
命令语法:iptables-t表名-R链名规则序号规则原本的匹配条件-j动作示例:iptables-tfilter-RINPUT3-s192.168.1.146-jACCEPT上述示例表示修改filter表中INPUT链的第3条规则,将这条规则的动作修改为ACCEPT,-s192.168.1.146为这条规则中原本的匹配条件,如果省略此匹配条件,修改后的规则中的源地址可能会变为0.0.0.0/0。
其他修改规则的方法:先通过编号删除规则,再在原编号位置添加一条规则。
4.2、修改指定表的指定链的默认策略(默认动作),并非修改规则,可以使用如下命令。
命令语法:iptables-t表名-P链名动作示例:iptables-tfilter-PFORWARDACCEPT保存规则5.1、保存规则命令如下,表示将iptables规则保存至/etc/sysconfig/iptables文件中,如果对应的操作没有保存,那么当重启iptables服务以后
serviceiptablessave注意点:centos7中使用默认使用firewalld,如果想要使用上述命令保存规则,需要安装iptables-services,具体配置过程请回顾上文。
5.2、或者使用如下方法保存规则
iptables-save>/etc/sysconfig/iptables5.3、可以使用如下命令从指定的文件载入规则,注意:重载规则时,文件中的规则将会覆盖现有规则。
iptables-restore
#示例如下iptables-tfilter-IINPUT-s192.168.1.111,192.168.1.118-jDROPiptables-tfilter-IINPUT-s192.168.1.0/24-jACCEPTiptables-tfilter-IINPUT!-s192.168.1.0/24-jACCEPT6.2、-d用于匹配报文的目标地址,可以同时指定多个目标地址,每个IP之间用逗号隔开,也可以指定为一个网段。
#示例如下iptables-tfilter-IOUTPUT-d192.168.1.111,192.168.1.118-jDROPiptables-tfilter-IINPUT-d192.168.1.0/24-jACCEPTiptables-tfilter-IINPUT!-d192.168.1.0/24-jACCEPT6.3、-p用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh)
#示例如下iptables-tfilter-IINPUT-ptcp-s192.168.1.146-jACCEPTiptables-tfilter-IINPUT!-pudp-s192.168.1.146-jACCEPT6.4、-i用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项。
#示例如下iptables-tfilter-IINPUT-picmp-ieth4-jDROPiptables-tfilter-IINPUT-picmp!-ieth4-jDROP6.5、-o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。
#示例如下iptables-tfilter-IOUTPUT-picmp-oeth4-jDROPiptables-tfilter-IOUTPUT-picmp!-oeth4-jDROP扩展匹配条件I)不是基本匹配条件的就是扩展匹配条件
II)基本匹配条件我们可以直接使用,而如果想要使用扩展匹配条件,则需要依赖一些扩展模块,或者说,在使用扩展匹配条件之前,需要指定相应的扩展模块才行
III)想要使用--dport这个扩展匹配条件,则必须依靠某个扩折模块完成,如果在没有使用-m指定对应的扩展模块名称的情况下,使用了扩展匹配条件,iptables默认会调用与-p选项对应的协议名称相同的模块
注意,-ptcp与-mtcp并不冲突,-p用于匹配报文的协议,-m用于指定扩展模块的名称,正好,这个扩展模块也叫tcp;如果协议和模块相同,则可以省略-m选项;iptables默认会调用与-p选项对应的协议名称相同的模块。
7.1、tcp扩展模块
常用的扩展匹配条件如下:
-ptcp-mtcp--sport用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围
-ptcp-mtcp--dport用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围
-ptcp-mtcp--tcp-flags"--tcp-flags"指的就是tcp头中的标志位
-ptcp-mtcp--syn可以使用"--syn"选项去匹配tcp新建连接的请求报文
用于匹配报文的tcp头的标志位
#示例如下iptables-tfilter-IOUTPUT-d192.168.1.146-ptcp-mtcp--sport22-jREJECTiptables-tfilter-IINPUT-s192.168.1.146-ptcp-mtcp--dport22:25-jREJECTiptables-tfilter-IINPUT-s192.168.1.146-ptcp-mtcp--dport:22-jREJECTiptables-tfilter-IINPUT-s192.168.1.146-ptcp-mtcp--dport80:-jREJECTiptables-tfilter-IINPUT-ptcp-mtcp--dport22--tcp-flagsSYN,ACK,FIN,RST,URG,PSHSYN-jREJECTiptables-tfilter-IOUTPUT-ptcp-mtcp--sport22--tcp-flagsSYN,ACK,FIN,RST,URG,PSHSYN,ACK-jREJECTiptables-tfilter-IINPUT-ptcp-mtcp--dport22--tcp-flagsALLSYN-jREJECTiptables-tfilter-IOUTPUT-ptcp-mtcp--sport22--tcp-flagsALLSYN,ACK-jREJECTiptables-tfilter-IINPUT-ptcp-mtcp--dport22--syn-jREJECT7.2、multiport扩展模块
-ptcp-mmultiport--sports用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用"逗号"隔开
-pudp-mmultiport--dports用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用"逗号"隔开
#示例如下iptables-tfilter-IOUTPUT-d192.168.1.146-pudp-mmultiport--sports137,138-jREJECTiptables-tfilter-IINPUT-s192.168.1.146-ptcp-mmultiport--dports22,80-jREJECTiptables-tfilter-IINPUT-s192.168.1.146-ptcp-mmultiport!--dports22,80-jREJECTiptables-tfilter-IINPUT-s192.168.1.146-ptcp-mmultiport--dports80:88-jREJECTiptables-tfilter-IINPUT-s192.168.1.146-ptcp-mmultiport--dports22,80:88-jREJECT7.3、iprange模块
包含的扩展匹配条件如下
--src-range:指定连续的源地址范围
--dst-range:指定连续的目标地址范围
#示例iptables-tfilter-IINPUT-miprange--src-range192.168.1.127-192.168.1.146-jDROPiptables-tfilter-IOUTPUT-miprange--dst-range192.168.1.127-192.168.1.146-jDROPiptables-tfilter-IINPUT-miprange!--src-range192.168.1.127-192.168.1.146-jDROP7.4、string模块
常用扩展匹配条件如下
--algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。
--string:指定需要匹配的字符串
#示例iptables-tfilter-IINPUT-ptcp--sport80-mstring--algobm--string"OOXX"-jREJECTiptables-tfilter-IINPUT-ptcp--sport80-mstring--algobm--string"OOXX"-jREJECT7.5、time模块
--weekdays:用于指定"星期几",可取反
--monthdays:用于指定"几号",可取反
--datestart:用于指定日期范围的开始日期,不可取反
#示例iptables-tfilter-IOUTPUT-ptcp--dport80-mtime--timestart09:00:00--timestop19:00:00-jREJECTiptables-tfilter-IOUTPUT-ptcp--dport443-mtime--timestart09:00:00--timestop19:00:00-jREJECTiptables-tfilter-IOUTPUT-ptcp--dport80-mtime--weekdays6,7-jREJECTiptables-tfilter-IOUTPUT-ptcp--dport80-mtime--monthdays22,23-jREJECTiptables-tfilter-IOUTPUT-ptcp--dport80-mtime!--monthdays22,23-jREJECTiptables-tfilter-IOUTPUT-ptcp--dport80-mtime--timestart09:00:00--timestop18:00:00--weekdays6,7-jREJECTiptables-tfilter-IOUTPUT-ptcp--dport80-mtime--weekdays5--monthdays22,23,24,25,26,27,28-jREJECTiptables-tfilter-IOUTPUT-ptcp--dport80-mtime--datestart2017-12-24--datestop2017-12-27-jREJECT7.6、connlimit模块
常用的扩展匹配条件如下
--connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。
--connlimit-mask:此选项不能单独使用,在使用--connlimit-above选项时,配合此选项,则可以针对"某类IP段内的一定数量的IP"进行连接数量的限制,如果不明白可以参考上文的详细解释。
#示例iptables-IINPUT-ptcp--dport22-mconnlimit--connlimit-above2-jREJECTiptables-IINPUT-ptcp--dport22-mconnlimit--connlimit-above20--connlimit-mask24-jREJECTiptables-IINPUT-ptcp--dport22-mconnlimit--connlimit-above10--connlimit-mask27-jREJECT7.7、limit模块
--limit-burst:类比"令牌桶"算法,此选项用于指定令牌桶中令牌的最大数量,上文中已经详细的描述了"令牌桶"的概念,方便回顾。
#示例#注意,如下两条规则需配合使用,具体原因上文已经解释过,忘记了可以回顾。iptables-tfilter-IINPUT-picmp-mlimit--limit-burst3--limit10/minute-jACCEPTiptables-tfilter-AINPUT-picmp-jREJECT7.8、udp模块
常用的扩展匹配条件
--sport:匹配udp报文的源地址
--dport:匹配udp报文的目标地址
#示例iptables-tfilter-IINPUT-pudp-mudp--dport137-jACCEPTiptables-tfilter-IINPUT-pudp-mudp--dport137:157-jACCEPT#可以结合multiport模块指定多个离散的端口7.9、icmp模块
--icmp-type:匹配icmp报文的具体类型
#示例iptables-tfilter-IINPUT-picmp-micmp--icmp-type8/0-jREJECTiptables-tfilter-IINPUT-picmp--icmp-type8-jREJECTiptables-tfilter-IOUTPUT-picmp-micmp--icmp-type0/0-jREJECTiptables-tfilter-IOUTPUT-picmp--icmp-type0-jREJECTiptables-tfilter-IINPUT-picmp--icmp-type"echo-request"-jREJECT7.10、state模块
从字面上理解,state可以译为状态,但是我们也可以用一个高大上的词去解释它,state模块可以让iptables实现"连接追踪"机制。
注意:如下报文状态都是对于state模块来说的。
NEW:连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW。ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。RELATED:从字面上理解RELATED译为关系,但是这样仍然不容易理解,我们举个例子。INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文。
#示例:在filter表中创建IN_WEB自定义链iptables-tfilter-IINPUT-mstate--stateRELATED,ESTABLISHED-jACCEPT自定义链注意:自定义链并不能直接使用,而是需要被默认链引用才能够使用,空口白话说不明白,等到示例时我们自然会明白
8.1、创建自定义链
#示例:在filter表中创建IN_WEB自定义链iptables-tfilter-NIN_WEB8.2、引用自定义链
#示例:在INPUT链中引用刚才创建的自定义链iptables-tfilter-IINPUT-ptcp--dport80-jIN_WEB8.3、重命名自定义链
#示例:将IN_WEB自定义链重命名为WEBiptables-EIN_WEBWEB8.4、删除自定义链
删除自定义链需要满足两个条件
1、自定义链没有被引用
2、自定义链中没有任何规则
1、当测试网络防火墙时,默认前提为网络已经正确配置。
2、当测试网络防火墙时,如果出现问题,请先确定主机防火墙规则的配置没有问题。