Iptables匹配器

概述

本章我们主要说说matches,我粗略的把他们分为五类。第一个是通用匹配,它可以用在任何规则里,第二类的只能用于TCP的TCPmatches,第三类是能够UDP的UDP matches,第四类是只能用于ICMP的ICMP matches,第五类是一些特殊匹配,例如基于状态(state),所有者(owner)或者限制(limit)等等。最后一类还会被细化为更小的matches,尽管他们本身并没有什么不同,我这么划分只是为了让你更容易理解罢了。

通用匹配

通用匹配就是不管你处理什么协议或者你加载了什么扩展匹配(matches),都能够使用。另外还有一些match需要有特定前提才能够使用,例如TCP match,我们必须首先通过—protocol制定是TCP才能接着进行TCP协议的匹配。通用匹配主要如下

-p|-s|-d|-i|-o|-f

下面所列的都是通过匹配的详细介绍。

-p, –protocol

示例

iptables -A INPUT -p tcp -j ACCEPT

说明:这个匹配器(match)主要用来检查特定的协议,例如TCP/UDP/ICMP等等,它主要有以下几种使用方式:指定协议的名称,它必须在/etc/protocols里面定义,不然就会报错。ICMP就是1,TCP就是6而UDP是17。另外你可以指定为ALL,ALL表示仅仅匹配ICMP/TCP/UDP协议,这个是默认配置,数值为0。也可以是协议列表,以英文逗号为分隔符,如:udp,tcp,另外,我们还可以对协议取反,例如!TCP表示匹配UDP/ICMP,当然从这儿我们也可以看到取反只能针对TCP/UDP/ICMP协议。

-s, –src, –source

示例

iptables -A INPUT -s 192.168.1.1 -j ACCEPT

说明:这个匹配器(match)主要用来匹配报文的源地址,它不仅可以匹配单台主机,还以匹配一个网络。

  • 单个地址,如192.168.1.1,也可写成 192.168.1.1/255.255.255.255或192.168.1.1/32
  • 网络,如192.168.0.0/24,或 192.168.0.0/255.255.255.0
  • 在地址前加英文感叹号表示取反,注意空格,如 –source !192.168.0.0/24 表示除此地址外的所有地址
  • 缺省是所有地址。

-d, –dst, –destination

示例

iptables -A INPUT -d 192.168.1.1 -j ACCEPT

说明:这匹配报文的目的地址,用法和源地址匹配一致。

-i,–in, –interface

示例

iptables -A INPUT -i eth0 -j ACCEPT

说明:以包进入本地所使用的网络接口来匹配包。要注意这个匹配操作只能用于INPUT,FORWARD和 PREROUTING这三个链,用在其他任何地方都会提示错误信息。指定接口有一下方法:

  • 指定接口名称,如:eth0、ppp0等
  • 使用通配符,即英文加号,它代表字符数字串。若直接用一个加号,即iptables -A INPUT -i +表示匹配所有的包,而不考虑使用哪个接口。这也是不指定接口的默认行为。通配符还可以放在某一类接口的后面,如:eth+表示所有Ethernet接口,也就是说,匹配所有从Ethernet接口进入的包。
  • 在接口前加英文感叹号表示取反,注意空格,如:-i ! eth0意思是匹配来自除eth0外的所有包。

-o, –out, –interface

示例

iptables -A FORWARD -o eth0 -j ACCEPT

说明:以包离开本地所使用的网络接口来匹配包。使用的范围和指定接口的方法与–in-interface完全一样。

-f, –fragment

示例

iptables -A INPUT -f -j ACCEPT

说明:用来匹配一个被分片的包的第二片或及以后的部分。因为它们不包含源或目的地址,或ICMP类型等信息,其他规则无法匹配到它,所以才有这个匹配操作。要注意碎片攻击。这个操作也可以加英文感叹号表示取反,但要注意位置,如:! -f 。取反时,表示只能匹配到没有分片的包或者是被分片的包的第一个碎片,其后的片都不行。现在内核有完善的碎片重组功能,可以防止碎片攻击,所以不必使用取反的功能来防止碎片通过。如果你使用连接跟踪,是不会看到任何碎片的,因为在它们到达任何链之前就被处理过了。

隐含匹配

本节我们主要讨论隐含匹配器(match),他们被自动加载。这也意味着隐含匹配可以直接使用而不需其他任何额外的动作,例如我们可以直接使用—protocol TCP。现在系统里面有三种隐含匹配,分别是:TCP matches,UDP matches以及ICMP matches。每一种matches都会针对特定的协议有特殊的匹配条件。而与之相对的是显示匹配,它就表示说我们需要明确的用-m或者—match来指明我们要做匹配。隐含匹配主要有

--sport|--dport|--icmp-type

TCP匹配器

这些匹配器是协议相关的,他们只能工作于TCP报文流。所以我们在使用这个匹配器(match)的时候需要指定协议—protocol TCP。请注意—protocol tcp必须在TCP匹配器(match)的左边,TCP以及UDP还有ICMP都是隐含匹配的,我们首先说说TCP,其他的分别介绍

–sport, –source-port

