使用 pfctl 阻止 DNS 查询

使用 pfctl 阻止 DNS 查询

我正在尝试创建规则以仅允许 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

相关内容