単純な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
このルールの何が問題になっていますか?
Thunderbolt Ethernetが接続された後、一部のPFファイアウォールルールが正しく機能しないことがわかりましたが、WiFiが唯一のネットワークアダプターである場合は正しく機能します。たとえば、アクション「return-rst」はTCP RSTパケットを返しません。
更新
このバグが有線イーサネット接続に影響することがわかりました。内蔵のiMacイーサネットアダプタと内蔵のWiFiアダプタですら。新旧のiMacでテスト済み。
再現する手順:最初の手順では、正しい動作を試してみましょう。そのためには、WiFiのみの接続があり、Thunderboltイーサネットが接続されていないmacbook/iMacが必要です。
すべての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 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)