iptables的匹配条件
-
基本匹配条件:直接能用的条件
-
扩展匹配条件:需要调用对应的扩展模块
iptables的基本匹配条件
-
源地址
-
目标地址
-
网卡名称
-
协议类型
源地址和目标地址
使用-s选项来指定源地址,可以是网段或者是一台具体的主机。多个地址或者网段用逗号隔开。
使用-d选项来指定目标地址,可以是网段或者是一台具体的主机
说明:
-
不指定任何目标地址,则目标地址默认为0.0.0.0/0,同理,如果我们不指定源地址,源地址默认为0.0.0.0/0,0.0.0.0/0表示所有IP
-
只能表示离散的地址(单个地址逗号隔开),不能表示一个连续的地址(例如10.0.0.11-10.0.0.19)
#范例:来自10.0.0.11这个设备的数据表都丢弃
[root@CentOS8 ~]# iptables -t filter -I INPUT -s 10.0.0.11 -d 10.0.0.10 -j DROP
网卡名称
有多块网卡时,指定从那块网卡流入或者流出。
-i: 本机有多个网卡时,我们可以使用 -i 选项去匹配报文是通过哪块网卡流入本机
-o: 当主机有多块网卡时,可以使用-o选项,匹配报文将由哪块网卡流出
#-i选项只能用于PREROUTING链、INPUT链、FORWARD链,那么-o选项只能用于FORWARD链、OUTPUT链、POSTROUTING链。
协议类型
匹配不同协议类型的数据包,使用-p参数来匹配指定的协议类型。
#例如: 匹配到来自10.0.0.11这个设备的tcp数据包就拒绝
[root@CentOS8 ~]# iptables -t filter -I INPUT -s 10.0.0.11 -d 10.0.0.10 -p tcp -j REJECT
#centos6中,-p选项支持如下协议类型:
tcp, udp, udplite, icmp, esp, ah, sctp
#centos7中,-p选项支持如下协议类型:
tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
#当不使用-p指定协议类型时,默认表示所有类型的协议都会被匹配到,与使用-p all的效果相同。
iptables的扩展匹配条件
需要调用指定的扩展模块才能使用的匹配条件。
扩展匹配条件分为:
-
隐式扩展:和协议名称一样的模块,使用-p执行协议类型的时候,会自动分配一个同名的模块。
-
显示扩展:需要使用 -m 参数手动指定模板才能使用
隐式扩展
和协议同名的扩展模块:只需要使用-p选项指定协议,会自动调用同名的扩展模块。
-
tcp
-
udp
-
icmp
tcp 协议的扩展选项:
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围 #[!] 表示可以取反
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围
#范例:拒绝外来报文的目标端口为本机的22号端口
[root@CentOS8 html]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 -j DROP
#注意
1.-m tcp表示使用tcp扩展模块,–dport表示tcp扩展模块中的一个扩展匹配条件
2.使用 -p 指定报文协议,但是没有使用 -m 指定扩展模块时,会默认使用和协议名称相同的模块
3.连续的端口表示方法: num1:num2
udp 协议的扩展选项:
[!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围
icmp 协议的扩展选项:
ICMP协议:Internet Control Message Protocol,翻译为互联网控制报文协议,它主要用于探测网络上的主机是否可用,目标是否可达,网络是否通畅,路由是否可用等
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
使用 –icmp-type 表示根据具体的type与code去匹配对应的icmp报文
ping回应报文,它的type为0,code也为0
ping请求报文对应的type为8,code为0
#范例:禁止所有icmp类型的报文进入本机
[root@CentOS8 ~]# iptables -t filter -I INPUT -p icmp -j REJECT
#范例:实现能ping通别人,但是不想让别人ping通我们
[root@CentOS8 ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
–icmp-type 8/0 表示icmp报文的type为8,code为0才会被匹配到,也就是只有ping请求类型的报文才能被匹配到
我们之所以能够ping通别人,是因为别人回应我们的报文的icmp type为0,code也为0,所以无法被上述规则匹配到,所以我们可以看到别人回应我们的信息
显式扩展模块
-
multiport:可以指定离散的端口号,使用逗号隔开
-
iprange:指定一个连续的ip地址范围
-
mac
-
string:匹配含有指定字符串的报文
-
time:匹配指定时间段的报文
-
connlimit
-
limit
-
state
iprange扩展模块:
两个扩展匹配条件:
–src-range:
–dst-range
#例如:
[root@CentOS8 html]# iptables -t filter -I INPUT -m iprange --src-range 10.0.0.10-10.0.0.13 -j DROP
string模块:
常用扩展匹配条件:
–algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。
–string:指定需要匹配的字符串
#例如: #含有hello1这个字符串的报文就丢弃掉
[root@CentOS8 html]# iptables -t filter -I INPUT -m string --algo bm --string "hello1" -j DROP
#范例:禁止访问谷歌
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
time模块:根据将报文到达的时间与指定的时间范围进行匹配
(注意:CentOS 8 此模块有问题)
#常用扩展匹配条件如下:
–timestart:用于指定时间范围的开始时间,不可取反
–timestop:用于指定时间范围的结束时间,不可取反
–weekdays:用于指定”星期几”,可取反
–monthdays:用于指定”几号”,可取反
–datestart:用于指定日期范围的开始日期,不可取反
–datestop:用于指定日期范围的结束时间,不可取反
范例:每天早上9点到下午6点不能看网页
[root@CentOS8 html]# iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
connlimit扩展模块:限制每个IP地址同时链接到server端的链接数量
–connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。
–connlimit-mask:此选项不能单独使用,在使用–connlimit-above选项时,配合此选项,则可以针对”某类IP段内的一定数量的IP”进行连接数量的限制
#范例:限制每个ip地址(客户端)只能开启两个ssh连接到service
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
state扩展模块:用来识别报文是主动发出去的还是被动接收的。
state连接的概念:两台机器能进行正常的通信就算建立了连接。
state连接的状态:
NEW:连接中的第一个包,状态就是NEW,
ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。
RELATED:有关系的报文
INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID
UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接
范例:实现只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙
[root@centos8 ~]#iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
[root@centos8 ~]#iptables -A INPUT -m state --state NEW -j REJECT
标签:IPtables,iptables,匹配,--,报文,指定,条件,icmp
From: https://www.cnblogs.com/heyongshen/p/16828512.html