トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

pfメモ

はじめに

いわゆるpf (OpenBSD packet filter)のメモ。

日本語の情報

みんな探すと思うんだけど、悲しいことに"PF User's Guide"の日本語訳はない。

とりあえず、FreeBSD 日本語マニュアル検索で、日本語のマニュアルを探して読む、というのが吉。

pf?

pfがなぜできたかは、cvs logのとおり、それまでOpenBSDで使っていたipfというソフトウェアのライセンスが受け入れられなくなった(というより、そういうライセンスであることがわかった)から。今では、他の*BSDにも移植され、近所では「ふつーpfでしょ」という感じ。(FreeBSDのひとは、ipfwの人が多いかも。)

Version

pfのVersionは、OpenBSDのVersionと同じ番号である。他のBSDでは、どのOpenBSDのpfを取り込んだがで、Versionが決まるわけである。

4.6以前と、4.7以降では、文法に非互換なところがあり、注意を要する。各BSDの状況は以下のとおり。

  • OpenBSD 5.8 -> pf 5.8
  • OpenBSD 5.9 -> pf 5.9
  • NetBSD 5 -> pf 4.2
  • NetBSD 6 -> pf 4.2
  • NetBSD 7 -> pf 4.2 ?
  • FreeBSD 8 -> pf 4.1
  • FreeBSD 9 -> pf 4.5
  • FreeBSD 10 -> pf 4.5
  • DragonFly BSD 4.2 -> pf 4.4 ?
  • DragonFly BSD 4.4 -> pf 4.4 ?

なお、完全に互換、というわけではない。(manを読むこと。たとえば、NetBSDのpfは、"group"が使えない。)

OpenBSDのpfの(Web上の)ドキュメントは、つねに最新のOpenBSD用なので、昔のVer.のが読みたいと思うかもしれない。もし、探しているのであれば、ftp://ftp.openbsd.org/pub/OpenBSD/doc/history/ の下を探そう。

てっとりばやく、NAT環境をつくる

  • 下記、NATの中の環境を、10.1.2.0/24 とする。 どんな環境でもよい。
  • 下記、外側のインターフェースを re0 とする。
  • 下記、内側のインターフェースを re1 とする。

 OpenBSDの場合

パケットフォワードがデフォルトでは有効になっていないので、有効にしよう。/etc/sysctl.conf の

 net.inet.ip.forwarding=1

の行のコメントアウトをはずす。

pfはデフォルトで有効である。あとはftp_proxyを有効にする。/etc/rc.conf.local に

 ftpproxy_flags=""

を書く。pflogdを無効化しておきたければ、

 pflogd_flags=NO

を書く。

次に、ルールを書く。OpenBSD 4.7から、NATを指定する文法等、一部文法が変更になった。よって、以前からpfを使っていたひとは、そのままでは動かないかもしれない。以下は、4.7以降向け。

フィルターとNATの設定を /etc/pf.conf に書く。とりあえず、Example: Firewall for Home or Small Office を見ながら、まねて書く。たとえば、これ。

 ext_if="re0"
 int_if="re1"
 
 set block-policy return
 set loginterface $ext_if
 
 set skip on lo
  
 match in all scrub (no-df)
  
 match out on $ext_if from !($ext_if) nat-to ($ext_if:0)
  
 block all
  
 pass out keep state
  
 anchor "ftp-proxy/*"
 antispoof quick for { lo $int_if }
  
 pass in inet proto icmp all icmp-type echoreq keep state
 
 pass in quick on $int_if

再起動したら、使えるようになっているはず。

もうちょっとちゃんとした情報が欲しい人は、こっちも読んでみてね。

 NetBSDの場合

パケットフォワードがデフォルトでは有効になっていないので、有効にしよう。

 net.inet.ip.forwarding=1

を /etc/sysctl.conf に書く。

つぎに、pfを有効化する。GENERICカーネルでは有効になっていないので、カーネルモジュールをロードする。/etc/lkm.conf に書く。

 pf.o - - - - BEFORENET

/usrを別パーティションにして、かつ、read onlyでmountしている場合、なぜかモジュールが読めないので、/lkm というdirをつくり、ここに、/usr/lkm/pf.o をコピーしておく。

次に、lkmを有効にする。/etc/rc.conf に書く。

 lkm=YES
 critical_filesystems_local="${critical_filesystems_local} /usr"

/lkm/pf.o をつくったひとは、2行目はいらない。

つぎに、NATとパケットフィルタの設定。pfで関係するのは /etc/defaults/rc.conf のこの部分。

 pf=NO                   pf_rules="/etc/pf.conf"
 pflogd=NO
 ftp_proxy=NO

とりあえず使いたかったら、上と下をYESにする。/etc/rc.conf に、書く。

 pf=YES
 ftp_proxy=YES

フィルターとNATの設定を /etc/pf.conf に書く。とりあえず、/usr/share/examples/pf/faq-example1 を見ながら、まねて書く。たとえば、これ。

 ext_if="re0"
 int_if="re1"
 
 set skip on lo
 
 scrub in
 
 nat-anchor "ftp-proxy/*"
 rdr-anchor "ftp-proxy/*"
 nat on $ext_if from !($ext_if) -> ($ext_if:0)
 rdr pass on $int_if proto tcp to port ftp -> 127.0.0.1 port 8021
 
 anchor "ftp-proxy/*"
 block in
 pass out
 
 pass quick on $int_if no state
 antispoof quick for { lo $int_if }
 
 pass in inet proto icmp all icmp-type echoreq

再起動したら、使えるようになっているはず。

もうちょっとちゃんとした情報が欲しい人は、こっちも読んでみてね。

  • /usr/share/examples/pf の下にあるサンプル(faq-example1をまずどうぞ)
  • NetBSD固有の情報は、NetBSD Packet Filter informationをどうぞ。

 他の*BSDの場合

有効にする方法が違うだけで、あとはNetBSDと同じです(たぶん)。

間違いの指摘や、ご意見などは、FrontPageにある連絡先にメールを下さるとうれしいです。

最終更新時間:2014年08月14日 14時48分00秒