在 Mac OS X 上使用 return-rst 的 PF 规则不会使用 TCP 重置进行回复

在 Mac OS X 上使用 return-rst 的 PF 规则不会使用 TCP 重置进行回复

我正在尝试添加一个简单的 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 以太网。

  1. 刷新所有 PF 规则
    sudo pfctl -F all

  2. 创建简单规则来阻止到端口 81 的 TCP 连接,该规则应返回 TCP RST 数据包以立即中止连接。
    echo "block return-rst out proto tcp from any to any port 81" | sudo pfctl -e -f -

  3. 检查新规则是否正确添加。
    在这里我们可以看到与防火墙规则匹配的数据包的计数器。
    pfctl -vsr Packets: 0 Bytes: 0

  4. 现在尝试使用连接到端口 81 的 curl 测试防火墙规则
    curl http://example.com:81 curl: (7) Failed to connect to example.com port 81: Connection refused

看到防火墙规则立即拒绝了连接,正如预期的那样。这是正确的行为。

现在测试不正确的行为。为此,我们需要使用活动的有线连接连接正品 Apple Thunderbolt 以太网。WiFi 连接可以禁用或保持启用状态,这无关紧要,两种情况下都会出现错误。

  1. 保持防火墙规则不变

  2. 尝试再次使用 curl
    curl http://example.com:81 .....waiting.... curl: (28) Connection timed out
    现在连接挂起,并在一段时间后因超时而关闭。但防火墙规则仍然有效且正常工作。

  3. 我们可以查看数据包计数器 pfctl -vsr ,发现规则匹配且仍在阻止连接。但没有 TCP RST 回复。

我的设置:
macOS:10.14.1(18B75)
MacBook Pro(Retina,15 英寸,2015 年中)
Apple Thunderbolt 2 以太网适配器(57762)

相关内容