2007年12月27日木曜日

pf設定録

2004/10/11作成

FreeBSD 5.3ではpfという新しいfirewallソフトが使えるようになっているので、使ってみました。

FreeBSD 5.2でも使えることは使えましたが、カーネルランドで動くのにportsからインストールしなければいけませんでした。起動も/usr/local/etc/rc.d/pf.shからですし、設定ファイルも/usr/local/etc/pf.confにあるという、なんだか気持ち悪い方法だったため使っていませんでした。

FreeBSD 5.3でpfを使えるようにするには、カーネルの設定ファイルに
device pf # required
device pflog # optional
device pfsync # optional
を追加します。
※/usr/src/UPDATING参照

rc.confには
pf_enable="YES" # Set to YES to enable packet filter (pf)
pf_rules="/etc/pf.conf" # rules definition file for pf
pf_program="/sbin/pfctl" # where the pfctl program lives
pf_flags="" # additional flags for pfctl
pflog_enable="YES" # Set to YES to enable packet filter logging
pflog_logfile="/var/log/pflog" # where pflogd should store the logfile
pflog_program="/sbin/pflogd" # where the pflogd program lives
pflog_flags="" # additional flags for pflogd
を追加します。
※/usr/share/examples/etc/defaults/rc.conf参照

ルールはpfのFAQ そのままで大体動きます。


気をつけるところは、私の環境はADSLインターネットに繋いでいてpppでpppoeを喋らせています。
なので、ext_if="ep0" が ext_if="tun0" になります。

私の環境は、固定IPではないのでdst_addrを全部 $ext_if で指定しています。

dst_addr をアドレスではなくインターフェイスで指定していて、しかも固定IPでない場合はdst_addr として指定する $ext_if に必ず括弧()をつけて ($ext_if) としないとルールが有効になりません。


ftpはftp-proxyを動かさないとNATしている場合はできません。サンプルにあるように
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port ftp-proxy
と書いていてもそれだけではダメです。動かすには、それに加えてinetdで
ftp-proxy stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy
と書かないと動きません。私はコレだけのためにinetd動かしてます。なにやら無駄な気が・・・

とりあえずコレだけでFTPはできるようになりますがmanによると
pass in on $ext_if inet proto tcp from any to $ext_if user proxy keep state
と書くといいみたいです。

全体的には、ipfw2のようにあれこれ考える必要もなく普通に動きます。

0 件のコメント: