PF (ファイアウォール)

PF (Packet Filter) とは、パケットフィルターである。元々は、OpenBSD用に開発されたが、現在ではその他のBSDの子孫やWindowsでも使うことが出来る。
概要.
PF は、Daniel HartmeierによってOpenBSD用に開発された、ステートフルなパケットフィルターである。
PFが作成されたのは、Darren Reedが作ったIPFilterにあるライセンス上の問題を回避するためである。このライセンス上の問題とは、Darren Reed以外の人間にIPFilterのソースコード改変を許さないというものである。IPFilterの代替品が早急に必要だったため、PFは短期間で開発された。
IPFilterが削除されたとき、テオ・デ・ラートは「OpenBSDが使ったり配布したりするソフトウェアはあらゆることに対して自由でなくてはならない。...そして、それはどんな目的に対してでも自由であるべきだ...その目的が改変、利用、漏洩、子供の根囲いをする機械やオーストラリアに落とされる核爆弾に対する実装であったとしても」と語った。このことからもわかるように、OpenBSD開発者チームはこの手の問題に対して無駄な交渉を続けていくよりも、ソフトウェアを置き換えることを選ぶ。
現在、PFはOpenBSDだけでなく、NetBSDやFreeBSD、DragonFly BSDでも利用することが出来る。また、WindowsでもCore forceという名前でOpenBSDの実装を使うことが出来る。
PFは、他のファイアウォールに無い利点を持つ。PFを使ってネットワークアドレス変換 (NAT) やQuality of Service (QoS) 制御を行うことが出来る。なお、QoS制御はキューイング機構であるALTQで実装されており、PFの設定で指定することで利用できるようになる。
また、PFではpfsyncやCARPというフェイルオーバーや冗長化のための機構や、authpfというセッション認証の機構、ftp-proxyというファイアウォールで扱いにくいプロトコルであるFTPを扱うための機構を使うことが出来る。
PF用の設定ファイル (pf.conf) の文法は、わかりやすい書き方に少し改変したところをのぞき、IPFilterの設定ファイルの文法によく似ている。
PFのログ出力は他のパケットフィルターと全く違っている。
ログ出力のルールはpf.confにて決めることが出来、pflogという仮想ネットワークインターフェイスから得ることが出来る。
ログはtcpdumpのような一般的なユーティリティで調査することが出来る。
なお、OpenBSDはこの目的のためにtcpdumpを拡張している。
また、pflogdというデーモンを使って改変したtcpdump/pcap形式でログを保存することも出来る。
pf.conf ファイルの記述例.
 ## マクロ
 # 内向けインタフェース (ローカルネットワークに接続).
 int_if="xl0"
 ## Options
 # blockした通信にデフォルトでRSTを返すかICMPを返すかを設定
 set block-policy return
 # ループバックインタフェースについては完全に無視する
 set skip on lo0
 ## アドレス変換規則
 # ローカルネットワークからデフォルトルートとして指定されているインタフェースである
 # "egress"インタフェースを通るところでNATを行う。
 nat on egress from $int_if:network to any -> (egress)
 ## フィルタリングルール
 # すべてのパケットを遮断（block）し、ログに残す
 block log all
 # ローカルネットワークからのすべてのパケットを許可する。"quick"を使うと後で
 # これにマッチするルールがあったとしても無視される。ローカルの通信をさらに厳しく
 # 評価するようなルールもあるかもしれない。
 pass quick on $int_if all
 # 外に出て行くすべてのトラフィックを許可する。そして、それらのパケットへの返事が自動的に
 # 許可されるように、状態を記憶する。そうしないと、外部向けの（egress）インタフェースから
 # 出て行く通信や入ってくる通信に対して多くのルールをここに記述することになる。
 pass out keep state