ここに題名を入れる
| トップ | ブレボ | 製作者 | 技術ブログ |
さて,DragonFly BSDサーバに防御力をつけていきましょう.殴られる前に防げ!それがファイアウォールのお仕事です.
DragonFly BSDが誇るファイアウォールといえば――そう,pf(Packet Filtering).
OpenBSDで生まれ,FreeBSDにも移植され,そしてDragonFly BSDにもやってきた,堅牢かつ柔軟なパケットフィルタリング機構です.
pfを使うには,カーネルモジュールがちゃんと用意されている必要があります.
DragonFly BSDでは,pfはカーネルモジュール(.ko)として提供されているので,まずはその有無を確認しましょう
ls /boot/kernel/pf.ko
このファイルがあれば,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を有効にする設定を入れておきましょう.
DragonFly BSDでは /etc/rc.conf に設定を追加するだけでOK
pf_enable="YES"
これで次回のブートからは,勝手にpfがロード&起動されるようになります.ただし,あくまでpf.koが存在していて,かつロード可能な状態であることが前提です.
# 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 を付けると「それ以降のルールは無視して即適用」されます.ピンポイント遮断に便利ですが使い方注意!
sudo pfctl -nf /etc/pf.conf # 文法チェックだけ
sudo pfctl -f /etc/pf.conf # 設定の読み込み
sudo pfctl -e # pf の有効化(最初のみ)
sudo pfctl -sr # 現在のルール確認