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

OpenBSD/landiskでActive-Standby Firewall

KOF2010KOF2011K*BUGブースで展示しました。

はじめに

OpenBSDには、もうずいぶんと前から、CARPというCiscoのVRRPやHSRPのような冗長化のためのプロトコル/機能が使えるようになっている。また、pfsyncはOpenBSD生まれのパケットフィルタ、pfのstate tableを同期するしくみ。これらを使うと、Active-StandbyのFirewallが作れちゃう、という話である。

そう、PF: Firewall Redundancy with CARP and pfsyncを実際にやってみよー、というわけ。

OpenBSD/landiskをつかったわけは、i386 or x86_64 port以外で動くことを知らないひとは多いので、違うもの(SH4)をということと、公式配布物で動いている(特別なものではないよ)ということを見てもらいたい、ということもあった。(単に小さくて運びやすい、ということももちろんある。)

こんな感じで、KOF2011の時は、なかがみえるようにして、説明するようにしていた。

なお、KOF2010の時は、OpenBSD 4.8、KOF2011の時は、OpenBSD 5.0で展示した。両方とも、Pingを打ちつづけたり、歴代OpenBSD songを流しっぱにして、時々ケーブルを引っこ抜く、ということをしていた。

再現動画もいちおうあるので、お暇な方は見ていただけると。

用意するもの

 USL-5P

2台用意した。どちらも中古で買ってきた。(Sofmapとじゃんぱらで1台づつ。)

USL-5Pは、ねじをとってふたをあけると、CFが刺さっていて、かんたんにOSを入れ替えることができる。また、シリアルコンソールを出すのもむつかしくないので、ぼくみたいなおっかなびっくりな人に取ってはありがたいガジェットだ。

シリアルコンソールのケーブルは、9 KEを買ってきた。先人に感謝、である

 CF

USL-5Pに元から付いていたのは、念のため取っておくことにした。pqiの2GのCFを2枚用意した。

 ネットワーク

入り口側のhubと出口側のhubはいいとして、問題はネットワークの口である。もともとついている口はひとつ(re)で、あとは、USBイーサネットデバイスを買ってこないといけない。

  • I-O DATA USB-ET/TX-S (Lan-Egg Slim)
    • aue でみえた。
  • I-O DATA ETX-US2 (Lan-Egg Express)
    • OpenBSDでは認識しなかった。以下のパッチで aue で認識するようになった。(ついでにI-O DATA製品の名前の間違いも修正してある。 OpenBSD本家にはめんどくさくて、send-prしていない。 2013/11/16にsendbugした。)
  • Buffaro LUA3-U2-ATX(2つ)
    • axe でみえた。

これを、以下のようにつなぐことにした。

               構成図
                               外 (Internet側)
                                |
       ------+------------------+------------------+------
             |        192.168.8.50/24(carp0)       |
             |                                     |
             | axe0                                | axe0
             | 192.168.8.51/24                     | 192.168.8.52/24
       +-----+-----+                         +-----+-----+
       |           |192.168.0.1/24 re0       |           |
       | OpenBSD A +-------------------------+ OpenBSD B |
       |           |       re0 192.168.0.2/24|           |
       +-----------+       (pfsync0)         +-----------+
             | 10.0.8.51/24                        | 10.0.8.52/24
             | aue0                                | aue0
             |                                     |
             |          10.0.8.1/24(carp1)         |
       ------+------------------+------------------+------
                                |
                               内 (LAN側)

この構成は、2011のもの。reをpfsync用にするのには意味がある。後述する。

作業

 シリアルコンソール

とりあえず、1台だけ、シリアルを出した。準備のところでふれたので、詳細は割愛。

9 KEケーブルは、とくにプルアップする必要もなく、つなぐだけで動いた。

 OpenBSDのインストール

インストール自体は、INSTALL.landiskの、"Preparing your System for OpenBSD Installation:"にあるとおり、ddでminirootイメージをCFに書いて、それでbootするだけである。よって割愛する。

(シリアルコンソールなしでも、インストールできる。最後の「おまけ」参照。)

 設定

構成図にしたがって、設定してゆく。すべて、OpenBSD 5.0 = pf 5.0での例。図のOpenBSD Aの例を示す。

pfはVersionによって、文法がちょっとづつ変更されている。(Version番号は、OpenBSDのVersion番号と同じ。)4.6以前と4.7以降の差がある。今のところ、OpenBSD以外のpfは、4.6以前なのでちうい。

