我目前正在学习pf
安装在我的 Macbook(OS X Mountain Lion)上的数据包过滤器。
我无法理解的一件事是锚点,或者更具体地说,是与锚点有关的某个特征。您可以以anchor "foo/*"
. 请注意锚名称末尾的星号。我的问题是:这是做什么的?
这是文档(http://www.openbsd.org/faq/pf/anchors.html)关于这个主题的内容:
由于可以嵌套锚点,因此可以指定对指定锚点内的所有子锚点进行评估:
anchor "spam/*"
此语法导致对附加到垃圾邮件锚点的每个锚点内的每个规则进行评估。子锚点将按字母顺序进行评估,但不会递归下降。锚点总是相对于定义它们的锚点进行评估。
当我读到这篇文章时,这意味着这个锚定义被替换为 的所有子锚spam
,按字母顺序排列。因此,如果spam/foo1
和spam/foo2
存在,anchor "spam/*"
将被替换为anchor "spam/foo1"
和anchor "spam/foo2"
。spam
锚内的其他规则将被忽略。但是看看默认的 OS X 配置我一定是错的:
$ pfctl -sr
scrub-anchor "com.apple/*" all fragment reassemble
anchor "com.apple/*" all
$ pfctl -a com.apple -sr
anchor "100.InternetSharing/*" all
anchor "200.AirDrop/*" all
anchor "250.ApplicationFirewall/*" all
anchor "300.NetworkLinkConditioner/*" all
所以,根据我的理解,输出pfctl -sr
也可以是:
$ pfctl -sr
scrub-anchor "com.apple/*" all fragment reassemble
anchor "100.InternetSharing/*" all
anchor "200.AirDrop/*" all
anchor "250.ApplicationFirewall/*" all
anchor "300.NetworkLinkConditioner/*" all
但是,如果我现在查看 ApplicationFirewall 规则:
$ pfctl -a com.apple/250.ApplicationFirewall -sr
block drop in inet proto icmp all icmp-type echoreq
block drop in inet6 proto ipv6-icmp all icmp6-type echoreq
这个锚点只包含过滤规则,没有子锚点。如果我的解释是正确的,星号语法不会加载这些。但显然它们是,因为我无法在启用此锚点的情况下 ping 我的 Macbook。
我希望你能理解我在理解这种语法时遇到的问题。谁能更清楚地向我解释一下?例子会很有帮助。
提前致谢!