iptables详解:链、表、表链关系、规则的基本使用
目录
防火墙基本概念
什么是防火墙?
Netfilter与iptables的关系
链的概念
表的概念
表链关系
规则的概念
查询规则
添加规则
删除iptables中的记录
修改规则
更详细的命令(5链4表)
防火墙基本概念
什么是防火墙?
在计算中,防火墙是基于预定安全规则来监视和控制传入和传出网络流量的网络安全系统。该计算机流入流出的所有网络通信均要经过此防火墙。防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信,封锁特洛伊木马。最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。
防火墙分为软件防火墙和硬件防火墙,他们的优缺点: 硬件防火墙:拥有经过特别设计的硬件及芯片,性能高、成本高(当然硬件防火墙也是有软件的,只不过有部分功能由硬件实现,所以硬件防火墙其实是硬件+软件的方式); 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能比硬件防火墙低、成本低。
Netfilter与iptables的关系
Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。
Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
-
网络地址转换(Network Address Translate)
-
数据包内容修改
-
以及数据包过滤的防火墙功能
Netfilter平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTING
、INPUT
、OUTPUT
、FORWARD
、POST_ROUTING
。
Netfilter所设置的规则是存放在内核空间中的,而iptables是一个应用层的应用程序,它通过Netfilter放出的接口来对存放在内核空间中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件,类似的应用程序还有firewalld(CentOS7默认防火墙)。
所以Linux中真正的防火墙是Netfilter,但由于都是通过应用层程序如iptables或firewalld进行操作,所以我们一般把iptables或firewalld叫做Linux的防火墙。
注意:以上说的iptables都是针对IPv4的,如果IPv6,则要用ip6tables
,至于用法应该是跟iptables
是一样的。
注:Linux系统运行时,内存分内核空间和用户空间,内核空间是Linux内核代码运行的空间,它能直接调用系统资源,用户空间是指运行用户程序的空间,用户空间的程序不能直接调用系统资源,必须使用内核提供的接口“system call”。
链的概念
iptables开启后,数据报文从进入服务器到出来会经过5道关卡,分别为Prerouting(路由前)、Input(输入)、Outpu(输出)、Forward(转发)、Postrouting(路由后):
每一道关卡中有多个规则,数据报文必须按顺序一个一个匹配这些规则,这些规则串起来就像一条链,所以我们把这些关卡都叫“链”:
-
INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则;本机入站
-
OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则;本机出站
-
FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则;
-
PREROUTING链:(互联网进入局域网)在对数据包作路由选择之前,应用此链中的规则,如DNAT;
-
POSTROUTING链:(局域网出互联网)在对数据包作路由选择之后,应用此链中的规则,如SNAT。
其中中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。
表的概念
虽然每一条链上有多条规则,但有些规则的作用(功能)很相似,多条具有相同功能的规则合在一起就组成了一个“表”,iptables提供了四种“表”: – filter表:主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG),所谓的防火墙其实基本上是指这张表上的过滤规则,对应内核模块iptables_filter; – nat表:network address translation,网络地址转换功能,主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次,如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。对应内核模块iptables_nat; – mangle表:拆解报文,做出修改,并重新封装,主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。对应内核模块iptables_mangle;(应用少) – raw表:是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,在匹配数据包时,raw表的规则要优先于其他表,对应内核模块iptables_raw。(应用少) 我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中。
表链关系
重点的两个链:input post
重要的一个表:filter1
5条链(即5个关卡)中,并不是每条链都能应用所有类型的表,事实上除了Ouptput链能同时有四种表,其他链都只有两种或三种表:
实际上由上图我们可以看出,无论在哪条链上,raw表永远在mangle表上边,而mangle表永远在nat表上边,nat表又永远在filter表上边,这表明各表之间是有匹配顺序的。
前面说过,数据报文必须按顺序匹配每条链上的一个一个的规则,但其实同一类(即属于同一种表)的规则是放在一起的,不同类的规则不会交叉着放,按上边的规律,每条链上各个表被匹配的顺序为:raw→mangle→nat→filter。
前面说过,我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中,所以我们实际操作是对“表”进行操作的,所以我们反过来说一下,每种表都能用于哪些链:
表名 | 能应用的链 | ||||
---|---|---|---|---|---|
raw | prerouting | output | |||
mangle | prerouting | input | forward | output | postrouting |
nat | prerouting | input(仅centos7) | output | postrouting | |
filter | input | forward | output |
综上,数据包通过防火墙的流程可总结为下图:
规则的概念
iptables规则主要包含“条件&动作”,即匹配出符合什么条件(规则)后,对它采取怎样的动作。
匹配条件(五元组)
-
S_IP:source ip,源ip
-
S_PORT:source port,源端口
-
D_IP: destination ip,目标ip
-
D_PORT: destination port,目标端口
-
TCP/UDP:第四层(传输层)协议
处理的动作
-
ACCEPT:允许数据包通过;
-
DROP:直接丢弃数据包,不回应任何信息,客户端只有当该链接超时后才会有反应;
-
REJECT:拒绝数据包,会给客户端发送一个数据包被丢弃的响应的信息;
-
SNAT:S指Source,源NAT(源地址转换)。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决私网用户用同一个公网IP上网的问题;
-
MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上;
-
DNAT:D指Destination,目的NAT,解决私网服务端,接收公网请求的问题。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址;
-
REDIRECT:在本机做端口映射;
-
LOG:在
/var/log/messages
文件中记录日志信息,然后将数据包传递给下一条规则。 除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。
其中REJECT和DROP有点类似,以下是服务器设置REJECT和DROP后,ping这个服务器的响应的区别:
REJECT动作:
PING 10.37.129.9 (10.37.129.9): 56 data bytes
92 bytes from centos-linux-6.5.host-only (10.37.129.9): Destination Port Unreachable
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 29a3 0 0000 40 01 3ab1 10.37.129.2 10.37.129.9
Request timeout for icmp_seq 0
92 bytes from centos-linux-6.5.host-only (10.37.129.9): Destination Port Unreachable
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 999d 0 0000 40 01 cab6 10.37.129.2 10.37.129.9
DROP动作:
PING 10.37.129.9 (10.37.129.9): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 4
对iptables进行操作,其实就是对它的四种“表”进行“增删改查”操作。
查询规则
命令格式:iptables [选项] [参数]
常用选项:
-L
: list的缩写,list我们通常翻译成列表,意思是列出每条链上的规则,因为多条规则就是一个列表,所以用-L
来表示。
-L
后面还可以跟上5条链(POSTROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)的其中一条链名,注意链名必须全大写,如查看“INPUT链”上的规则:
iptables -L INPUT (这里默认就是-t filter)
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
不指定的话就是默认查看所有链上的规则列表:
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
-
Chain INPUT: INPUT链上的规则,同理,后面的“Chain FORWARD”、“Chain OUTPUT”分别是FORWARD链和OUTPUT链上的规则;
-
(policy ACCEPT): 表示默认策略是接受,即假如我没设置,那就是允许,只有我设置哪个不允许,才会不允许,示例中是安装iptables后的默认规则,由于默认是ACCEPT,你规则也设置为ACCEPT按道理来说是没什么意义的,因为你不设置也是ACCEPT呀,但事实上,是为了方便修改为REJECT/DROP等规则,说白了就是放在那,要设置的时候我们就可以直接修改;
-
target: 英文意思是“目标”,但该列的值通常是动作,比如ACCEPT(接受)、REJECT(拒绝)等等,但它确实可以是“目标”,比如我们创建 一条链
iptables -N July_filter
,然后在INPUT链上添加一条规则,让它跳转到刚刚的新链-A INPUT -p tcp -j July_filter
,再用iptables -L
查看,可以看到target此时已经是真正的“target(July_filter)”而不再是动作了:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
July_filter tcp -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain July_filter (1 references)
target prot opt source destination
-
prot: protocol,协议;
-
opt: option,选项;
-
source: 源地址(ip(可以是网段)/域名/主机名)
-
destination: 目标地址(ip(可以是网段)/域名/主机名)
-
末列: 一些额外的信息
-t
:前面-L
不是列出所有链的规则列表吗?为什么没有PREROUTING和POSTROUTING链呢?
因为有默认参数-t
,t是table的缩写,意思是指定显示哪张“表”中的规则(前面说过iptables有四种表),iptables -L
其实就相当于iptables -t filter -L
,即相当于你查看的是“filter”表中的规则。而根据前面的讲解,filter表只可用于INPUT、FORWARD、OUTPUT三条链中,这就是为什么iptables -L
不显示PREROUTING链和POSTROUTING链的原因。
-n
: numeric的缩写,numeric意思是数字的,数值的,意思是指定源和目标地址、端口什么的都以数字/数值的方式显示,否则默认会以域名/主机名/程序名等显示,该选项一般与-L
合用,因为单独的-n
是没有用的(没有-L
列表都不显示,所以用-n
就没有意义了)。
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
其中dpt:22
中的dpt是指destination port(目标端口),同理,spt就是source port(源端口)。
-v
: 基本上有点Linux常识的童鞋就应该知道,-v
在Linux命令里,一般都是指“verbose”,这个词的意思是是“冗余的,啰嗦的”,即输出更加详细的信息,在iptables这里也是这个意思,一般可以跟-L
连用:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
13627 1033K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- any any anywhere anywhere
0 0 ACCEPT all -- lo any anywhere anywhere
2 128 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:ssh
275 53284 REJECT all -- any any anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- any any anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 12506 packets, 1485K bytes)
pkts bytes target prot opt in out source destination
可以看到多了四列:
-
pkts: packets,包的数量;
-
bytes: 流过的数据包的字节数;
-
in: 入站网卡;
-
out: 出站网卡。
当然还可以跟前面的-n
合用:
iptables -n -v -L
-n:以数字的形式展示
-v:详细的输出
-L:指定查看的表(不指定则全部输出)
这样source和destination中用域名或者字符串表示的方式就换成ip了:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
13642 1034K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2 128 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
275 53284 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 12516 packets, 1489K bytes)
pkts bytes target prot opt in out source destination
稍微了解Linux命令的童鞋应该都知道,在很多情况下,Linux的选项是可以合并的,比如前面的iptables -n -v -L
其实是可以合并成iptables -nvL
的,并且参数顺序一般情况下是无关紧要的,比如iptables -vnL
也是一样的。
但是-L
一定要写在最后,原因是-L
是要接收参数的选项(虽然可以不传参数),而-v
和-n
是不需要接收参数的,假如你写成iptables -Lvn
,那就表示是用-n
来接收参数了,这肯定是不行的。
-x
: 加了-v
后,Policy那里变成了“(policy ACCEPT 0 packets, 0 bytes)”,即多了过滤的数据包数量和字节数,其中的字节数,如果数据大了之后,会自动转换单位,比如够KB不够MB,它会显示“xxxk”,够了MB它显示“MB”,但单位转换之后,就不完全精确了,因为它没有小数,如果还是想要看以“字母”即“byptes”为单位查看的话,加个-x
就行了,“x”来自于“exact”,意思是“精确的;准确的”,不取首字母应该是太多选项首字母是e了。
--line-numbers
: 如果你想列表有序号,可以加上该选项:
iptables -nvL --line-numbers
结果中多了一列“num”,就是序号:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 14739 1123K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 2 128 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 305 55948 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
6 0 0 July_filter tcp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 310 packets, 42772 bytes)
num pkts bytes target prot opt in out source destination
Chain July_filter (1 references)
num pkts bytes target prot opt in out source destination
其实,--line-numbers
并不用写全,不然也太长了,其实写成--line
就行了,甚至你不写最后一个e,即写成--lin
都行。
合并使用各选项的命令示例:
iptables --line -t filter -nvxL INPUT --list-number
n:数字的形式展示
v:展示详情
L:指定要查看的表(不指定则显示全部)
x:精准的
--line-number:增加列表
添加规则
我们可以向某条链中的某个表的最前面添加记录(我们叫“插入”,会用到-I
选项,I表示Insert(指定插入的位置)),也可以向某条链中的某个表的最后面添加记录(我们叫“追加”,会用到-A
选项,A表示Append(插入到末尾)),熟悉vi/vim
的童鞋会对这个“I”和“A”感觉到熟悉,因为在vi/vim
的命令模式下,按I
是在光标所行的行首插入,按A
是在光标所在行的行尾插入,跟这个在表头跟表尾插入非常像。
之所以有向前添加和向后添加,是因为如果前面规则的是丢弃或拒绝,那么后面的规则是不会起作用的;而如果前面的是接受后面的是丢弃或拒绝,则接受之后后面的丢弃或拒绝也是不会生效的。
向INPUT链的filter表中添加一条规则:
iptables -t(指定表) filter -I(指定插入) INPUT -s(匹配源ip) 10.37.129.2 -j(跳转) DROP
-
-t
: 是指定插入到哪个表中,不写的话默认为“filter”表; -
-I
: 指定插入到哪条链中,并且会在该链指定表(在这里是filter表)中的最前面插入(I:Input),如果用-A
则是在最后插入(A:Append)。 -
-s
: 匹配源ip,s: source,源。 -
-j
: jump,跳转的意思,后面可指定跳转的target(目标),比如自定义的链,当然更多的是跳转到“action(动作)”中,比如ACCEPT、DROP、REJECT等等。 -
整个意思,就是向iptables中的“INPUT”链(
-I INPUT
)的“filter”表(-t filter
)的最前面(-I
)添加一条记录,这次记录会匹配源地址为“10.39.129.2”的请求(-s 10.39.129.2
),并把该请求丢弃掉(-j DROP
)。
例如:
iptables -t filter -I INPUT -s 192.168.159.0/24 -j DROP
如果敲完命令后自己所连接的ip是该网段那么远程连接会断开
需要在虚拟机中删除这条记录,然后才能正常的远程登录
删除iptables中的记录
1、根据编号删除: 前面说过,查询iptables规则列表时,添加--line-numbers
简写成--line
即可显示记录编号,我们现在就可以根据这个编号来删除了:
iptables -t filter -D INPUT 2
-t filter
指定操作的表为filter表,-D
表示delete,后面跟的两个参数,第一个是链名,第二个是要删除的规则的编号。
例如:
iptables -t filter -D input 1
这样执行完成后,远程连接功能就会可以恢复了
2、根据条件删除:
iptables -t filter -D INPUT -s 10.37.129.2 -j DROP
删除INPUT链中的filter表中源地址为“10.37.129.2”并且动作为“DROP”的规则。
3、清空:-F -F
: flush的缩写,flush是“冲洗、冲掉”的意思,在这里是清空的意思,iptables -t filter -F INPUT
代表清空“INPUT”链中“filter”表中的所有规则,如果不指定链不指定表,即直接用iptables -F
,则清空所有链中所有表的规则。
注:在生产环境中轻易不要使用这个方法
修改规则
事实上用“替换”来描述会更好一点,因为所谓的修改其实就是把整个规则替换成新的规则:
iptables -t filter -R(replace) INPUT 1 -s 10.37.129.3 -j ACCEPT
其中的-R
就是replace,即替换的意思,整句命令意思是从INPUT链中的filter表中替换编号为1的规则,编号1后面的-s 10.37.129.3 -j ACCEPT
就是要替换成的新规则。
修改策略(policy):
iptables -P(policy) FORWARD DROP
-P
: policy,即策略。
整个意思是把FORWARD链的默认规则设置为DROP,iptables [-t table] -P chain target
这个说明,表示可以根据不同的表,设置不同的限制
iptables -t raw -P OUTPUT ACCEPT
iptables -t filter -P OUTPUT DROP
例如:
//防止自己的终端被禁止
iptables -t filter -I INPUT -s 192.168.159.0/24 -j ACCEPT
//将默认规则修改为DROP
iptables -P INPUT DROP
更详细的命令(5链4表)
-d
:destination,用于匹配报文的目标地址,可以同时指定多个ip(逗号隔开,逗号两侧都不允许有空格),也可指定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
-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
# 感叹号表示“非”,即除了匹配这个条件的都ACCEPT,但匹配这个条件不一定就是REJECT或DROP?这要看是否有为它特别写一条规则,如果没有写就会用默认策略:
iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT
上面的规则中,使用”! -s 192.168.1.146″表示对 -s 192.168.1.146这个匹配条件取反, -s 192.168.1.146表示报文源IP地址为192.168.1.146即可满足匹配条件,使用 “!” 取反后则表示,报文源地址IP只要不为192.168.1.146即满足条件,那么,上例中规则表达的意思就是,只要发往本机的报文的源地址不是192.168.1.146,就接受报文。
此刻,你猜猜,按照上例中的配置,如果此时从146主机上向防火墙所在的主机发送ping请求,146主机能得到回应吗?(此处不考虑其他链,只考虑filter表的INPUT链)
答案是:能,也就是说,按照上例的配置,146主机仍然能够ping通当前主机,为什么呢?我们来分析一下。
上例中,filter表的INPUT链中只有一条规则,这条规则要表达的意思就是:
只要报文的源IP不是192.168.1.146,那么就接受此报文,但是,某些小伙伴可能会误会,把上例中的规则理解成如下含义,
只要报文的源IP是192.168.1.146,那么就不接受此报文,这种理解与上述理解看似差别不大,其实完全不一样,这样理解是错误的,上述理解才是正确的。
换句话说就是,报文的源IP不是192.168.1.146时,会被接收,并不能代表,报文的源IP是192.168.1.146时,会被拒绝。
上例中,因为并没有任何一条规则指明源IP是192.168.1.146时,该执行怎样的动作,所以,当来自192.168.1.146的报文经过INPUT链时,并不能匹配上例中的规则,于是,此报文就继续匹配后面的规则,可是,上例中只有一条规则,这条规则后面没有其他可以匹配的规则,于是,此报文就会去匹配当前链的默认动作(默认策略),而上例中,INPUT链的默认动作为ACCEPT,所以,来自146的ping报文就被接收了,如果,把上例中INPUT链的默认策略改为DROP,那么,146的报文将会被丢弃,146上的ping命令将得不到任何回应,但是如果将INPUT链的默认策略设置为DROP,当INPUT链中没有任何规则时,所有外来报文将会被丢弃,包括我们ssh远程连接。
-i
:用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项:
iptables -t filter -I INPUT -p icmp -i eth0 -j DROP
iptables -t filter -I INPUT -p icmp ! -i eth0 -j DROP
-o
:用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。
iptables -t filter -I OUTPUT -p icmp -o eth0 -j DROP
iptables -t filter -I OUTPUT -p icmp ! -o eth0 -j DROP
以上就是iptables中一些常见词的详解和规则的简单用法,下一篇将会对一些扩展模块的使用详细介绍