我正在尝试添加一个简单的 PF 规则:
block return-rst out proto tcp from any to any port 33128
过滤所有到 TCP 端口 33128 的传出流量,我希望它以重置作为响应。但是,当我用 测试它时nc
,它会超时,而不是立即返回连接被拒绝错误,这表明进入端口的数据包在33128
未发送 TCP 重置的情况下被丢弃:
$ nc -v 172.22.2.2 33128
nc: connectx to 172.22.2.2 port 33128 (tcp) failed: Operation timed out
我启用 PF 并添加此规则的方式:
$ echo "block return-rst out proto tcp from any to any port 33128" > pf.conf
$ sudo pfctl -f pf.conf
$ sudo pfctl -e
这条规则有什么问题?
答案1
我发现,部分 PF 防火墙规则在 Thunderbolt 以太网连接后无法正常工作,但在 WiFi 是唯一网络适配器时可以正常工作。例如,操作“return-rst”不会返回 TCP RST 数据包。
更新
我发现这个错误会影响任何有线以太网连接。甚至内置 iMac 以太网适配器与内置 WiFi 适配器。在旧款和新款 iMac 上进行了测试。
重现步骤:第一步,让我们尝试正确的行为。为此,我们需要仅连接 WiFi 的 MacBook/iMac,不连接 Thunderbolt 以太网。
刷新所有 PF 规则
sudo pfctl -F all
创建简单规则来阻止到端口 81 的 TCP 连接,该规则应返回 TCP RST 数据包以立即中止连接。
echo "block return-rst out proto tcp from any to any port 81" | sudo pfctl -e -f -
检查新规则是否正确添加。
在这里我们可以看到与防火墙规则匹配的数据包的计数器。
pfctl -vsr Packets: 0 Bytes: 0
现在尝试使用连接到端口 81 的 curl 测试防火墙规则
curl http://example.com:81 curl: (7) Failed to connect to example.com port 81: Connection refused
看到防火墙规则立即拒绝了连接,正如预期的那样。这是正确的行为。
现在测试不正确的行为。为此,我们需要使用活动的有线连接连接正品 Apple Thunderbolt 以太网。WiFi 连接可以禁用或保持启用状态,这无关紧要,两种情况下都会出现错误。
保持防火墙规则不变
尝试再次使用 curl
curl http://example.com:81 .....waiting.... curl: (28) Connection timed out
现在连接挂起,并在一段时间后因超时而关闭。但防火墙规则仍然有效且正常工作。我们可以查看数据包计数器
pfctl -vsr
,发现规则匹配且仍在阻止连接。但没有 TCP RST 回复。
我的设置:
macOS:10.14.1(18B75)
MacBook Pro(Retina,15 英寸,2015 年中)
Apple Thunderbolt 2 以太网适配器(57762)