/etc/mygate

今回、Internet側は、OSCの会場側ネットワークなんだけど、間に適当なNAT箱をかませたので、そのNAT箱のIPアドレスになる。

 192.168.8.1

/etc/resolv.conf

適当に。名前解決の必要がないなら、いらない(はず)。

 lookup file bind
 192.168.8.1

/etc/rc.conf.local

Firewallなので、いらないものを止める。ftp proxyを有効に。

 sendmail_flags=NO
 inetd=NO
 savecore_flags=NO
 #syslogd_flags=NO
 #pflogd_flags=NO
 ftpproxy_flags=""

/etc/sysctl.conf

 net.inet.ip.forwarding=1	# 1=Permit forwarding (routing) of IPv4 packets
 net.inet.carp.preempt=1	# 1=Enable carp(4) preemption

の2つのコメントアウトをはずして、有効にする。

/etc/hostname.re0

 inet 192.168.0.1 255.255.255.0 192.168.0.255

/etc/hostname.aue0

 inet 10.0.8.51 255.255.255.0 10.0.8.255

/etc/hostname.axe0

 inet 192.168.8.51 255.255.255.0 192.168.8.255

/etc/hostname.carp0

 inet 192.168.8.50 255.255.255.0 192.168.8.255 vhid 1 carpdev axe0 pass passwd advskew 0

passwdはCARPインターフェースの組ごとで同じにする。もちろん、ちゃんとしたのを考えること。30文字までらしい。

vhidはCARPインターフェースの組を決める番号。今回は、carp0にするやつは、vhid 1にした。

advskewは、Active/Standbyを決めるのの重要で、小さい方がMASTER = Activeになる。OpenBSD B機は、このadvskewの値を大きくする(128とか。)

/etc/hostname.carp1

 inet 10.0.8.1 255.255.255.0 10.0.8.255 vhid 2 carpdev aue0 pass other_passwd advskew 0

carp1のvhidは2にした。

/etc/hostname.pfsync0

 up syncdev re0

こうかくと、マルチキャストでやりとりする。(つまり、複数台スタンバイできるようになっている。)pfsyncする同士、1対1で書きたい時は、pfsyncのmanなどを読もう。

/etc/pf.conf

 # macros
 ext_if="axe0"
 int_if="aue0"
 pfs_if="re0"
 ext_carp="carp0"
 int_carp="carp1"
 # options
 set block-policy return
 #set loginterface $ext_if
 
 set skip on { lo $pfs_if }
 
 # Enable pfsync
 pass quick on $pfs_if proto pfsync
 # Enable CARP
 pass quick on { $int_if, $ext_if } proto carp keep state (no-sync)
 
 # ftp proxy
 anchor "ftp-proxy/*"
 pass in quick on $int_if inet proto tcp to any port ftp \
     divert-to 127.0.0.1 port 8021
 
 # nat/rdr
 match out on egress from !(egress:network) to any nat-to ($ext_carp)
 
 # filter rules
 pass

最低限の例。なお、上記では何も指定していないが、passやblockといったfilterルールは、carpデバイス(例:carp0)を指定することはできず、実デバイスを指定する。

OpenBSD Bも同様に設定し、起動すると、動くようになる。OpenBSD release songsを流しながら、axe0を抜いたり、aue0を抜いたり、片方を落としたり再起動したりしても、ちゃんと切り替わり、音楽は流れつづける。(一旦途切れるときもあるけど。)

pfsyncのネットワーク(上記では、192.168.0.0/24)から、各OpenBSD機にログインしておいて、ifconfig carp0とifconfig carp1をtoplessなんかで表示させながら、aueやaxeを抜き差ししてみると、statusが変わるのがわかって、いいかも。

はまったところ

  • vhidを、CARPデバイスごとに同じにしないといけない、というのが理解できなくて、最初、非常に苦労した。
  • 当初、(aueをpfsync用、)reをLAN側のデバイスとし、CARPで動かそうとしていた。しかし、切り替わりにとても時間がかかったり、切り替わりに失敗したりすることがあった。FreeBSDの方をみるかぎりでは、バグがあるっぽい。けど、よくわからなかったので、pfsync用にして、回避。

参考

おまけ:シリアルコンソールなしのOpenBSD/landisk on USL-5Pインストール

 gxemul

