Carpe Diem

備忘録

macOSでiptablesのように特定の通信をブロックする

概要

iptablesで特定のポートへのパケットをドロップしたい場合は次のようなコマンドを実行します。

$ sudo iptables -A INPUT -p tcp -d 127.0.0.1 --dport 8080 -j DROP

しかしmacOSではiptablesは無いためこれができません。

なのでiptablesではなくpfを使います。これはBSD系のOSで広く使われているネットワークフィルタリングシステムです。

環境

やり方

/etc/pf.confの設定

pfiptablesのようにコマンドだけでルールを設定することができないため/etc/pf.confに設定をし、それを読み込む形になります。

例えば先程のiptablesのような設定をしたい場合は次のルールを追記します。

block in proto tcp from any to 127.0.0.1 port 8080

ルールセットの評価順序は

  1. 上から下へとマッチングされる
  2. 最後にマッチしたルールのアクションが実行される

となっています。

アクション

アクション 説明
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を使うことができます。

参考