iptables管理

查看规则

iptables为我们预定义了4张表,它们分别是raw表、mangle表、nat表、filter表,不同的表拥有不同的功能。

查看filter表中的规则

iptables -t filter -L

-t	指定要操作的表,
-L	查看-t选项对应的表的规则,不加默认为所有规则

iptables查看地址段详细流量 iptables规则查看_iptables查看地址段详细流量


)]

上图中红色框部分为规则,箭头部分为链,INPUT链、FORWARD链、OUTPUT链,每条链中都有自己的规则,INPUT链、FORWARD链、OUTPUT链都拥有”过滤”的能力,所以,当我们要定义某条”过滤”的规则时,我们会在filter表中定义,但是具体在哪条”链”上定义规则呢?这取决于我们的工作场景。比如,我们需要禁止某个IP地址访问我们的主机,我们则需要在INPUT链上定义规则。因为报文发往本机时,会经过PREROUTING链与INPUT链,所以,如果我们想要禁止某些报文发往本机,我们只能在PREROUTING链和INPUT链中定义规则,但是PREROUTING链并不存在于filter表中,换句话说就是,PREROUTING关卡天生就没有过滤的能力,所以,我们只能在INPUT链中定义,当然,如果是其他工作场景,可能需要在FORWARD链或者OUTPUT链中定义过滤规则。

查看其他表中的规则,我们可以省略-t filter,当没有使用-t选项指定表时,默认为操作filter表,即iptables -L表示列出filter表中的所有规则。

iptables -t raw -L

iptables -t mangle -L

iptables -t nat -L

查看filter表中INPUT链的规则

iptable  -L FORWARD

iptable  -L FORWARD -v
-v : 查看更为详细的信息

iptables查看地址段详细流量 iptables规则查看_iptables_02


上图中只显示了filter表中FORWARD链中的规则(省略-t选项默认为filter表),可以使用-v选项,查看出更多的、更详细的信息

iptables查看地址段详细流量 iptables规则查看_linux_03


字段:

pkts:对应规则匹配到的报文的个数。

bytes:对应匹配到的报文包的大小总和。

target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施。

prot:表示规则对应的协议,是否只针对某些协议应用此规则。

opt:表示规则对应的选项。

in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。

out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。

source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。

destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。

iptables默认为我们进行了名称解析,因此上图中的源地址与目标地址都为anywhere,但是在规则非常多的情况下如果进行名称解析,效率会比较低,所以,在没有此需求的情况下,我们可以使用-n选项,表示不对IP地址进行名称反解,直接显示IP地址

iptable  -L FORWARD -vn

使用–line-numbers可显示规则的编号

iptable  -L FORWARD -vn --line-number

-–line-numbers选项并没有对应的短选项,不过我们缩写成–line时,centos中的iptables也可以识别。

表中的每个链的后面都有一个括号,括号里面有一些信息,如下图红色框位置,那么这些信息都代表了什么呢?我们来看看。

iptables查看地址段详细流量 iptables规则查看_iptables_04


policy表示当前链的默认策略,policy DROP表示上图中INPUT的链的默认动作为ACCEPT。

packets表示当前链(上例为INPUT链)默认策略匹配到的包的数量,0 packets表示默认策略匹配到0个包。

bytes表示当前链默认策略匹配到的所有包的大小总和。

增加规则

将测试机的防火墙filter表的INPUT规则清空

iptables -F INPUT

在另一台机器上去ping该测试机,ping命令可以得到回应,证明ping命令发送的报文已经正常的发送到了防火墙所在的主机

iptables查看地址段详细流量 iptables规则查看_iptables_05


此时,在测试机上面配置一条规则,拒绝另一台机器来访问测试机。

iptables -t filter -I INPUT -s 192.168.236.153 -j DROP

-t		指定了要操作的表
-I		指明将”规则”插入至哪个链中 在链的首部插入规则
-s		指明”匹配条件”中的”源地址”
-j		指明当”匹配条件”被满足时,所对应的动作

规则由匹配条件与动作组成,那么”拒绝另一台机器上的所有报文访问当前机器”这条规则中,报文的”源地址″则属于匹配条件,如果报文来自该机器,则表示满足匹配条件,而”拒绝”这个报文,就属于对应的动作

# 在指定位置插入新规则
iptables  -t filter -I INPUT 2 -S 192.168.236.153 -j DROP

-I INPUT 2		在INPUT链中新增规则,新增的规则的编号为2

查看规则如下:

iptables查看地址段详细流量 iptables规则查看_linux_06


再次查看filter表中的INPUT链,发现规则已经被添加了,在iptables中,动作被称之为”target”,所以,上图中taget字段对应的动作为DROP。此时再ping测试机,看是否能ping通:

iptables查看地址段详细流量 iptables规则查看_源地址_07


如上图所示,ping 154主机时,PING命令一直没有得到回应,说明iptables规则已经生效,ping发送的报文压根没有被154主机接受,而是被丢弃了。

