我目前正在学习Macbook(OS X Mountain Lion)上安装的pf
数据包过滤器。
我无法理解的一件事是锚点,或者更具体地说,是关于锚点的某些特征。您可以以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。
我希望你能理解我的这个语法是什么问题。有人能更清楚地向我解释一下吗?例子很有用。
提前致谢!