ここに題名を入れる

2024年6月18日17寺23分に期限が切れます。

トップ ブレボ 製作者 技術ブログ



< 戻る

DragonflyBSD用のFireWall:pf 設定まとめ

さて,DragonFly BSDサーバに防御力をつけていきましょう.殴られる前に防げ!それがファイアウォールのお仕事です.

DragonFly BSDが誇るファイアウォールといえば――そう,pf(Packet Filtering).

OpenBSDで生まれ,FreeBSDにも移植され,そしてDragonFly BSDにもやってきた,堅牢かつ柔軟なパケットフィルタリング機構です.


🔍 pfはそもそもいるのか?

pfを使うには,カーネルモジュールがちゃんと用意されている必要があります.

DragonFly BSDでは,pfはカーネルモジュール(.ko)として提供されているので,まずはその有無を確認しましょう

ls /boot/kernel/pf.ko

このファイルがあれば,pfは存在しているということになります.なければ……まぁ調べて


⚙️ pfをロードして有効化

モジュールが存在すれば,以下のコマンドでロードできます

sudo kldload pf

この瞬間,静かに/dev/pfが出現しているはずです

ls /dev/pf

これでカーネルがpfを認識した状態になっています.続いて,pf本体を起動します

sudo pfctl -e

このコマンドで「pf」が動作状態になります.あとは設定ファイル(/etc/pf.conf)を書いて,ルールを適用するだけ!


🧠 設定ファイルの場所と最低限の内容

pfの設定ファイルは /etc/pf.conf に書いていきます.

pfの基本的な記述ルールをまとめます.

1.set セクション:pfの動作オプション

set skip on lo0

→ lo0(ループバック)ではフィルタリングをスキップ.自分自身との通信を邪魔しないための鉄則.

これを書き忘れて localhost に接続できずに数時間ハマることがないように..


2.インターフェースの別名

ext_if = "em0"

→ 外部インターフェースに別名をつけます.こうしておけば,あとでルールに書くときに便利!


3.ルールの種類と記述構造

基本構文:

[block|pass] [in|out] on [インターフェース] [proto] [from] [to] [port] [オプション]

例えば:

pass in on $ext_if proto tcp from any to any port 22 keep state

→ これは「外部インターフェースで,任意のIPからのTCP接続で,ポート22(SSH)を許可」というルールです.


4.状態追跡(keep state)

pass out on $ext_if inet proto tcp to any port 80 keep state

→ この「keep state」があると,こちらからのHTTPアクセスに対する戻りのパケットは許可されるようになります.

つまり,一度通したら戻りは信頼するという発想.


5.テーブルの活用(IPアドレス群のグルーピング)

table <badguys> persist file "/etc/badhosts.txt"
block in quick from <badguys> to any

→ badguys という名前で,ブラックリストIP群をファイルから読み込んでいます.「とりあえずNGなやつ全部弾く」ための王道.


🔁 起動時にpfを自動で有効にしたい

手動でpfを起動していると,リブートのたびに打ち直すことになってめんどくさい!

というわけで,起動時に自動的にpfを有効にする設定を入れておきましょう.

DragonFly BSDでは /etc/rc.conf に設定を追加するだけでOK

pf_enable="YES"

これで次回のブートからは,勝手にpfがロード&起動されるようになります.ただし,あくまでpf.koが存在していて,かつロード可能な状態であることが前提です.


🎁 実践的な pf.conf テンプレート

# pf.conf - Basic Server Setup

ext_if = "em0"          # 外部ネットワークインターフェース
local_net = "192.168.1.0/24"

# ループバックは除外
set skip on lo0

# 全ブロックが基本姿勢
block all

# 外部からのSSHだけ通す
pass in on $ext_if proto tcp from any to any port 22 keep state

# 内部ネットワークからのすべての出力は許可
pass out on $ext_if from any to any keep state

# DHCPクライアント用
pass in on $ext_if proto udp from any port 67 to any port 68 keep state

quick を付けると「それ以降のルールは無視して即適用」されます.ピンポイント遮断に便利ですが使い方注意!


🧪 pf ルールの確認&反映方法

sudo pfctl -nf /etc/pf.conf    # 文法チェックだけ
sudo pfctl -f /etc/pf.conf     # 設定の読み込み
sudo pfctl -e                  # pf の有効化(最初のみ)
sudo pfctl -sr                 # 現在のルール確認