示例

iptables -A INPUT -p tcp --sport 22 -j ACCEPT

说明:基于TCP包的源端口来匹配包,端口的指定形式如下:

  • 不指定此项,则暗示所有端口。
  • 使用服务名或端口号,但名字必须是在/etc/services 中定义的,因为iptables从这个文件里查找相应的端口号。从这可以看出,使用端口号会使规则装入快一点儿,当然,可读性就差些了。但是如果你想写一个包含200条或更多规则的规则集,那你还是老老实实地用端口号吧,时间是主要因素(在一台稍微慢点儿地机子上,这最多会有10秒地不同,但要是1000条、10000 条呢)。
  • 可以使用连续的端口,如:–source-port 22:80这表示从22到80的所有端口,包括22和80。如果两个号的顺序反了也没关系,如:–source-port 80:22这和 –source-port 22:80的效果一样。
  • 可以省略第一个号,默认第一个是0,如:–source-port :80表示从0到80的所有端口。
  • 也可以省略第二个号,默认是65535,如:–source-port 22:表示从22到 65535的所有端口
  • 在端口号前加英文感叹号表示取反,注意空格,如:–source-port ! 22表示除22号之外的所有端口;–source-port ! 22:80表示从22到80(包括22和80)之外的所有端口。

注意:这个匹配操作不能识别不连续的端口列表,如:–source-port ! 22, 36, 80 这样的操作是由后面将要介绍的多端口匹配扩展来完成的。

–dport

示例

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

说明:目的端口用来匹配报文的目的端口,用法和源端口一样。

–tcp-flags

示例

iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j ACCEPT

说明
匹配指定的TCP标记。有两个参数,它们都是列表,列表内部用英文的逗号作分隔符,这两个列表之间用空格分开。第一个参数指定我们要检查的标记(作用就象掩码),第二个参数指定“在第一个列表中出现过的且必须被设为1(即状态是打开的)的”标记(第一个列表中其他的标记必须置0)。也就是说,第一个参数提供检查范围,第二个参数提供被设置的条件(就是哪些位置1)。这个匹配操作可以识别以下标记:SYN, ACK,FIN,RST ,URG,PSH。另外还有两个词也可使用,就是ALL和NONE。顾名思义,ALL是指选定所有的标记,NONE是指未选定任何标记。这个匹配也可在参数前加英文的感叹号表示取反。例如:

  • iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN -j ACCEPT表示匹配那些SYN标记被设置而FIN和ACK标记没有设置的包,注意各标记之间只有一个逗号而没有空格。
  • --tcp-flags ALL NONE 匹配所有标记都未置1的包。
  • iptables -A INPUT -p tcp --tcp-flags !SYN,FIN,ACK SYN -j ACCEPT表示匹配那些FIN和ACK标记被设置而SYN标记没有设置的包,注意和例1比较一下。

–syn

示例

iptables -A INPUT -p tcp --syn -j ACCEPT

说明:这个匹配或多或少算是ipchains时代的遗留物,之所以还保留它,是为了向后兼容,也是为了方便规则在iptables和ipchains间的转换。它匹配那些SYN标记被设置而 ACK和RST标记没有设置的包,这和iptables -A INPUT -p tcp --tcp-flags SYN,RST,ACK SYN 的作用毫无二样。这样的包主要用在TCP连接初始化时发出请求。如果你阻止了这样的包,也就阻止了所有由外向内的连接企图,这在一定程度上防止了一些攻击。但外出的连接不受影响,恰恰现在有很多攻击就利用这一点。比如有些攻击黑掉服务器之后安装会一些软件,它们能够利用已存的连接到达你的机子,而不要再新开一个端口。这个匹配也可用英文感叹号取反,如:! –syn用来匹配那些 RST或ACK被置位的包,换句话说,就是状态为已建立的连接的包。

–tcp-option

示例

iptables -A INPUT -p tcp --tcp-option 16 -j ACCEPT

说明
根据选项匹配包。TCP选项是TCP头中的特殊部分,有三个不同的部分。第一个8位组表示选项的类型,第二个8位组表示选项的长度(这个长度是整个选项的长度,但不包含填充部分所占的字节,而且要注意不是每个TCP选项都有这一部分的),第三部分当然就是选项的内容了。为了适应标准,我们不必执行所有的选项,但我们可以查看选项的类型,如果不是我们所支持的,那就只是看看长度然后跳过数据部分。这个操作是根据选项的十进制值来匹配的,它也可以用英文感叹号取反。所有的选项都可在Internet Engineering Task Force里找到。

UDP匹配器

–sport, –source-port

示例

iptables -A INPUT -p udp --sport 53 -j ACCEPT

说明
基于UDP包的源端口来匹配包,端口的指定形式和TCP matches中的–sport完全一样。

–dport, –destination-port

示例

iptables -A INPUT -p udp --dport 53 -j ACCEPT

说明
基于UDP包的目的端口来匹配包,端口的指定形式和TCP matches中的–sport完全一样。

ICMP匹配器

–icmp-type

示例

iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

