上一篇文章中,咱们已经学会了怎样使用iptables命令查看规则,那么这篇文章咱们就来总结一下,怎样管理规则。前端
以前,咱们把查看iptables规则的操做比做"增删改查"当中的"查",那么在这篇文章中,咱们就聊聊怎样对iptables进行"增、删、改"操做。python
注意:在参照本文进行iptables实验时,请务必在我的的测试机上进行,由于若是iptables规则设置不当,有可能使你没法链接到远程主机中。面试
首先,咱们来回顾一下什么是iptables的规则。centos
以前打过一个比方,每条"链"都是一个"关卡",每一个经过这个"关卡"的报文都要匹配这个关卡上的规则,若是匹配,则对报文进行对应的处理,好比说,你我二人此刻就好像两个"报文",你我二人此刻都要入关,但是城主有命,只有器宇轩昂之人才能入关,不符合此条件的人不能入关,因而守关将士按照城主制定的"规则",开始打量你我二人,最终,你顺利入关了,而我已被拒之门外,由于你符合"器宇轩昂"的标准,因此把你"放行"了,而我不符合标准,因此没有被放行,其实,"器宇轩昂"就是一种"匹配条件","放行"就是一种"动做","匹配条件"与"动做"组成了规则。服务器
只不过,在iptables的世界中,最经常使用的匹配条件并非"器宇轩昂",而是报文的"源地址"、"目标地址"、"源端口"、"目标端口"等,在iptables的世界中,最经常使用的动做有ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝),其中ACCEPT就与咱们举例中的"放行"相似,可是,咱们刚才提到的这些并非所有的匹配条件与动做,只是最经常使用的一些罢了,具体的匹配条件与动做不是咱们今天讨论的重点,咱们会在之后的文章中再作总结。app
好了,咱们已经回顾了规则的概念,而且已经明白了,规则大体由两个逻辑单元组成,匹配条件与动做,那么多说无益,咱们来动手定义一条规则,此处仍然以filter表中的INPUT链为例,由于filter表负责"过滤"功能,而全部发往本机的报文若是须要被过滤,首先会通过INPUT链(PREROUTING链没有过滤功能),这与咱们所比喻的"入关"场景很是类似,因此,使用filter表的INPUT链为例,有助于咱们进行理解。ssh
首先,查看一下filter表中的INPUT链中的规则,查看规则的相关命令在前文已经总结了,此处再也不赘述,若是你忘了,请回顾前文。测试
使用以下命令查看filter表INPUT链的规则,下图中的规则为centos6默认添加的规则。centos7
注意:在参照本文进行iptables实验时,请务必在我的的测试机上进行。spa
为了准备一个从零开始的环境,咱们将centos6默认提供的规则清空,以便咱们进行实验,使用iptables -F INPUT命令清空filter表INPUT链中的规则,后面咱们会单独对清除规则的相关命令进行总结,此处不用纠结此命令。
清空INPUT链之后,filter表中的INPUT链已经不存在任何的规则,可是能够看出,INPUT链的默认策略是ACCEPT,也就是说,INPUT链默认"放行"全部发往本机的报文,当没有任何规则时,会接受全部报文,当报文没有被任何规则匹配到时,也会默认放行报文。
那么此刻,咱们就在另一台机器上,使用ping命令,向当前机器发送报文,以下图所示,ping命令能够获得回应,证实ping命令发送的报文已经正常的发送到了防火墙所在的主机,ping命令所在机器IP地址为146,当前测试防火墙主机的IP地址为156,咱们就用这样的环境,对iptables进行操做演示。
那么此处,咱们就在156上配置一条规则,拒绝192.168.1.146上的全部报文访问当前机器,以前一直在说,规则由匹配条件与动做组成,那么"拒绝192.168.1.146上的全部报文访问当前机器"这条规则中,报文的"源地址为192.168.1.146"则属于匹配条件,若是报文来自"192.168.1.146",则表示知足匹配条件,而"拒绝"这个报文,就属于对应的动做,好了,那么怎样用命令去定义这条规则呢?使用以下命令便可
上图中,使用 -t选项指定了要操做的表,此处指定了操做filter表,与以前的查看命令同样,不使用-t选项指定表时,默认为操做filter表。
使用-I选项,指明将"规则"插入至哪一个链中,-I表示insert,即插入的意思,因此-I INPUT表示将规则插入于INPUT链中,即添加规则之意。
使用-s选项,指明"匹配条件"中的"源地址",即若是报文的源地址属于-s对应的地址,那么报文则知足匹配条件,-s为source之意,表示源地址。
使用-j选项,指明当"匹配条件"被知足时,所对应的动做,上例中指定的动做为DROP,在上例中,当报文的源地址为192.168.1.146时,报文则被DROP(丢弃)。
再次查看filter表中的INPUT链,发现规则已经被添加了,在iptables中,动做被称之为"target",因此,上图中taget字段对应的动做为DROP。
那么此时,咱们再经过192.168.1.146去ping主机156,看看可否ping通。
如上图所示,ping 156主机时,PING命令一直没有获得回应,看来咱们的iptables规则已经生效了,ping发送的报文压根没有被156主机接受,而是被丢弃了,因此更不要说什么回应了,好了,咱们已经成功的配置了一条iptables规则,看来,咱们已经入门了。
还记得咱们在前文中说过的"计数器"吗?此时,咱们再次查看iptables中的规则,能够看到,已经有24个包被对应的规则匹配到,总计大小2016bytes。
此刻,咱们来作一个实验。
如今INPUT链中已经存在了一条规则,它拒绝了全部来自192.168.1.146主机中的报文,若是此时,咱们在这条规则以后再配置一条规则,后面这条规则规定,接受全部来自192.168.1.146主机中的报文,那么,iptables是否会接受来自146主机的报文呢?咱们动手试试。
使用以下命令在filter表的INPUT链中追加一条规则,这条规则表示接受全部来自192.168.1.146的发往本机的报文。
上图中的命令并无使用-t选项指定filter表,咱们一直在说,不使用-t选项指定表时表示默认操做filter表。
上图中,使用-A选项,表示在对应的链中"追加规则",-A为append之意,因此,-A INPUT则表示在INPUT链中追加规则,而以前示例中使用的-I选项则表示在链中"插入规则",聪明如你必定明白了,它们的本意都是添加一条规则,只是-A表示在链的尾部追加规则,-I表示在链的首部插入规则而已。
使用-j选项,指定当前规则对应的动做为ACCEPT。
执行完添加规则的命令后,再次查看INPUT链,发现规则已经成功"追加"至INPUT链的末尾,那么如今,第一条规则指明了丢弃全部来自192.168.1.146的报文,第二条规则指明了接受全部来自192.168.1.146的报文,那么结果究竟是怎样的呢?实践出真知,在146主机上再次使用ping命令向156主机发送报文,发现仍然是ping不通的,看来第二条规则并无生效。
并且从上图中第二条规则的计数器能够看到,根本没有任何报文被第二条规则匹配到。
聪明如你必定在猜测,发生上述状况,会不会与规则的前后顺序有关呢?测试一下不就知道了,咱们再添加一条规则,新规则仍然规定接受全部来自192.168.1.146主机中的报文,只是这一次,咱们将新规则添加至INPUT链的最前面试试。
在添加这条规则以前,咱们先把146上的ping命令强制中止了,而后使用以下命令,在filter表的INPUT链的前端添加新规则。
好了,如今第一条规则就是接受全部来自192.168.1.146的报文,并且此时计数是0,此刻,咱们再从146上向156发起ping请求。
146上已经能够正常的收到响应报文了,那么回到156查看INPUT链的规则,第一条规则的计数器已经显示出了匹配到的报文数量。
看来,规则的顺序很重要。
若是报文已经被前面的规则匹配到,iptables则会对报文执行对应的动做,即便后面的规则也能匹配到当前报文,颇有可能也没有机会再对报文执行相应的动做了,就以上图为例,报文先被第一条规则匹配到了,因而当前报文被"放行"了,由于报文已经被放行了,因此,即便上图中的第二条规则即便可以匹配到刚才"放行"的报文,也没有机会再对刚才的报文进行丢弃操做了。这就是iptables的工做机制。
以前在总结查看命令时提到过,使用--line-number选项能够列出规则的序号,以下图所示
咱们也能够在添加规则时,指定新增规则的编号,这样咱们就能在任意位置插入规则了,咱们只要把刚才的命令稍做修改便可,以下。
仍然使用-I选项进行插入规则操做,-I INPUT 2表示在INPUT链中新增规则,新增的规则的编号为2,好了,本身动手试试吧。
注意:在参照本文进行iptables实验时,请务必在我的的测试机上进行。
此刻,若是咱们想要删除filter表中INPUT中的一条规则,该怎么作呢?
有两种办法
方法一:根据规则的编号去删除规则
方法二:根据具体的匹配条件与动做删除规则
那么咱们先看看方法一,先查看一下filter表中INPUT链中的规则
假如咱们想要删除上图中的第3条规则,则可使用以下命令。
上例中,使用了-t选项指定了要操做的表(没错,省略-t默认表示操做filter表),使用-D选项表示删除指定链中的某条规则,-D INPUT 3表示删除INPUT链中的第3条规则。
固然,咱们也能够根据具体的匹配条件与动做去删除规则,好比,删除下图中源地址为192.168.1.146,动做为ACCEPT的规则,因而,删除规则的命令以下。
上图中,删除对应规则时,仍然使用-D选项,-D INPUT表示删除INPUT链中的规则,剩下的选项与咱们添加规则时一毛同样,-s表示以对应的源地址做为匹配条件,-j ACCEPT表示对应的动做为接受,因此,上述命令表示删除INPUT链中源地址为192.168.1.146,动做为ACCEPT的规则。
而删除指定表中某条链中的全部规则的命令,咱们在一开始就使用到了,就是"iptables -t 表名 -F 链名"
-F选项为flush之意,即冲刷指定的链,即删除指定链中的全部规则,可是注意,此操做至关于删除操做,在没有保存iptables规则的状况下,请慎用。
其实,-F选项不只仅能清空指定链上的规则,其实它还能清空整个表中全部链上的规则,不指定链名,只指定表名便可删除表中的全部规则,命令以下
iptables -t 表名 -F
不过再次强调,在没有保存iptables规则时,请勿随便清空链或者表中的规则,除非你明白你在干什么。
注意:在参照本文进行iptables实验时,请务必在我的的测试机上进行。
那么,咱们怎样修改某条规则中的动做呢?好比,我想把以下规则中的动做从DROP改成REJECT,改怎么办呢?
咱们可使用-R选项修改指定的链中的规则,在修改规则时指定规则对应的编号便可(有坑,慎行),示例命令以下
上例中,-R选项表示修改指定的链,使用-R INPUT 1表示修改INPUT链的第1条规则,使用-j REJECT表示将INPUT链中的第一条规则的动做修改成REJECT,注意:上例中, -s选项以及对应的源地址不可省略,即便咱们已经指定了规则对应的编号,可是在使用-R选项修改某个规则时,必须指定规则对应的本来的匹配条件(若是有多个匹配条件,都须要指定)。
若是上例中的命令没有使用-s指定对应规则中本来的源地址,那么在修改完成后,你修改的规则中的源地址会自动变为0.0.0.0/0(此IP表示匹配全部网段的IP地址),而此时,-j对应的动做又为REJECT,因此在执行上述命令时若是没有指明规则本来的源地址,那么全部IP的请求都被拒绝了(由于没有指定本来的源地址,当前规则的源地址自动变为0.0.0.0/0),若是你正在使用ssh远程到服务器上进行iptables设置,那么你的ssh请求也将会被阻断。
既然使用-R选项修改规则时,必须指明规则本来的匹配条件,那么咱们则能够理解为,只能经过-R选项修改规则对应的动做了,因此我以为,若是你想要修改某条规则,还不如先将这条规则删除,而后在一样位置再插入一条新规则,这样更好,固然,若是你只是为了修改某条规则的动做,那么使用-R选项时,不要忘了指明规则本来对应的匹配条件。
好了,上例中,咱们已经将规则中的动做从DROP改成了REJECT,那么DROP与REJECT有什么不一样呢?从字面上理解,DROP表示丢弃,REJECT表示拒绝,REJECT表达的意思好像更坚定一点,咱们再次从146主机上向156主机上发起ping请求,看看与以前动做为DROP时有什么不一样。
如上图所示,当156主机中的iptables规则对应的动做为REJECT时,从146上进行ping操做时,直接就提示"目标不可达",并无像以前那样卡在那里,看来,REJECT比DROP更加"干脆"。
其实,咱们还能够修改指定链的"默认策略",没错,就是下图中标注的默认策略。
每张表的每条链中,都有本身的默认策略,咱们也能够理解为默认"动做"。
当报文没有被链中的任何规则匹配到时,或者,当链中没有任何规则时,防火墙会按照默认动做处理报文,咱们能够修改指定链的默认策略,使用以下命令便可。
使用-t指定要操做的表,使用-P选项指定要修改的链,上例中,-P FORWARD DROP表示将表中FORWRD链的默认策略改成DROP。
在默认的状况下,咱们对"防火墙"所作出的修改都是"临时的",换句话说就是,当重启iptables服务或者重启服务器之后,咱们日常添加的规则或者对规则所作出的修改都将消失,为了防止这种状况的发生,咱们须要将规则"保存"。
centos7与centos6中的状况稍微有些不一样,咱们先说centos6中怎样保存iptables规则。
centos6中,使用"service iptables save"命令便可保存规则,规则默认保存在/etc/sysconfig/iptables文件中,若是你刚刚安装完centos6,在刚开始使用iptables时,会发现filter表中会有一些默认的规则,这些默认提供的规则其实就保存在/etc/sysconfig/iptables中, 保存规则的示例以下。
如上图所示,文件中保存了filter表中每条链的默认策略,以及每条链中的规则,因为其余表中并无设置规则,也没有使用过其余表,因此文件中只保存了filter表中的规则。
当咱们对规则进行了修改之后,若是想要修改永久生效,必须使用service iptables save保存规则,固然,若是你误操做了规则,可是并无保存,那么使用service iptables restart命令重启iptables之后,规则会再次回到上次保存/etc/sysconfig/iptables文件时的模样。
从如今开始,最好养成及时保存规则的好习惯。
centos7中,已经再也不使用init风格的脚本启动服务,而是使用unit文件,因此,在centos7中已经不能再使用相似service iptables start这样的命令了,因此service iptables save也没法执行,同时,在centos7中,使用firewall替代了原来的iptables service,不过不用担忧,咱们只要经过yum源安装iptables与iptables-services便可(iptables通常会被默认安装,可是iptables-services在centos7中通常不会被默认安装),在centos7中安装完iptables-services后,便可像centos6中同样,经过service iptables save命令保存规则了,规则一样保存在/etc/sysconfig/iptables文件中。
此处给出centos7中配置iptables-service的步骤
#配置好yum源之后安装iptables-service # yum install -y iptables-services #中止firewalld # systemctl stop firewalld #禁止firewalld自动启动 # systemctl disable firewalld #启动iptables # systemctl start iptables #将iptables设置为开机自动启动,之后便可经过iptables-service控制iptables服务 # systemctl enable iptables
上述配置过程只需一次,之后便可在centos7中愉快的使用service iptables save命令保存iptables规则了。
还可使用另外一种方法保存iptables规则,就是使用iptables-save命令
使用iptables-save并不能保存当前的iptables规则,可是能够将当前的iptables规则以"保存后的格式"输出到屏幕上。
因此,咱们可使用iptables-save命令,再配合重定向,将规则重定向到/etc/sysconfig/iptables文件中便可。
iptables-save > /etc/sysconfig/iptables
咱们也能够将/etc/sysconfig/iptables中的规则从新载入为当前的iptables规则,可是注意,未保存入/etc/sysconfig/iptables文件中的修改将会丢失或者被覆盖。
使用iptables-restore命令能够从指定文件中重载规则,示例以下
iptables-restore < /etc/sysconfig/iptables
再次提醒:重载规则时,现有规则将会被覆盖。
上文已经详细的举例并描述了怎样进行iptables规则管理,为了之后可以快速的回顾,咱们把上述命令总结一下。
注意点:添加规则时,规则的顺序很是重要
在指定表的指定链的尾部添加一条规则,-A选项表示在对应链的末尾添加规则,省略-t选项时,表示默认操做filter表中的规则
命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动做 示例:iptables -t filter -A INPUT -s 192.168.1.146 -j DROP
在指定表的指定链的首部添加一条规则,-I选型表示在对应链的开头添加规则
命令语法:iptables -t 表名 -I 链名 匹配条件 -j 动做 示例:iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT
在指定表的指定链的指定位置添加一条规则
命令语法:iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动做 示例:iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT
设置指定表的指定链的默认策略(默认动做),并不是添加规则。
命令语法:iptables -t 表名 -P 链名 动做 示例:iptables -t filter -P FORWARD ACCEPT
上例表示将filter表中FORWARD链的默认策略设置为ACCEPT
注意点:若是没有保存规则,删除规则时请慎重
按照规则序号删除规则,删除指定表的指定链的指定规则,-D选项表示删除对应链中的规则。
命令语法:iptables -t 表名 -D 链名 规则序号 示例:iptables -t filter -D INPUT 3
上述示例表示删除filter表中INPUT链中序号为3的规则。
按照具体的匹配条件与动做删除规则,删除指定表的指定链的指定规则。
命令语法:iptables -t 表名 -D 链名 匹配条件 -j 动做 示例:iptables -t filter -D INPUT -s 192.168.1.146 -j DROP
上述示例表示删除filter表中INPUT链中源地址为192.168.1.146而且动做为DROP的规则。
删除指定表的指定链中的全部规则,-F选项表示清空对应链中的规则,执行时需三思。
命令语法:iptables -t 表名 -F 链名 示例:iptables -t filter -F INPUT
删除指定表中的全部规则,执行时需三思。
命令语法:iptables -t 表名 -F 示例:iptables -t filter -F
注意点:若是使用-R选项修改规则中的动做,那么必须指明原规则中的原匹配条件,例如源IP,目标IP等。
修改指定表中指定链的指定规则,-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。
其余修改规则的方法:先经过编号删除规则,再在原编号位置添加一条规则。
修改指定表的指定链的默认策略(默认动做),并不是修改规则,可使用以下命令。
命令语法:iptables -t 表名 -P 链名 动做 示例:iptables -t filter -P FORWARD ACCEPT
上例表示将filter表中FORWARD链的默认策略修改成ACCEPT
保存规则命令以下,表示将iptables规则保存至/etc/sysconfig/iptables文件中,若是对应的操做没有保存,那么当重启iptables服务之后
service iptables save
注意点:centos7中使用默认使用firewalld,若是想要使用上述命令保存规则,须要安装iptables-services,具体配置过程请回顾上文。
或者使用以下方法保存规则
iptables-save > /etc/sysconfig/iptables
可使用以下命令从指定的文件载入规则,注意:重载规则时,文件中的规则将会覆盖现有规则。
iptables-restore < /etc/sysconfig/iptables
好了,这篇文章已经总结了怎样添加、删除、修改 iptables规则,与前文结合起来,咱们已经掌握了对iptables规则的"增删改查",同时,这篇文章也总结了如何设置链的默认策略,以及怎样保存iptables规则。