FreeBSDのPF(Packet Filter)の環境構築

に公開

今回使用する環境

OS:FreeBSD14.2
Packet Filter: pf

1. はじめに

FreeBSDに搭載されているpf(Packet Filter)は、非常に強力なパケットフィルタリング機能を備えています。
その理由の一つとして、OSI参照モデルの物理層(電気信号レベル)にまで制御が及ぶ設計が可能である点が挙げられます。
本稿では、pfの構築手順について解説します。

2. FreeBSDのインストール

FreeBSDのインストール手順については、以下のサイトを参考にしてください。
記載されているFreeBSDのバージョンは異なる場合がありますが、基本的な手順は共通しているため、そのまま進めて問題ありません。
https://www.kkaneko.jp/tools/freebsd/FreeBSD_minimum.html

3. PFの構築

3-1. カーネル書き換え

FreeBSD 12までは、PFを使用するにはカーネルの書き換えが必要でした。
しかし現在のバージョンでは、デフォルトのカーネルでもPFを利用することが可能です。
とはいえ、私は現在もカーネルを書き換えてPFを使用しています。
(※デフォルトのカーネルでPFのどこまでの機能が使用可能か、正確に把握していないためです。)
カーネルの書き換えは任意ですので、必要に応じて実施してください。

su -
cd /usr
# mainブランチをクローンしていますが、
# OSバージョンのブランチをダウンロードしたほうが安全かと思います。
git clone https://git.freebsd.org/src.git

cd /usr/src/sys/amd64/conf/

# カーネルを書き換えるため,コピーを作成し変更する
# コピーファイル名:MYKERNELは任意のもので構いません
cp GENERIC MYKERNEL

vi MYKERNEL

まずは,カーネル名を変更する。

- ident     GENERIC
+ ident     MYKERNEL

次に、PF設定を最終行に追加する

# Enabling Packet Filter(PF)
device         pf              # Packet filter
device         pflog           # Packet filter logging
device         pfsync          # Packet filter state table logging

# Enabling ALTQ (for Packet Filter(PF))
options                ALTQ            # Enable ALTQ.
options                ALTQ_CBQ        # Build the ``Class Based Queuing'' discipline.
options                ALTQ_RED        # Build the ``Random Early Detection'' extension.
options                ALTQ_RIO        # Build ``Random Early Drop'' for input and output.
options                ALTQ_HFSC       # Build the ``Hierarchical Packet Scheduler'' discipline.
options                ALTQ_CDNR       # Build the traffic conditioner. 
options                ALTQ_PRIQ       # Build the ``Priority Queuing'' discipline.
options                ALTQ_NOPCC      # Required if the TSC is unusable.

設定を保存してviを終了する

3-2. カーネルのビルド

3-1で書き換えたカーネル設定ファイルをビルドします。

cd /usr/src
make buildkernel KERNCONF=MYKERNEL←新たなカーネルの名前

# ビルドにかなり時間を要します。
# ビルド終了後カーネルをインストール
make installkernel KERNCONF=MYKERNEL

# インストール完了後サーバを再起動する
shutdown -r now

再起動に成功すればカーネルのビルドとインストールが完了します。

4. PFの有効化

4-1. pfサービスの有効化

サーバ再起動後「/etc/rc.conf」にpfの設定を追加してpfを有効化します。

su -
vi /etc/rc.conf

以下の設定をrc.confに追加する
設定する項目は以下になります。
pf_enable=pfサービスの有効化
pf_rules=pfのルールを記述したファイル
pflog_enable=pfのログ出力有効化
pflogd_flags=pfログの出力先

pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"
pflogd_flags="-f /var/log/my_pflog"

設定を追加後以下のコマンドを実行します。

service pf start
service pflog start

5. pfの設定

5-1. pfのルール評価順序

FreeBSDのpfのルールには記述順序があります。
下記の順序で記述しないとエラーになります。
()の中には対応する設定を一部記載しています

  1. options
  2. normalization(scrub)
  3. queueing(queue)
  4. translation(rdr, nat)
  5. filtering(pass, block)

ルールの詳細は気が向いたら詳細を書こうと思います。
ルールが気になる方は以下のサイトなどを見てください。
https://blog.3qe.us/entry/2020/11/19/225758
https://qiita.com/informationsea/items/feb31eb786fb408e762f

5-2. pfコマンド(一部)

pfのコマンドの一部を記載します。

# 設定ファイルの文法チェック
pfctl -nf /etc/pf.conf
# 設定の反映(リロード)
pfctl -f /etc/pf.conf
# 一時的にpfを止める
pfctl -d

6. おわり

以上でFreeBSDのPF環境構築手順は完了です。
PFのルール設定については、気が向いたときにでも追記しようと思います。
ここまで読んでいただき、ありがとうございました!

Discussion