web-dev-qa-db-ja.com

Mac OSXでreturn-rstを使用するPFルールはTCP reset)で応答しません

単純な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

このルールの何が問題になっていますか?

2
ldx

Thunderbolt Ethernetが接続された後、一部のPFファイアウォールルールが正しく機能しないことがわかりましたが、WiFiが唯一のネットワークアダプターである場合は正しく機能します。たとえば、アクション「return-rst」はTCP RSTパケットを返しません。

更新
このバグが有線イーサネット接続に影響することがわかりました。内蔵のiMacイーサネットアダプタと内蔵のWiFiアダプタですら。新旧のiMacでテスト済み。

再現する手順:最初の手順では、正しい動作を試してみましょう。そのためには、WiFiのみの接続があり、Thunderboltイーサネットが接続されていないmacbook/iMacが必要です。

  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 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)

1
zhovner