我正在尝试创建规则以仅允许 DNS 查询(端口 53)到8.8.8.8
服务器(Google DNS)。对所有其他服务器的 DNS 查询都不会成功。
/etc/pf.conf
我在文件中添加了以下几行
anchor "com.xyz"
load anchor "com.xyz" from "/etc/pf.anchors/com.xyz"
然后我将文件添加com.xyz
到/etc/pf.anchors
文件夹中。文件内容com.xyz
如下:
# Options
set block-policy drop
set fingerprints "/etc/pf.os"
set ruleset-optimization basic
set skip on lo0
pass out proto tcp from any to 8.8.8.8 port 53
pass out proto udp from any to 8.8.8.8 port 53
这不起作用,我可以使用其他 DNS 服务器访问互联网。有什么建议可以解释为什么它不起作用吗?
答案1
您的代码片段看起来不错,但我怀疑我们遗漏了一些部分。一套极简规则集可以满足您的要求:
pass out
pass in inet proto { tcp udp } from any to 8.8.8.8 port domain
block drop in quick inet proto { tcp udp } from any to any port domain
在某些情况下,你可能还需要类似以下内容:
match out on em0 from 10.0.0.0/8 nat-to 1.2.3.4
我认为您已经启用了 IP 转发?
答案2
我通过在 后添加以下几行来修复此问题options
。
block out proto tcp from any to any port 53
block out proto udp from any to any port 53
因此,基本上要求pfctl
阻止所有 DNS 数据包,然后要求它仅允许 DNS 查询8.8.8.8
。因此,下面是我的完整com.xyz
文件。
# Options
set block-policy drop
set fingerprints "/etc/pf.os"
set ruleset-optimization basic
set skip on lo0
block out proto tcp from any to any port 53
block out proto udp from any to any port 53
pass out proto tcp from any to 8.8.8.8 port 53
pass out proto udp from any to 8.8.8.8 port 53