iptables: First match wins.
多数人都知道,iptables的规则匹配是简单的top-down:无论有多少条规则匹配中,永远都是第一条生效。因此,下面的第三条规则不会生 效,192.168.93.35还是能访问21端口。iptables构造的mind picture非常直观。
-A INPUT -s 192.168.93.35/32 -p tcp --dport 21 -j ACCEPT -A INPUT -s 192.168.12.31/32 -p tcp --dport 21 -j ACCEPT # redundant, iptables won't even look this one -A INPUT -s 192.168.93.35/32 -p tcp --dport 21 -j DROP
ipsec: Most specific match wins.
ipsec就没那么简单了。同事翻箱倒柜后,终于找出唯一一篇文档,全 文亮点就是这句了:The IPsec filter list is ordered based on a weight value calculated by the IPsec Policy Agent component, with the highest weight value first.
也就是说,ipsec比iptables要更仔细一点:它会考虑所有匹配中的规则,根据精确程度来决出最终赢家。所谓“精确”,通过权重来判断。权 重可以通过“控制台 -> IP安全监视器 -> 快速模式 -> 特别筛选器”查看,如下图:
从文档可知,不考虑隧道的话,权重的计算公式依赖且仅依赖以下元素:
- 源IP,源IP掩码
- 目的IP,目的IP掩码
- 协议
- 源端口与目的端口(对于UDP/TCP协议)
其中的关键是对于某个元素,只关心其是否被指定,不关心具体的指定 值。例如:指定了协议就得256分,无论是TCP、UDP还是ICMP。指定源端口得2分,目的端口得4分。无论端口号具体是多少。
想想也很简单,权重目的是在多条规则匹配成功时,选择最精确的。既然这些规则已经是候选了,它们的内容并不重要。我自己对权重的计算方法很感兴趣, 但微软根本没对权重如何计算进行描述,所以只能反推了。
反推也不难,先确定单个元素的权重,然后验证多个元素并存时,推理值是否与实际值相符即可。结论是这样的:
- 什么都不指定 +1分
- 指定了源端口 +2分
- 指定了目的端口 +4分
- 指定了协议 +256分
子网掩码比较复杂,举例子更好理解:
对于源地址的子网掩码:
- 255.255.255.255 +528 * 2^16分
- 255.255.255.254 +527 * 2^16分
- 255.255.255.252 +526 * 2^16分
- 255.255.255.248 +525 * 2^16分
- 255.255.255.0 +492 * 2^16分
- 255.255.0.0 +392 * 2^16分
- 255.0.0.0 +228 * 2^16分
目的地址子网掩码均比子源子网掩码多1。万事俱备,只欠东风,现在就能自 己算权重了,例如
源:192.168.0.0(255.255.0.0) +392*2^16
目的: 10.10.95.39 +528*2^16+1
源端口:任何 +0
目的端口:21 +4
协议:TCP +256
动作:许可 +0
方向:入站 +0
权重:(392+528)*2^16 + 1 + 4 + 256 = 60293381
有兴趣的可以添加这条规则用监视器验证一下。
Use linear algebra to obtain the actual formula
本质上,这种推算方法就是找7个线性无关的方程组一个矩阵,然后解矩阵。用MATLAB能轻松搞定。
作者:hydra