现在INPUT链中已经存在了一条规则,它拒绝了所有来自154主机中的报文,如果此时,我们在这条规则之后再配置一条规则,后面这条规则规定,接受所有来自154主机中的报文,那么,iptables是否会接受来自154主机的报文呢?我们动手试试。

在filter表的INPUT链中追加一条规则,这条规则表示接受所有来自156主机的报文。

iptables -t filter -A INPUT -s 192.168.236.153 -j ACCEPT

-A	表示在对应的链中”追加规则 在链的尾部追加规则

iptables查看地址段详细流量 iptables规则查看_iptables_08


此时再ping测试机,看是否能ping通:

iptables查看地址段详细流量 iptables规则查看_源地址_09


发现无法ping通,查看测试机上规则的计数器可以看到,根本没有任何报文被第二条规则匹配到

iptables查看地址段详细流量 iptables规则查看_源地址_10

在这个基础上,在INPUT的前端添加一条允许的规则

iptables -t filter -I INPUT -s 192.168.236.153 -j ACCEPT

此时再ping测试机

iptables查看地址段详细流量 iptables规则查看_表名_11


发现可以ping通,查看规则可以发现第一条规则的计数器已经显示出了匹配到的报文数量。

iptables查看地址段详细流量 iptables规则查看_iptables查看地址段详细流量_12

结论:

如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了,就以上图为例,报文先被第一条规则匹配到了,于是当前报文被”放行”了,因为报文已经被放行了,所以,即使上图中的第二条规则即使能够匹配到刚才”放行”的报文,也没有机会再对刚才的报文进行丢弃操作了。这就是iptables的工作机制。

删除规则

删除filter表中INPUT中的一条规则,有两种办法

方法一:根据规则的编号去删除规则

方法二:根据具体的匹配条件与动作删除规则

# 使用方法一删除INPUT链中第三条规则
iptables -t filter -D INPUT 3

# 使用第二种方法 删除INPUT链中 匹配条件为源地址192.168.236.153,动作为ACCEPT的规则
iptables -t filter -D INPUT -s 192.168.236.153 -j ACCEPT

# 删除指定表中某条链中的所有规则
iptables -t 表名 -F 链名

# 删除整个表中所有链上的规则
iptables -t 表名 -F

-D	表示删除指定链中的某条规则
-F	flush,即冲刷指定的链,即删除指定链中的所有规则

修改规则

# 方法一 通过-R参数
iptables -t filter -R INPUT 1 -s 192.168.236.153 -J REJECT
注意:-s选项以及对应的源地址不可省略,即使我们已经指定了规则对应的编号,但是在使用-R选项修改某个规则时,必须指定规则对应的原本的匹配条件(如果有多个匹配条件,都需要指定),如果没有指定原本的源地址,当前规则的源地址自动变为0.0.0.0/0

-R			表示修改指定的链	-R INPUT 1 表示修改INPUT链的第1条规则
-j REJECT	表示将INPUT链中的第一条规则的动作修改为REJECT


# 方法二 可以先删除,在添加

# 修改默认策略
iptables -t filter -P FORWARD DROP
-P		指定要修改的链,-P FORWARD DROP表示将表中FORWRD链的默认策略改为DROP。

保存规则

在默认的情况下,我们对”防火墙”所做出的修改都是”临时的”,换句话说就是,当重启iptables服务或者重启服务器以后,我们平常添加的规则或者对规则所做出的修改都将消失,为了防止这种情况的发生,我们需要将规则”保存”。

centos7

systemctl disable firewalld

yum install iptables-services -y # 作为service则需要安装这个包

systemctl enable iptables

# 保存规则
service iptables save

命令小结

上文已经详细的举例并描述了怎样进行iptables规则管理,为了以后能够快速的回顾,我们把上述命令总结一下。

命令小节

iptables -t 表名 -L 			 		 # 查看对应表的所有规则
iptables -t 表名 -L 链名				# 查看指定表的指定链中的规则
iptables -t 表名 -v -L		 		 # 查看指定表的所有规则,并且显示更详细的信息(更多字段)
iptables -t 表名 -n -L		 		 # -n选项表示不解析IP地址
iptables --line-numbers -t 表名 -L	 # -–line-numbers选项表示显示规则的序号


iptables -t 表名 -A 链名 匹配条件 -j 动作  			# 指定表的指定链的尾部添加一条规则
iptables -t 表名 -I 链名 匹配条件 -j 动作				# 指定表的指定链的首部添加一条规则
iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作	  # 指定表的指定链的指定位置添加一条规则



iptables -t 表名 -D 链名 规则序号						# 删除指定表的指定链的指定规则
iptables -t 表名 -D 链名 匹配条件 -j 动作					# 删除指定表的指定链的指定规则
iptables -t 表名 -F 链名								# 删除指定表的指定链中的所有规则
iptables -t 表名 -F									# 删除指定表中的所有规则


iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作		# 修改指定表中指定链的指定规则
iptables -t 表名 -P 链名 动作									# 设置指定表的指定链的默认策略(默认动作)

service iptables save									# 保存规则