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
参考
- pf (Packet Filter) のインストール
- OpenBSD の PF でフィルタリングや NAPT, ポートフォワーディング
- PF: 実行時オプション
- PF: スクラブ (scrub: パケットの正規化)
- PF: パケットフィルタリング
- PF: 例 #1: 自宅や小規模事務所用ファイアウォール
- PF: ログの取得
- 第22回 FreeBSDでPacketFilter(pf)を使う
- mpd + pf (OpenBSD packet filter)
- First rule set - single machine
- Slightly stricter
- FreeBSD/basesystem/pf