zl程序教程

您现在的位置是:首页 >  其他

当前栏目

linux IPtables的匹配条件

2023-02-18 16:34:39 时间

iptables的匹配条件

  • 基本匹配条件:直接能用的条件

  • 扩展匹配条件:需要调用对应的扩展模块

iptables的基本匹配条件

  • 源地址: -s
  • 目标地址:-d
  • 网卡名称:-i
  • 协议类型:-p

源地址和目标地址

  • 使用-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

说明:

当不使用-p指定协议类型时,默认表示所有类型的协议都会被匹配到,与使用-p all的效果相同。

#centos6中,-p选项支持如下协议类型:
tcp, udp, udplite, icmp, esp, ah, sctp

#centos7中,-p选项支持如下协议类型:
tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh

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

注意

  • -m tcp表示使用tcp扩展模块,–dport表示tcp扩展模块中的一个扩展匹配条件

  • 使用 -p 指定报文协议,但是没有使用 -m 指定扩展模块时,会默认使用和协议名称相同的模块

  • 连续的端口表示方法: 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