说明
根据ICMP类型匹配包,类型的指定可以使用十进制数值或相应的名字,数值在RFC792中有定义,名字可以用iptables –protocol icmp
–help 查看,或者在附录ICMP类型中查找。这个匹配也可用英文感叹号取反,如:–icmp-type ! 8就表示匹配除类型8之外的所有ICMP包。要注意有些ICMP 类型已经废弃不用了,还有一些可能会对无防护的主机带来“危险”,因为它们可能把包重定向到错误的地方。

请注意,被netfilter用来匹配所有的ICMP报文,所有如果你想匹配这种类型的报文,那么你将能够获取到所有的ICMP报文。

显示匹配

显式匹配必须用-m或–match装载,比如要使用状态匹配就必须使用-m state。有些匹配还需要指定协议,有些就不需要,比如连接状态就不要。这些状态是NEW(还未建立好的连接的第一个包), ESTABLISHED(已建立的连接,也就是已经在内核里注册过的),RELATED(由已经存在的、处于已建立状态的连接生成的新连接)等等。

IP范围匹配器

–src-range

示例

iptables -A INPUT -p tcp -m iprange --src-range 192.168.1.13-192.168.2.19 -j ACCEPT

说明:匹配从192.168.1.13到192.168.2.19之内的所有地址。另外可以对地址取反,例如! –src-range 192.168.1.13-192.168.2.19匹配除了192.168.1.13到192.168.2.19之外的所有地址

–dst-range

示例


iptables -A INPUT -p tcp -m iprange --dst-range 192.168.1.13-192.168.2.19 -j ACCEPT

说明:匹配一整段的目的地址,用法和源一致。

长度匹配器

–length

示例

iptables -A INPUT -p tcp -m length --length 1400:1500 -j ACCEPT

说明

–src-range

示例

iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

说明:定一个整数值,例如–length 1400,匹配长度为1400的报文。指定一个范围,例如--length 1400:1500,匹配1400-1500之内的报文。反操作,例如! --length 1400:1500,匹配所有非1400-1500之内的报文。

MAC地址匹配器

–mac-source

示例

iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 -j ACCEPT

说明:基于包的MAC源地址匹配包,地址格式只能是XX:XX:XX:XX:XX:XX,当然它也可以用英文感叹号取反,如 --mac-source ! 00:00:00:00:00:01,意思很简单了,就是除此之外的地址都可接受嘛。注意,因为 MAC addresses 只用 Ethernet类型的网络,所以这个match只能用于Ethernet接口。而且,它还只能在PREROUTING,FORWARD 和INPUT链里使用。

Mark匹配器

Mark match用来基于报文上面被设置的marks来匹配报文,marks是一个特殊的字段,而且它只在本机内核里有效。Marks可以被不同的内核模块使用,例如流量整形和过滤。到目前为止,只有一种方式设置报文的marks字段,那就是MARK target。Marks字段是一个32bit的整数,所以它的最大值为4294967296,现在看来它足够用了。

–mark

示例

iptables -t mangle -A INPUT -m mark --mark 1 -j ACCEPT

说明:以包被设置的mark值来匹配包,这个值是是由下面将要介绍的 MARK target来设置的,它是一个无符号的整数。所有通过 Netfilter的包都会被分配一个相关联的mark field 。但要注意mark值可不是在任何情况下都能使用的,它只能在分配给它值的那台机子里使用,因为它只是由内核在内存里分配的和包相关的几个字节,并不属于包本身,所以我们不能在本机之外的路由器上使用。mark的格式是–mark value[/mask],如上面的例子是没有掩码的,带掩码的例子如–mark 1/1。如果指定了掩码,就先把mark值和掩码取逻辑与,然后再和包的mark值比较。

状态匹配器

状态匹配和连接跟踪一起协作,因为它是从连接跟踪机制中得到包的状态的。这样我们就可以了解连接所处的状态。它几乎适用于所有的协议,包括那些无状态的协议,如ICMP和UDP。针对每个连接都有一个缺省的超时值,如果连接的时间超过了这个值,那么这个连接的记录就被会从连接跟踪的记录数据库中删除,也就是说连接就不再存在了。这个match必须有-m state作为前提才能使用。状态机制的详细内容在章节状态匹配中。

–state

示例

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

说明:指定要匹配包的的状态,当前有4种状态可用:INVALID,ESTABLISHED,NEW和RELATED。 INVALID意味着这个包没有已知的流或连接与之关联,也可能是它包含的数据或包头有问题。ESTABLISHED意思是包是完全有效的,而且属于一个已建立的连接,这个连接的两端都已经有数据发送。NEW表示包将要或已经开始建立一个新的连接,或者是这个包和一个还没有在两端都有数据发送的连接有关。RELATED说明包正在建立一个新的连接,这个连接是和一个已建立的连接相关的。比如,FTP data transICMP error 和一个TCP或UDP连接相关。注意NEW状态并不在试图建立新连接的TCP包里寻找SYN标记,因此它不应该不加修改地用在只有一个防火墙或在不同的防火墙之间没有启用负载平衡的地方。具体如何使用,你就再看看章节状态机制吧。

Was this helpful?

0 / 0

发表回复 0