pf(Packet Filter)の簡易設定

いきなりリモートにあるサーバーに設定を反映させるのではなく、ローカルマシンで設定が意図した通りに反映しているかどうか確認することが必要。
SSH の待ちうけポート番号は変更する方が良い。また、パスワード認証ではなく、鍵認証に変更をして、セキュリティを高めること。

rc.donf に pf を起動時に実行するように設定をする

# vi /etc/rc.conf
# pf を有効にする
pf_enable="YES"$
# pf の設定の場所
pf_rules="/etc/pf_conf/pf.conf"

pf.conf 用のディレクトリを作成する

pf の設定ファイルの設置場所は、デフォルトだと pf_rules="/etc/pf.conf" が指定されているが、/etc 下のファイルを整理する意味でも、別途ディレクトリを用意する。

# mkdir /etc/pf_conf
# chmod 0700 /etc/pf_conf

もし、作成した覚えがないのに、/etc/pf_conf がある場合は、pf が既に設定されていないかを確認する。設定がないようならば、ディレクトリを削除して、新規に作成する。

# pfctl -sa
# rm -rf /etc/pf_conf

pf.conf の内容

基本設定を作る。

# vi /etc/pf_conf/pf.conf
#macros
# インターネットと通信する側の NIC 名
ext_if = "bge0"

# LAN 側に接続されている NIC 名
# このサーバがNATやゲートウェイとして稼動する際に使われる
# int_if = "bge0"

# インターネットからの接続を許可するポート番号をまとめて変数に登録する
tcp_services = "{22, 80, 443}"
# プライベートアドレスとして登録されているアドレス空間をまとめて変数に登録する
priv_nets    = "{127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 0.0.0.0, 255.255.255.255}"

# options
# 許可していないパケットはすべて破棄する
# 拒否の応答を返したい場合は「drop」ではなく[return」に変更する
set block-policy drop
# PF の着信/送出バイト数や通過/ブロックパケット数などの統計情報を
# 収集すべきインターフェイスを設定
set loginterface $ext_if

# scrub
# see at http://gd.tuwien.ac.at/.vhost/www.openbsd.org/xxx/faq/pf/ja/scrub.html
# パケットの正規化を行う
scrub in all

# default rules
# まずは全ての接続を拒否する
block all
# ループバックアドレスは全て許可する
pass quick on lo0 all
# 詐称されたパケットをブロックする
antispoof log-all quick for $ext_if inet

# ゲートウェイの役割がある場合は下記を有効にするか判断する
# see at http://gd.tuwien.ac.at/.vhost/www.openbsd.org/xxx/faq/pf/ja/example1.html#options
# block drop in  quick on $ext_if from $priv_nets to any
# block drop out quick on $ext_if from any to $priv_nets

# filter rules
# 外部からの ICMP の特定のプロトコルに応答する
pass in quick on $ext_if inet proto icmp from any icmp-type echoreq keep state
# 外部からの接続は tcp_services に登録したポートへの許可する
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services flags S/SA keep state

# pass out all -> ext
# 内部から外部への接続で、下記のプロトコルを許可する
pass out quick on $ext_if proto tcp all modulate state flags S/SA
pass out quick on $ext_if proto {udp, icmp} all keep state

pf.conf の記述構文に誤りがないかを確認する

# pfctl -nf /etc/pf_conf/pf.conf

syntax error がなくなるまで修正を行う。
このまま、pf を起動しても、下記のエラーが表示される。

# pfctl -f /etc/pf_conf/pf.conf
pfctl: /dev/pf: No such file or directory

このエラーは一度、OS を再起動するれば、表示されなくなる。

# reboot

再起動後、kldstat をして pf.ko があれば、pf が起動している。

# kldstat
Id Refs Address    Size     Name
 1    8 0xc0400000 9fad10   kernel
 2    1 0xc0dfb000 6a45c    acpi.ko
 3    1 0xc61d8000 33000    pf.ko
 4    1 0xc626c000 22000    linux.ko

pf の設定内容を確認する。

# pfctl -sr
No ALTQ support in kernel
ALTQ related functions disabled
scrub in all fragment reassemble
block drop all
pass quick on lo0 all flags S/SA keep state
block drop in log quick on ! bge0 inet from 192.168.12.0/24 to any
block drop in log quick inet from 192.168.12.13 to any
pass in quick on bge0 inet proto icmp all icmp-type echoreq keep state
pass in on bge0 inet proto tcp from any to (bge0) port = ssh flags S/SA keep state
pass in on bge0 inet proto tcp from any to (bge0) port = http flags S/SA keep state
pass in on bge0 inet proto tcp from any to (bge0) port = https flags S/SA keep state
pass out quick on bge0 proto tcp all flags S/SA modulate state
pass out quick on bge0 proto udp all keep state
pass out quick on bge0 proto icmp all keep state