はやい話、ここに書いてあるとおりである。

gxemulというエミュレータがある。このエミュレータは、いろんなものをエミュレートするんだけど、そのひとつに、USL-5Pがあって、OpenBSD/landiskやNetBSD/landiskが動く。

エミュレータでちゃんと動くディスクイメージを作っておいて、そのイメージをCFに書く、というわけ。

 手順

gxemulが動くOSであれば、たぶんなんでもよい。わたしは、NetBSD/i386上で行った。gxemulのインストールは割愛。(pkgsrcからインストールできる。emulators/gxemul。)

まず、ディスクイメージをつくる。(書くCFより小さくしないといけない。)

 % dd if=/dev/zero of=landisk.img bs=1024 count=1048576
 % ls -lh landisk.img
 -rw-r--r--  1 isihara  hoge  1.0G Jul 24 22:42 landisk.img

次に、gxemulは、ネットワークインターフェースのエミュレーションがない。よって、ネットワークインストールできないので、インストール関連のファイルを用意し、isoを作る。

 % mkdir -p iso/5.0/landisk
 % cd iso/5.0/landisk
 % ftp ftp://ftp.jaist.ac.jp/pub/OpenBSD/5.0/landisk/INSTALL.landisk
 % ftp ftp://ftp.jaist.ac.jp/pub/OpenBSD/5.0/landisk/SHA256
 % ftp ftp://ftp.jaist.ac.jp/pub/OpenBSD/5.0/landisk/bsd
 % ftp ftp://ftp.jaist.ac.jp/pub/OpenBSD/5.0/landisk/bsd.rd
 % ftp ftp://ftp.jaist.ac.jp/pub/OpenBSD/5.0/landisk/base50.tgz
 % ftp ftp://ftp.jaist.ac.jp/pub/OpenBSD/5.0/landisk/etc50.tgz
 ...
 % cd ../../..
 % makefs -t cd9660 -o 'allow-multidot,rockridge' 50.iso iso

makefsは、NetBSDにはあるコマンド。Linux等の人は、cdrtoolsをインストールして、mkisofsを使おう。

あとは、bsd.rdを使ってbootする。

 % cp iso/5.0/landisk/bsd.rd .
 % gxemul -M 64 -x -E landisk -d landisk.img -d d:50.iso bsd.rd

のように起動する。wd0がlandisk.imgで、wd1が50.isoになる。-M はメモリ容量(MB)を指定してる。デフォルトでは、2Mなので、小さすぎ。

起動したら、普通のOpenBSDのインストーラなので、特に困ることはないと思う。ネットワークの設定は、後でした方がよいので、しなくてよい。

 Location of sets? (disk ftp http nfs or 'done') [http]

のところは、diskとこたえて、wd1をmountする。

  • .tgzの展開には、それなりに時間がかかる。(base50.tgzでMSIのU100だと、35分くらいかかる。)
 Making all device nodes...done.

のあと、ずっと止まったように見えるときは、Enterを入力して先に進もう。

 CONGRATULATIONS! Your OpenBSD install has been successfully completed!
 To boot the new system, enter 'reboot' at the command prompt.
 When you login to your new system the first time, please read your mail
 using the 'mail' command.
 

が出たら、インストール完了。

gxemulはhungupしやすいので、インストールだけさっさと終わらせて、設定は、landisk.imgをmountして、いじる事にする。gxemulを落とす前に、syncしておくこと。

あとは、USL-5Pのネットワークインターフェースはre0に見えるので、それにIPをふるなど、ネットワーク等の設定をしておく。

  • /etc/resolv.conf
  • /etc/rc.conf.local
  • /etc/hostname.re0
  • /etc/mygate
  • /etc/myname

あたりをいじることになる。

全部できたら、landisk.imgをddでCFに書く。 NetBSDの場合は、progressコマンドがあるので、

 dd if=landisk.img ibs=64k | progress -l 1g dd of=/dev/rsdXd obs=64k

等とすると、進捗がわかっていいかもしれない。

CFに書けたら、そのCFをUSL-5Pにつけて起動し、hostname.re0で設定したIPにsshdがまっているはずなので、ログインすればよい。

初回起動時は、isakmpd/iked RSA keyと、sshdのhost keysを生成するのに数分かかるので、気長に待つこと。

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

最終更新時間:2013年11月17日 22時43分24秒