概要
iptablesで特定のポートへのパケットをドロップしたい場合は次のようなコマンドを実行します。
$ sudo iptables -A INPUT -p tcp -d 127.0.0.1 --dport 8080 -j DROP
しかしmacOSではiptablesは無いためこれができません。
なのでiptablesではなくpfを使います。これはBSD系のOSで広く使われているネットワークフィルタリングシステムです。
環境
- macOS Ventura 13.3.1
やり方
/etc/pf.confの設定
pfはiptablesのようにコマンドだけでルールを設定することができないため/etc/pf.confに設定をし、それを読み込む形になります。
例えば先程のiptablesのような設定をしたい場合は次のルールを追記します。
block in proto tcp from any to 127.0.0.1 port 8080
ルールセットの評価順序は
- 上から下へとマッチングされる
- 最後にマッチしたルールのアクションが実行される
となっています。
アクション
| アクション | 説明 |
|---|---|
| pass | ルールにマッチしたパケットを通過させる |
| block | ルールにマッチしたパケットをブロック |
| scrub | フラグメントしたTCPパケットを修復 |
パラメータ
| パラメータ | 説明 |
|---|---|
| in | 入力(受信)トラフィックに適用するルールを指定 |
| out | 出力(送信)トラフィックに適用するルールを指定 |
| from {source} (port {port}) | 特定の送信元、そのポートの指定。 sourceがない場合はanyと同じ全部対象。portはオプション |
| to {destination} (port {port}) | 特定の受信先、そのポートの指定。 destinationがない場合はanyと同じ全部対象。portはオプション |
| proto {protocol} | プロトコルを指定 icmp / icmp6 / tcp / udp |
設定の反映
設定の反映はpfctlを使います。
| オプション | 説明 |
|---|---|
| -e | パケットフィルタ(pf)を有効化します。 |
| -d | パケットフィルタ(pf)を無効化します。 |
| -f /etc/pf.conf | pf設定ファイル(/etc/pf.conf)をロードします。このファイルは独自に定義することも可能です。 |
| -sr | 現在のフィルタリングルールの一覧を表示します。 |
| -ss | 現在のステートテーブル(通信状態を記録するテーブル)を表示します。 |
有効化
$ sudo pfctl -e -f /etc/pf.conf pfctl: Use of -f option, could result in flushing of rules present in the main ruleset added by the system at startup. See /etc/pf.conf for further details. No ALTQ support in kernel ALTQ related functions disabled pf enabled
無効化
$ sudo pfctl -d No ALTQ support in kernel ALTQ related functions disabled pfctl: pf not enabled
その他
destinationなのにin(受信パケット)を設定?
pfが働く場所がiptablesと違うのか、out(送信パケット)ではwiresharkがキャプチャ出来ませんでした。
僕が通常iptablesやpfを使うのはローカル環境なので、受信側サービスもローカルで動いてるためinでも問題ありません。
outにした場合

inにした場合

まとめ
macOSではiptablesが使えないため代わりにpfを使うことができます。