Packet Filter (またはPF ) は OpenBSD の公式ソフトウェア ファイアウォールで、元々は Daniel Hartmeier によって作成されました。無料のオープンソース ソフトウェアです。
これは、ライセンスの問題だけでなく、OpenBSD 開発者からのコード変更を組み込むことを Reed が組織的に拒否したことを受けて、 OpenBSDのバージョン 3.0 以降の Darren Reed のIPFilterを置き換えるものです。
DragonflyBSD 1.2 およびNetBSD 3.0 に移植されました。 FreeBSD (バージョン 5.3 以降) には標準で付属しています。
Core FORCEコミュニティによって、 Windows 2000 および XP オペレーティング システム用のPFの無償ポートも作成されました。ただし、このポートは単なるパーソナル ファイアウォールです。NAT や ALTQ を使用できるPF機能は実装されていません。
帯域幅管理
OpenBSD 3.0以降、ALTQ代替キューは基本システムの一部となっています。
OpenBSD 3.3以降、 ALTQ はPFに統合されました。
OpenBSDのALTQ実装は、クラス キューイング (CBQ) およびプライオリティ キューイング (PRIQ) アルゴリズムに加え、早期ランダム検出 (RED) および明示的輻輳通知 (ECN) をサポートします。
PFにALTQを統合すると、とりわけ、トラフィックを許可するフィルターでトラフィックの優先順位を定義できるようになります。
参照: PF: 帯域幅管理
これにより、たとえば次のことが可能になります。
- 電子メールの送信よりもインターネットサーフィンを優先したい場合は、SMTP よりも HTTP を優先します。
- 小さな確認応答パケットを他のパケットよりも優先するため、非対称インターネット アクセス(ADSL など) には非常に実用的です。
- Voice over IPネットワークなどのリアルタイムアプリケーション用に最小帯域幅を予約します。

資質
- 設定のロードはアトミックです。つまり、構成ファイルで構文エラーまたは一貫性エラーが見つかった場合、ロールバックが実行されます。このタイプのソリューションを実装している商用ファイアウォールはほとんどありません。
- 帯域幅管理と ALTQ の統合により、パケット フィルターはネットワークフローとパフォーマンスを柔軟に制御できます。
- セキュリティ上の理由から、 PF はカーネル内でサービス検査 (FTP、RPC など) を行いません。実際、サービス検査は複雑なので、バグがあるとマシンの制御が奪われてしまう可能性があります。サービス検査を実行するには、ユーザー スペースで実行されるプロキシをインストールする必要があります。
- 開発者は、構文を読みやすく、柔軟かつ明確にするために多大な努力を払ってきました (ファイアウォールのセキュリティにとって重大な危険を表すエラーを使用します)。
故障
- PF ( IPFと同様) はサービス検査を行わず、プロキシの使用を強制するという事実は、プロトコルにプロキシが欠落している場合に迷惑です。たとえば、RPC ベースのプロトコルや UPnP (ユニバーサル プラグ アンド プレイ) プロトコルのプロキシはありません。
- ほとんどの無料ファイアウォールと同様に、 PF は、商用ファイアウォールが管理することに慣れているIPsec 、プロキシ、IDS、認証サーバー、およびその他の多くのテクノロジを管理しません。これを行うには、個別に構成された他の BSD モジュールを使用する必要があります。
- ファイアウォール ソフトウェアと緊密に統合するように設計された IDS およびウイルス対策ソフトウェアは、 PF (より一般的には BSD システム ファイアウォール) をサポートすることはほとんどありません。

コマンドと設定
PF を使用するファイアウォールのコマンドライン管理ツールである pfctl の使用例をいくつか示します。
- pfctl -e -> pf をアクティブにする
- pfctl -d -> pf を無効にします
- pfctl -f
-> ファイルによって記述されたルールをPFにロードします。ファイル内で 1 つの構文エラーが見つかった場合、何も変更されません。 - pfctl -sn -> 有効な NAT ルールを表示します
- pfctl -sr -> アクティブ化されたフィルター ルールを表示します
構成例
基本的な構文の説明:
- マクロ値は、構成を評価するときに自動的に置き換えられます。
- $interface:network 構文は、$interface に付加されたネットワークアドレスを自動的に置き換えます。
- キーワード「egress」はデフォルトルートが接続されているインターフェイスの名前に自動的に置き換えられ、「(egress)」はその IP に置き換えられます。これらの値は、変更されると動的に更新されます。
# マクロ
int_if="rl0"
ports_ouverts_pourt_all="{ http https }"
open_ports_for_theteam="{ ssh 21 60000:60100 }"
# テーブル
テーブル { XXX.XXX.XXX.XXX、XXX.XXX.XXX.XXX、XXX.XXX.XXX.XXX }
# トラフィックの正規化
ノーDFでのスクラブ
#NAT
出力時の nat -> (出力)
# フィルタリングルール
ブロックイン
パスアウトキープ状態
出力プロト TCP で次から渡します $ports_ouverts_pour_lequipe フラグ S/SFRA をポートに設定して状態を維持する
出力時にプロトコル TCP を $ports_ouverts_pourt_all に渡し、S/SFRA のフラグを設定して状態を維持します
$int_if:network からポート 4662 への $int_if proto TCP でクイックブロックします
すぐに渡します!出口は状態を維持します

