iptables规则管理
每条"链"都是一个"关卡",每个通过这个"关卡"的报文都要匹配这个关卡上的规则,如果匹配,则对报文进行对应的处理,比如说,你我二人此刻就好像两个"报文",你我二人此刻都要入关,可是城主有命,只有器宇轩昂之人才能入关,不符合此条件的人不能入关,于是守关将士按照城主制定的"规则",开始打量你我二人,最终,你顺利入关了,而我已被拒之门外,因为你符合"器宇轩昂"的标准,所以把你"放行"了,而我不符合标准,所以没有被放行,其实,"器宇轩昂"就是一种"匹配条件","放行"就是一种"动作","匹配条件"与"动作"组成了规则。
模拟环境
ping命令客户端:192.168.1.146 防火墙主机:192.168.1.156
增加规则
在156上配置一条规则,拒绝192.168.1.146上的所有报文访问当前机器,之前一直在说,规则由匹配条件与动作组成,那么"拒绝192.168.1.146上的所有报文访问当前机器"这条规则中,报文的"源地址为192.168.1.146"则属于匹配条件,如果报文来自"192.168.1.146",则表示满足匹配条件,而"拒绝"这个报文,就属于对应的动作
命名解析
-t选项指定了要操作的表,此处指定了操作filter表
-I INPUT表示将规则插入于INPUT链中,即添加规则之意
-s选项,指明"匹配条件"中的"源地址",即如果报文的源地址属于-s对应的地址,那么报文则满足匹配条件
-j选项,当报文的源地址为192.168.1.146时,报文则被DROP(丢弃)
那么此时,我们再通过192.168.1.146去ping主机156,发现已经无法ping通。查看iptables中的规则,可以看到,已经有24个包被对应的规则匹配到,总计大小2016bytes。
恢复教程
在filter表的INPUT链的前端添加新规则(第三条是用的-A参数增加的,发现未生效)。加完之后就可以ping通了,并查看计数器
指定位置插入语法
删除规则
方法一:根据规则的编号去删除规则
方法二:根据具体的匹配条件与动作删除规则
那么我们先看看方法一,先查看一下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
修改规则
那么,我们怎样修改某条规则中的动作呢?比如,我想把如下规则中的动作从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选项时,不要忘了指明规则原本对应的匹配条件。
当报文没有被链中的任何规则匹配到时,或者,当链中没有任何规则时,防火墙会按照默认动作处理报文,我们可以修改指定链的默认策略,使用如下命令即可。
使用-t指定要操作的表,使用-P选项指定要修改的链,上例中,-P FORWARD DROP表示将表中FORWRD链的默认策略改为DROP。
保存规则
centos6中:"service iptables save"命令即可保存规则,规则默认保存在/etc/sysconfig/iptables文件中,如果你刚刚安装完centos6,在刚开始使用iptables时,会发现filter表中会有一些默认的规则,这些默认提供的规则其实就保存
centos7中:在centos7中,使用firewall替代了原来的iptables service,不过不用担心,我们只要通过yum源安装iptables与iptables-services即可(iptables一般会被默认安装,但是iptables-services在centos7中一般不会被默认安装),在centos7中安装完iptables-services后,即可像centos6中一样保存
iptables-save > /etc/sysconfig/iptables 使用iptables-save命令,再配合重定向,将规则重定向到/etc/sysconfig/iptables文件中即可。
iptables-restore < /etc/sysconfig/iptables 使用iptables-restore命令可以从指定文件中重载规则