「Networking OSとしてのOpenBSD」と題して、久しぶりにOSCでセミナーやります。日時は10/3(金)の11:15です。今回はOpenBSDのロードバランサーやHAシステムについて解説します。4.4ベースで、pfの冗長構成、relaydの使い方、DSRあたりもカバーする予定です。OpenBSDについてあまりご存じない方は、前回の資料「あなたの知らないOpenBSD」あたりに目を通しておきましょう。
ご存知のとおり、SSHは公開鍵暗号と共通鍵暗号のふたつを使いわけています。お互いの認証やSSH sessionで使う共通鍵のネゴシエーションには公開鍵暗号で、共通鍵を共有した後は共通鍵で暗号化します。公開鍵による暗号化はオーバーヘッドがあって遅いからです。このため、いくつものSSH sessionを張ったり、ログインとログアウトを繰り返す場合、時間がかかります。また、firewallでSSHのbrute-forceをsession数によって制限している場合、短時間でログインとログアウトを繰り返す操作が阻害されることがあります。
OpenSSHにはControlMasterというキーワードで、既存のSSH sessionを再利用する仕組みがあります。これにより、すでにSSH sessionが存在する場合はそのsessionを再利用して、(ネットワーク的に)新たなSSH sessionを作成しません。ログインが高速化されるため、scp、cvs、rsync、subversionなど、SSHを利用する操作も高速化されます。これはtentakelなどでログインを繰り返す操作で非常に有効です。また、ホストごとに作成されるSSH sessionも1つですみます。$HOME/.ssh/configに以下を追加します。
ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p
また、SSHサーバ側でDNSによるアクセス制限をしていない場合は、DNSによる名前解決を無効にしてしまうのもひとつの方法です。
UseDNS no
詳しくはssh_config(5)とsshd_config(5)を参照します。
FreeBSDとGentoo/Linuxをデスクトップに使い続けている俺様が来ましたよ。
インストールの難しさを挙げる人が必ず出てくるんだけど、これも大間違い。Linuxのインストール作業が難しい人にはWindowsのインストール作業も難しいよ。そもそもインストール作業なんてエンドユーザーがやるようなもんじゃないから、これは要素としては弱すぎ。
実際、Linux distributionがプレインストール済みで市販されていないんで、インストールが簡単であることは(Gentooを除いて)重要かと。企業などでの利用が前提なら、Windowsの無人インストールにあたる(日本語の)情報があまりないのは確か。でもRed HatやSUSEは文書も出してるし、やろうと思えばできる。
ドライバの少なさを挙げる人もたまにいる。これもあんまし意味が無い。動くもの使えばいいじゃない、というだけだからね。それに普通の人が使うマシンなんてオールインテルで充分で、IntelはLinuxドライバ率先して出してくれてるしね。
「動くもの使え」なんて言えるのは、OpenBSDユーザくらいじゃないかな(そもそも「動けばいいのか」という命題がOpenBSDにはある)。それに、Intelだけでどうにかなりますかね。つーか、Intelは必ずしも協力的なベンダではないし。グラフィック関係とWiFiは今でも鬼門ですよ。
ドライバに関しては、以前と比較してずいぶんましになった。グラフィック関係はAMDががんばってくれてるから、改善されていくんじゃないかな。WiFiはベンダーが文書を開示しないことが原因なので、リバースエンジニアリングしてくれてるhackerのみなさんにがんばってもらうか、開示しているベンダーのチップの採用が広まるか、Intelあたりが改心してNICと同じように文書を公開するしかない。ま、比較的athelosがきちんと動くので、WiFiもそこそこ大丈夫だけど。とはいえ、今でもlaptopの鉄板はThinkPad(最近はDellもいいかも)。
コマンドライン操作もいろいろと誤解があるね。「GUIなら簡単」というのは思い込みもいいところ。Windowsの管理、ホントにやったことあるのかと言いたい。あのわかりにくいアイコンとネーミングから目的の設定探し出す苦労と、コマンドラインコピペして実行する手間、どちらがマシだっていうのさ
コマンドラインというからには、管理者前提なんだろう。よくわかっていない状態でチクチクやるにはGUIはいい。自動化を考慮しなければいけない環境では、GUIでしか操作できないのはデメリットでしかない。WindowsのGUIの素晴らしさは、UIが良くも悪くも統一されてること。これはl10nにも言える。OSSで、あの品質を目指すのは難しいだろうね。今はPowerShellがあるんで、Windowsでもコマンドライン(というかシェル)のよさは見直されているんじゃないだろうか。つーか、Windowsのコマンドラインはシェルがダメダメ。zsh採用しろ。
設定も同様。実際Windowsの設定ちゃんとできる人なんてそうそういたりはしない。GUIメニューに無い設定を施すときはWindowsだってコマンドラインを使うこともある。
それをいっちゃあ、Linuxの管理者だって同じじゃねーの?ベンダの認定資格があるぶん、底辺はWindows管理者のほうがまだましかもしれんよ?コマンドラインどころか、ソースコードに手を入れる必要があったりするし!
Windowsは普段使ってる画面と同じものからそのままシームレスにセッティング画面にいけるから敷居が低く感じられるだけで、実はその難しさはLinux以上なんだよね。ドキュメント探すの大変だったり、高価だったりするし。そもそもエラーメッセージがわかりにくい事このうえない。
最近のmodernなインストーラは、それこそふつーの「普段使ってる画面」だよ。MSのサイトが使いにくいとか、検索がうんこだったりするのはあるけど、文書の濃密さと量はOSSに負けてない(企業の管理者向けの文書はすごくいい)し、少なくともまとまってるのはいいこと。わかりにくいエラーメッセージはいい勝負。
デスクトップ環境という意味では、WindowsもOSSなdistributionもどっちもどっちだと思う。OSSはドライバの対応がよくない(それでも、diskまわりとかのコアなドライバが動かないなんて、あまりない)けど、これはベンダの問題でもある。Windowsだって、ベンダ謹製のドライバがまともに動かないとかバグだらけだったりする(ところで、Windowsなひとってbug reportとかあげるんだろうか)し、デバイスドライバと格闘した人も多いでしょ。でも、プレインストールや組織での利用が前提なら、ハードウェアの選定で解決すべき問題だな。ソースコードが読めて、改変できるというメリットもあるけど、これはここでの論点ではなさそう。GUIに関して言えば、ガイドラインが比較的守られているという意味で、Windowsの方が統一感はあるよね。そういうのが可能なのも中央集権のなせる技であって、それが逆に選択肢がない(もしくは少ない)というデメリットにもなる。OSSではそういった統一感は難しいだろうね。i10nも含めて。OSSな環境でinteroperabilityが問題になる(特に文字コード)ことが多いけど、これは主にMSの責任だと思う。
Windows最大の弱点は、パッケージ管理システムがないこと。Microsoft Updateだって、サードパーティのパッケージは対象外だし、いちいち自分でダウンロードしてインストールしなければいけないし、アップデートの面倒もみなければいけない。これはMacでも同じ。逆に、Windowsの最大のメリットはActive Directoryだと思う。thin-clientにでもしない限り、現状のOSSでアレは無理。最近のMacでも難しいんじゃないかな。よく知らんけど。
サポートの話が出ているけれど、どうなんでしょ。商用製品のサポートってさ、よくわかってなさげなサポート要員に改善や機能追加の要望あげて、数ヶ月待たされたあげくによくわからん理由で却下されたりしない?OSSだとさ、コード書いてる開発者に直接コンタクトできて、(それなりにreasonableな)開発者の見解を聞けたりするんだけど。エンドユーザは別にしても、企業や組織の管理者にとってこれはけっこうメリットだと思うんだけど。Red Hatあたりだと、そういうことやってるのかなぁ。
本当のOSSのメリットは「自分の道具を他人の手に委ねないという自由」なんだけどね。ここでは関係ないですか、そうですか。
UPDATE: ( ( -_- ) < 馬鹿もん!エロゲがないからにきまっとるやろが! その程度ならwineで動くよ!
Vulnerability Note VU#800113 Multiple DNS implementations vulnerable to cache poisoningだそうです(Alliance forms to fix DNS poisoning flaw)。 PowerDNSがNot Vulnerableなのはエラい。
で、BIND 9.5.0-P1のdiff取ってみると、OpenBSDのarc4randomを使うことにしたらしい。
* ARC4 random number generator obtained from OpenBSD
「よくわからんけど、あいつらのことだから大丈夫だろ」だそうです。
/*
* Derived from OpenBSD's implementation. The rationale is not clear,
* but should be conservative enough in safety, and reasonably large
* for efficiency.
*/
mgr->arc4ctx.count = 1600000;
まとめ。
- ALIX 2.C3 (Yamamoto Tool Works)
- ケース (同上)
- 電源 12V 1A 100V-240V (海外でも使えるように) 500円程度 (秋月電気通商)
- (ノートとかに繋ぐなら)シリアルUSB変換アダプタ 1000円程度 (どこでも。自分は秋月電気通商)
- RS232C シリアルケーブル メスメスのクロス (M/Bにはオスがくっついてる) 300円程度 (千石電商)
- RTC clockバッテリー (なくても動く) CR2032 100円程度 (どこでも)
- CR2032の水平マウンター (なくても動く) 50円程度 (秋月電気通商)
- Compact Flash (どこでも。自分はテクノハウス東映で)
バッテリーをM/Bにくっつけるのであれば、はんだ用品とプラスチック用のヤスリ(マウンターがコンデンサに干渉するため削る必要がある)は別途必要。また、M/Bをケースに取り付ける際に、シリアルポートの六角状のネジを外すための道具(専用のドライバもしくは小さめのラジオペンチなど)が必要。全部ひっくるめて1台30,000円以下でした。
OpenBSDのinstallerはとーってもsimpleで、やることはあまりなくて簡単なんだけど、disklabel(8)でつまづくひとが多いと思う(自分もそうだった)。
覚えておくべきdisklabelのコマンドはa/d/pの3つだけ。a(add)はパーティションの追加、d(delete)は削除、p(print)は現在のdisklabelの表示。間違えたりわからなくなったら全部消してから、また追加し直せばよい。質問に対してenterだけ入力すると適切なdefault(もしあれば)が選択される。FreeBSDだと自動的に必要なパーティションとそのサイズを見繕ってくれるけど、OpenBSDにはそういう機能はない。
> a (パーティションを追加する) partition: [a] (パーティションの名前。自動的に最初のパーティション"a"がdefaultに選択されている) offset: [63] (パーティションが始まるdiskの位置) size: [15647247] 128M (パーティションのサイズ。MやGなどの単位で指定できる) Rounding to cylinder: 273042 (一番近いシリンダーに丸めたよ、というメッセージ) FS type: [4.2BSD] (ファイルシステムの形式) mount point: [none] / (そのパーティションをどこにmountするか)
注意: LinuxなどでのパーティションとBSDにおけるパーティションは違う(短い答え: BSDのスライスはLinuxなどにおける拡張パーティションだと思えばだいたいあってる。拡張パーティションの中に切るパーティションがBSDにおけるパーティション。詳しくはFreeBSD Handbookの3.5 Disk Organizationを参照)。
パーティションbはswapに使われる。パーティションcはdisk全体を表し、通常のパーティションには使わない(使えない)。つまり、ファイルシステムとして使えるのは、a/d/e/f…になる。以下はALIX 2C3でdisklabelしたときの例。
Initial label editor (enter '?' for help at any prompt) > a partition: [a] offset: [63] size: [15647247] 128M Rounding to cylinder: 273042 FS type: [4.2BSD] mount point: [none] / > a partition: [b] offset: [273105] size: [15374205] 256M Rounding to cylinder: 530145 FS type: [swap] > a partition: [d] offset: [803250] size: [14844060] 128M Rounding to cylinder: 273105 FS type: [4.2BSD] mount point: [none] /tmp > a partition: [e] offset: [1076355] size: [14570955] 2G Rounding to cylinder: 4209030 FS type: [4.2BSD] mount point: [none] /var > a partition: [f] offset: [5285385] size: [10361925] FS type: [4.2BSD] mount point: [none] /usr
現在の状態(まだdiskに反映されていない)を表示するにはp。
> p device: /dev/rwd0c type: ESDI disk: ESDI/IDE disk label: SILICON POWER bytes/sector: 512 sectors/track: 63 tracks/cylinder: 255 sectors/cylinder: 16065 cylinders: 974 total sectors: 15662304 free sectors: 0 rpm: 3600 16 partitions: # size offset fstype [fsize bsize cpg] a: 273042 63 4.2BSD 2048 16384 1 # / b: 530145 273105 swap c: 15662304 0 unused 0 0 d: 273105 803250 4.2BSD 2048 16384 1 # /tmp e: 4209030 1076355 4.2BSD 2048 16384 1 # /var f: 10361925 5285385 4.2BSD 2048 16384 1 # /usr
MB単位で表示するなら”p m”。GBなら”p g”
> p m device: /dev/rwd0c type: ESDI disk: ESDI/IDE disk label: SILICON POWER bytes/sector: 512 sectors/track: 63 tracks/cylinder: 255 sectors/cylinder: 16065 cylinders: 974 total bytes: 7647.6M free bytes: 0.0M rpm: 3600 16 partitions: # size offset fstype [fsize bsize cpg] a: 133.3M 0.0M 4.2BSD 2048 16384 1 # / b: 258.9M 133.4M swap c: 7647.6M 0.0M unused 0 0 d: 133.4M 392.2M 4.2BSD 2048 16384 1 # /tmp e: 2055.2M 525.6M 4.2BSD 2048 16384 1 # /var f: 5059.5M 2580.8M 4.2BSD 2048 16384 1 # /usr
間違いがあればdで削除してやり直し。OKならqで終了。
> q Write new label?: [y] y (ここで実際にdisklabelがdiskに反映される)
disklabelで設定したけど、改めて各パーティションのmount pointを聞いてくるので、必要なら修正することもできる。問題なければdone。
Mount point for wd0d (139776 KBytes)? (or 'none' or 'done') [/tmp] done No more disks to initialize. OpenBSD filesystems: wd0a / wd0d /tmp wd0e /var wd0f /usr The next step *DESTROYS* all existing data on these partitions! Are you really sure that you're ready to proceed? [no] yes (ここでファイルシステムが作成される)
どうでしょうか。わかってしまえば大してむずかしくないと思います。ま、とっつきにくいのは確かですけどね。
Geode LXにはH/W crypto acceleratorがくっついているそうで。その効果のほどを確認してみる。OpenBSDはdefaultでcrypto acceleratorを利用する。これを指定するのがkern.usercrypto。まずはdisableにした結果。
# sysctl kern.usercrypto=0 > openssl speed -evp aes-128-cbc -elapsed ... type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes aes-128-cbc 5375.57k 6010.66k 6257.21k 6330.60k 6343.99k
6300くらいで頭打ちになっているのがわかる。acceleratorを有効にすると。
# sysctl kern.usercrypto=1 > openssl speed -evp aes-128-cbc -elapsed ... type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes aes-128-cbc 890.39k 3372.81k 10764.85k 24398.63k 37274.13k
ほほう。ま、速いといっても、もっと速いCPUでsoftware処理するとやっぱりこれよか高速なんですけど。
FreeBSDでももうすぐ使えるようになるらしい(AMD Geode LX crypto accelerator (glxsb))。
DSR(direct server return)でのキモは以下の2点。
- load balancerがclientからvirtual IP address宛のパケットを、web serverにパケットを改変せず転送できること
- web serverでvirtual IP address宛のパケットを自分宛として受け取れること
前者はrelaydとpfが面倒見てくれるので、設定が必要なのは後者。これは各web serverでvirtual IP addressをloopback interfaceにaliasしてやればよい。10.0.0.12と10.0.0.13がweb serverで、10.0.0.14がload balancer。$VIPは対象のglobal IP addressに置き換えること。
load balancer上でIP addressを設定。UPDATE: reykがハマりどころを教えてくれた。
ah, and there is another nit - make sure that the shared ip address is an alias and not the first one on the interface
relayd is missing an option to specify the bind address for checks, so it will always use the primary address of the interface
つまり、host status checkにはinterfaceの最初のIP addressが使われるということで、以下のやりかたではうまくいかないらしい。
# ifconfig vr0 inet $VIP/$MASK (すでにhostname.if(5)で設定してあるならしなくてもよい) # ifconfig vr0 inet alias 10.0.0.14/24
正しくは、
# ifconfig vr0 inet 10.0.0.14/24 # ifconfig vr0 inet alias $VIP/$MASK
としなければいけないらしい。でも、手元では前者のやりかた(VIPをinterfaceのprimaryに、10.0.0.0/24をalias)でもaliasのIP addressでcheckしてくれてる。なんでだろ。ま、もしうまくいかなかったら$VIPをaliasにして、10.0.0.0/24をそのinterfaceのprimary addressに設定してみてください。
web server上でIP addressを設定。
# ifconfig fxp0 inet 10.0.0.12/24 (すでに設定されているならしなくてもよい) # ifconfig lo0 alias $VIP/32 (loop backにvirtual IP addressをくっつける)
pingなどでload balancerとweb server間で疎通確認する。
> ping -c 1 10.0.0.14 PING 10.0.0.14 (10.0.0.14): 56 data bytes 64 bytes from 10.0.0.14: icmp_seq=0 ttl=255 time=0.180 ms ...
で、relayd.confを書く。
webserver1="10.0.0.12"
webserver2="10.0.0.13"
vipaddress="$VIP"
table <webservers> { $webserver1 $webserver2 }
redirect www {
listen on $vipaddress port 80 interface vr0
route to <webservers> port 80 check icmp interface vr0
}
relaydはanchorを使ってpfのルールを動的に追加する。追加したルールを実際に有効にするためにpf.confのredirect sectionに追加。
# pf.conf rdr-anchor "relayd/*" pass all (もしくは通常のルール)
relaydを起動。
# relayd
なぜかわからないけど、relayd.confで定義したtable(webservers)がdefaultで無効になっている(これではまった)。relayctl(8)で見てみる。
# relayctl show summary Id Type Name Avlblty Status 0 redirect www down 1 table webservers:80 disabled
ID 1のtableを有効にする。
# relayctl table enable 1 command succeeded
確認。
# relayctl show summary Id Type Name Avlblty Status 0 redirect www down 1 table webservers:80 active (1 hosts up) 3 host 10.0.0.12 100.00% up 2 host 10.0.0.13 0.00% down
これで$VIP宛のパケットはweb serverに向けられる。clientから送られたままのパケットがweb serverに届くので、web serverは返事をclientに直接返す。
ちなみにrdr-anchorに突っ込まれるルールにはsloppyというオプションが使われている。
sloppy
Uses a sloppy TCP connection tracker that does not check sequence
numbers at all, which makes insertion and ICMP teardown attacks way
easier. This is intended to be used in situations where one does
not see all packets of a connection, e.g. in asymmetric routing
situations. Cannot be used with modulate or synproxy state.
seuqence numberを全然確認しないというオプションで、非常に危険。pf.confで直接記述するためのオプションではない。つまり、DSRをする場合はload balancerの前段でpacket filteringするということ。このへん、DSRに言及している記事で触れているのを見かけないのだけど、大丈夫なんですかね。上位の箱が頭悪い実装だったりするとひどいことになります。
あとはcarp(4)で冗長構成とるなり、disklessにするなりしてください。おしまい。
テストマシンをこれ以上増やすのもイヤになってきたので、ファンレスのPC Engines ALIX.2C3を購入(公式サポートページ)。
インストールはいつものpxeboot。
> mkdir pxeroot > cd pxeroot > wget ftp://ftp.jp.openbsd.org/pub/OpenBSD/snapshots/i386/bsd.rd > wget ftp://ftp.jp.openbsd.org/pub/OpenBSD/snapshots/i386/pxeboot > mkdir etc > vim etc/boot.conf
boot時に出力をシリアルコンソールに指定。BIOSのserial speedのdefaultが38400なので、それも指定する。
# etc/boot.conf set tty com0 stty com0 38400
これをしていなくて”entry point at 0×200120″とかで出力が止まってしまい、しばらくはまった。-sにpxerootへのpathを指定して、tftpをinetdもしくは単独で起動。192.168.100.254にDHCP/tftpサーバが動いているなら、dhcpd.confはこんなかんじ。
subnet 192.168.100.0 netmask 255.255.255.0 {
option routers 192.168.100.1;
option broadcast-address 192.168.100.255;
filename "pxeboot";
next-server 192.168.100.254;
}
メモリチェックが走っている時に”S”でBIOS設定。
PC Engines ALIX.2 v0.99b 640 KB Base Memory 261120 KB Extended Memory 01F0 Master 044A SILICON POWER Phys C/H/S 15538/16/63 Log C/H/S 974/255/63 LBA BIOS setup: (9) 9600 baud (2) 19200 baud *3* 38400 baud (5) 57600 baud (1) 115200 baud *C* CHS mode (L) LBA mode (W) HDD wait (V) HDD slave (U) UDMA enable (M) MFGPT workaround (P) late PCI init *R* Serial console enable (E) PXE boot enable (X) Xmodem upload (Q) Quit
“E”でpxebootを有効にして再起動。
PC Engines ALIX.2 v0.99b
640 KB Base Memory
261120 KB Extended Memory
01F0 Master 044A SILICON POWER
Phys C/H/S 15538/16/63 Log C/H/S 974/255/63 LBA
Intel UNDI, PXE-2.0 (build 082)
Copyright (C) 1997,1998,1999 Intel Corporation
VIA Rhine III Management Adapter v2.43 (2005/12/15)
CLIENT MAC ADDR: 00 0D B9 14 7C 74
CLIENT IP: 192.168.100.111 MASK: 255.255.255.0 DHCP IP: 192.168.100.254
GATEWAY IP: 192.168.100.1
probing: pc0 com0 pci pxe![2.1] mem[640K 255M a20=on]
disk: hd0*
net: mac 00:0d:b9:14:7c:74, ip 192.168.10.111, server 192.168.100.254
>> OpenBSD/i386 PXEBOOT 2.03
switching console to com0
com0: 38400 baud
boot> bsd.rd
booting tftp:bsd.rd: 5009332+877628 [52+190256+176222]=0x5f6d28
entry point at 0x200120
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.
Copyright (c) 1995-2008 OpenBSD. All rights reserved. http://www.OpenBSD.org
...
あとはふつーのインストールと同じ。
# dmesg
OpenBSD 4.3-current (GENERIC) #940: Thu Jun 19 07:41:29 MDT 2008
deraadt@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC
cpu0: Geode(TM) Integrated Processor by AMD PCS ("AuthenticAMD" 586-class) 499 MHz
cpu0: FPU,DE,PSE,TSC,MSR,CX8,SEP,PGE,CMOV,CFLUSH,MMX
real mem = 268009472 (255MB)
avail mem = 250957824 (239MB)
mainbus0 at root
bios0 at mainbus0: AT/286+ BIOS, date 01/27/08, BIOS32 rev. 0 @ 0xfceb2
pcibios0 at bios0: rev 2.1 @ 0xf0000/0x10000
pcibios0: pcibios_get_intr_routing - function not supported
pcibios0: PCI IRQ Routing information unavailable.
pcibios0: PCI bus #0 is the last bus
bios0: ROM list: 0xe0000/0xa800
cpu0 at mainbus0
pci0 at mainbus0 bus 0: configuration mode 1 (bios)
pchb0 at pci0 dev 1 function 0 "AMD Geode LX" rev 0x33
glxsb0 at pci0 dev 1 function 2 "AMD Geode LX Crypto" rev 0x00: RNG AES
vr0 at pci0 dev 9 function 0 "VIA VT6105M RhineIII" rev 0x96: irq 10, address 00:0d:b9:14:7c:74
ukphy0 at vr0 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x004063, model 0x0034
vr1 at pci0 dev 10 function 0 "VIA VT6105M RhineIII" rev 0x96: irq 11, address 00:0d:b9:14:7c:75
ukphy1 at vr1 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x004063, model 0x0034
vr2 at pci0 dev 11 function 0 "VIA VT6105M RhineIII" rev 0x96: irq 12, address 00:0d:b9:14:7c:76
ukphy2 at vr2 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x004063, model 0x0034
glxpcib0 at pci0 dev 15 function 0 "AMD CS5536 ISA" rev 0x03: rev 0, 32-bit 3579545Hz timer, watchdog, gpio
gpio0 at glxpcib0: 32 pins
pciide0 at pci0 dev 15 function 2 "AMD CS5536 IDE" rev 0x01: DMA, channel 0 wired to compatibility, channel 1 wired to compatibility
wd0 at pciide0 channel 0 drive 0: <SILICON POWER>
wd0: 1-sector PIO, LBA, 7647MB, 15662304 sectors
wd0(pciide0:0:0): using PIO mode 4, Ultra-DMA mode 2
pciide0: channel 1 ignored (disabled)
ohci0 at pci0 dev 15 function 4 "AMD CS5536 USB" rev 0x02: irq 15, version 1.0, legacy support
ehci0 at pci0 dev 15 function 5 "AMD CS5536 USB" rev 0x02: irq 15
usb0 at ehci0: USB revision 2.0
uhub0 at usb0 "AMD EHCI root hub" rev 2.00/1.00 addr 1
isa0 at glxpcib0
isadma0 at isa0
com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
com0: console
pcppi0 at isa0 port 0x61
midi0 at pcppi0: <PC speaker>
spkr0 at pcppi0
npx0 at isa0 port 0xf0/16: reported by CPUID; using exception 16
usb1 at ohci0: USB revision 1.0
uhub1 at usb1 "AMD OHCI root hub" rev 1.00/1.00 addr 1
biomask e3ef netmask ffef ttymask ffff
mtrr: K6-family MTRR support (2 registers)
nvram: invalid checksum
softraid0 at root
root on wd0a swap on wd0b dump on wd0b
clock: unknown CMOS layout
shutdownしたらBIOSでpxebootを無効にすること。
NICが10/100のvr(4)というのがアレだけど、NICが3枚で国内で入手可能なのはこいつぐらいしかない。発注して2日で届くし、代引きも可っていうのは便利。mini PCIもあるのでwireless APにもできる。2.5 inch HDDをつけられる40 pin IDEもあるけど、いっしょに購入したケースには余分なスペースがまったくないので使い道はなさそう。USBが2つあるので、HDDはそれで外付けすればいいか。どっかSoekrisを扱ってくれるとうれしいんだけど。RTCのバッテリーがついていないので、再起動するたびに時間がずれる。これはntpdに-s(起動時に時刻を合わせる)を指定することで回避可能。いちおう穴は開いているので後付けは可能(PC Engines社のWRAP(1D/1E)/ALIX(2C3)にReal Time Clock(RTC)バッテリーを付ける)。i386なので、armishやzaurusと異なり、豊富なpackageをすぐに利用できるのがいいね。実際にテストしてよさげならもう1台買って、pfやrelaydのfailoverのテストをするつもり。
OpenBSD CURRENTを追っかけるようになってから、稼働するサービスは極力baseだけで構成したくなった。外向けのサービスはDNSなので、tinydnsをbaseに入ってるBIND 9.4.2へ移行することに。tinydnsはIPv6に対応していないしな。BINDをまともに触るのは何年ぶりだ?
まずはrndcの鍵を作って
# rndc-confgen -a -t /var/named # named-checkconf -t /var/named
UDP port 54で並行稼動させながらテストでもすっか。
named -u named -g -t /var/named -p 54 Starting privilege seperation 16-Jun-2008 10:21:31.470 starting BIND 9.4.2 -u named -t /var/named -p 54 -g 16-Jun-2008 10:21:31.480 loading configuration from '/etc/named.conf' 16-Jun-2008 10:21:31.482 listening on IPv6 interfaces, port 54 [child]: disallowed port 54 Binding locally 16-Jun-2008 10:21:31.541 /usr/src/usr.sbin/bind/lib/isc/unix/socket.c:3217: unexpected error: 16-Jun-2008 10:21:31.541 bind: Operation not permitted 16-Jun-2008 10:21:31.542 could not listen on UDP socket: unexpected error 16-Jun-2008 10:21:31.542 listening on all IPv6 interfaces failed 16-Jun-2008 10:21:31.542 listening on IPv4 interface lo0, 127.0.0.1#54 [child]: disallowed port 54 Binding locally ...
お?54にbindできないってか。ackしてみるとsrc/usr.sbin/bind/lib/isc/unix/privsep.cで、53以外にはbindできないようになってたよ。実質-pオプションは使えない。
47 /* allowed privileged port numbers */ 48 #define NAMED_PORT_DEFAULT 53 49 #define RNDC_PORT_DEFAULT 953 50 #define LWRES_PORT_DEFAULT 921
こういうのがOpenBSD、ということで。いーです、じゃ、inet6だけでテストします。
options {
...
listen-on { none; };
listen-on-v6 { any; };
...
};
再挑戦。
# named -u named -t /var/named -g Starting privilege seperation 16-Jun-2008 10:24:03.173 starting BIND 9.4.2 -u named -t /var/named -g 16-Jun-2008 10:24:03.184 loading configuration from '/etc/named.conf' 16-Jun-2008 10:24:03.187 listening on IPv6 interfaces, port 53 Binding privsep [priv]: msg PRIV_BIND received Binding privsep [priv]: msg PRIV_BIND received Binding locally Binding locally
OKっぽい。chrootしてるのでsyslogdのsocketを追加。
# kill `cat /var/run/syslog.pid` # syslogd -a /var/empty/dev/log -a /var/named/dev/log
rc.conf.localに追加。
syslogd_flags="-a /var/named/dev/log" named_flags="-u named -t /var/named"
設定は稼働中のaxfrdnsからAXFRで移行。slaveの設定を追加。
zone "example.org" {
type slave;
file "slave/trombik.org";
masters { 127.0.0.1; };
};
reload。
# rndc reload
OKだったら、tinydnsをsvc -d /var/service/tinydnsで停止、BINDをslaveからmasterに昇格させて、inetにもbindさせて、restart。
これでNSが向いている先にAAAAを追加できる!と思ったら、NSレコードを追加しようとしても、レジストラの管理画面で「IPアドレスに使えない文字列が含まれています」だってさ。できるレジストラも限られているらしい(IPv6対応のRegistrar一覧)。うーむ。そうなっちゃいますか。いちおう、IPv6 readyなcache DNSサーバ(BIND)は上位がAAAAのglueくっつけなくても、IPv4でAAAAを引いてくれるらしい。
[c2k8]: Developer Blog: grunk@ - SSH Fingerprint Visualization Support
SSHのhost key fingerprintをASCII artにして表示するらしい。以下を$HOME/.ssh/configに追加。
CheckHostIP fingerprint
anoncvs.jp.openbsd.orgの場合。
1024 80:6d:6b:9e:2b:5e:a3:fa:cc:bb:f7:fe:46:9f:ce:be anoncvs.jp.openbsd.org,133.45.178.239 +--[ RSA]---------+ | | | o | | . + | | . o | | o S | | o . . | | = . . . | | o.o.o ..o | | .+O=.ooo.oE. | +-----------------+
んー、どうでしょう。アイデアはいいけど、実用的かどうかは微妙だ(loginするホストがそもそも多すぎとか)。ま、事前に安全な手段でfingerprintを配布する、fingerprintが異なる場合はloginするなを徹底する、でいいんじゃないでしょうか。
IPv6が必要になったので、gatewayのOpenBSDでIPv6 over IPv4のトンネルを掘ってみることにする。
まずは、brokerサービスのgo6.net(Freenet6)でアカウントを作成。接続用クライアントのソースコードを取ってきてコンパイル。と思ったらgw6cの野良portがあったので、ありがたく拝借させてもらう。portとしては、とってもまとも。make installしたらgw6c.confを作成して、/etcに置く。
-- /usr/local/share/gw6c/gw6c.conf.sample Wed Jun 4 14:53:48 2008 +++ /etc/gw6c.conf Wed Jun 4 15:36:00 2008 @@ -28,8 +28,8 @@ # userid=<your_userid> # passwd=<your_password> # -userid= -passwd= +userid=username +passwd=secret # # Gateway6 Server: @@ -48,7 +48,7 @@ # Freenet6 account holders should enter broker.freenet6.net, otherwise use # anon.freenet6.net. Your ISP may provide you with a different server name. # -server= +server=broker.freenet6.net #server=anon.freenet6.net #server=broker.freenet6.net @@ -68,7 +68,7 @@ # - any: If you are authenticating a username / password. # - anonymous: If you are connecting anonymously. # -auth_method=anonymous +auth_method=digest-md5 #auth_method=any @@ -82,7 +82,7 @@ # # host_type=<host |router> # -host_type=host +host_type=router # # Prefix Length: @@ -101,7 +101,7 @@ # # if_prefix=<interface name> # -if_prefix= +if_prefix=bge0 # # DNS Server: @@ -110,7 +110,7 @@ # # Example: dns_server=ns1.domain:ns2.domain:ns3.domain # -dns_server= +dns_server=ns1.example.org ######################### ADVANCED CONFIGURATION ############################## @@ -157,7 +157,7 @@ # # Recommended value: v6anyv4 # -tunnel_mode=v6anyv4 +tunnel_mode=v6v4 # # Tunnel Interface Name: @@ -277,10 +277,10 @@ # log_file=0 # log_syslog=0 # -#log_console= -#log_stderr= -#log_file= -#log_syslog= +log_console=0 +log_stderr=0 +log_file=0 +log_syslog=3 # # Log File Name:
次にpf.confにruleを追加。
#> IPv6
# allow initial authentication to tunnel broker...
pass out on $ext_if proto { udp, tcp } from $me to any port 3653
# allow IPv6-over-IPv4 packets...
pass out on $ext_if inet proto ipv6 from any to any
# allow all IPv6
pass out on $gif_if inet6
pass in on $int_if inet6
pfctl -f /etc/pf.confしたら、gw6cの起動。
# /usr/local/sbin/gw6c -f /etc/gw6c.conf # echo '/usr/local/sbin/gw6c -f /etc/gw6c.conf' >> /etc/rc.local
wrapperが必要な設定を行って、rtadvd(8)も起動してくれる。ifconfigでlinkを確認。
> ifconfig gif0
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
groups: gif egress
physical address inet 211.19.48.9 --> 64.86.88.116
inet6 fe80::290:ccff:fe51:aff0%gif0 -> prefixlen 64 scopeid 0x1e
inet6 2001:5c0:8fff:fffe::9f81 -> 2001:5c0:8fff:fffe::9f80 prefixlen 128
netstatでrouteの確認。
> netstat -rn -f inet6 Routing tables Internet6: Destination Gateway Flags Refs Use Mtu Prio Iface default 2001:5c0:8fff:fffe::9f80 UGS 1 439 - 8 gif0 ::1 ::1 UH 1 2 33208 4 lo0 ...
ping6で疎通確認。
> ping6 -c 1 www.kame.net PING6(56=40+8+8 bytes) 2001:5c0:8fff:fffe::9f81 --> 2001:200:0:8002:203:47ff:fea5:3085 16 bytes from 2001:200:0:8002:203:47ff:fea5:3085, icmp_seq=0 hlim=46 time=438.984 ms --- www.kame.net ping6 statistics --- 1 packets transmitted, 1 packets received, 0.0% packet loss round-trip min/avg/max/std-dev = 438.984/438.984/438.984/0.000 ms
IPv4とIPv6で40 hopもあるからなー。latencyはあきらめましょう。SSHはなんとか使い物になるし。
おしまい。
n2k8(Nippon 2008)が伊東で開催中なんですが、ちょっとした修学旅行になってます。20人分のlaptop+CVSサーバ+スイッチ3台の電源が足りないとか、Bob Beckに合う浴衣がないとか、そもそもXLの浴衣があまりないとか、ちょっとした問題はあるものの、時差をものともせずhackしてます。湿度が高いので浴衣が大好評。英語の話せる人はさすがにいないのですが、山喜旅館の社長さんにはずいぶん融通を効かせていただき、助かっています。
山喜旅館の利点は
- 会議室を24時間貸しきれる(好きな時間にhackできる)
- 温泉も24時間入れる
- コーヒーは無料(時間制限あり)
- 無線LAN完備
- しかも普通の日本旅館
でしょうか。いちおう、都内のホテルもあたってみたのですが、24時間貸切にできる会議室はないみたいです。とにかく、温泉でhackできるのがいい。
今回のテーマはネットワークなので、個人的にはEmobileのnative driverと、2年越しの懸案になってるpfのオーバーホール、relayd+pfのDSR実装とかに期待しています。reykによると、DSRの重要性は認識していて、すでに手をつけているらしい。
つか、こうして開発者が一同に介する時がOpenBSDプロジェクトの最大の脆弱性かもしれん。
基本はFreeBSDと同じなんだけど、そこかしこで違う点がたくさん。そのへんの差分をまとめてみた。
1つのreleaseに1つのports treeが基本。つまり4.2なら4.2のports treeを使わなければダメ。また、重大な問題がない限りアップデートはない。OSのreleaseはあげたくないけど新しいportsを使いたいなら、自分でportを書くしかない。最新のportsを追いかけるなら、CURRENTを使う。ports treeのアップデートはCVSで。cvsupやcsupもportsにある。
portsやpackageからインストールした場合、設定ファイルは/etc以下に、それ以外は/usr/local以下にインストールされる。
make cleanしても、依存しているportsまでcleanしてくれない。再帰的にcleanするなら、
# env CLEANDEPENDS=yes make clean
だいたいのpackageは用意されているので、pkg_addでpackageからインストールすることが多い。つーか、FAQではbinary packageを使うことが推奨されてる。PKG_PATHにFTPサーバのパスを指定するとそこからとってきてくれる。
# export PKG_PATH="ftp://ftp.jp.openbsd.org/pub/OpenBSD/`uname -r`/packages/`machine -a`/" # pkg_add zsh
/etc/make.confはない。代わりに/etc/mk.confがある。site localなportsを扱うには、PORTSDIR_PATHにそのディレクトリを追加する。
# /etc/mk.conf PORTSDIR_PATH="/usr/ports:/home/my/ports"
.zshrcなんかには以下を書いておく。
export CVSROOT="anoncvs@anoncvs.jp.openbsd.org:/cvs" export PKG_PATH="ftp://ftp.jp.openbsd.org/pub/OpenBSD/`uname -r`/packages/`machine -a`/"
portsの検索はFreeBSDと同じ。
> cd /usr/ports; make search key=foo
portsからインストールする際には、buildしてから仮想的なrootディレクトリにインストールされ、それをpackageにして、そのpackageからインストールする。このへんはPortageと同じ。なので、インストールせずにpackageを作成できる(ただし、BUILD_DEPENDSとかはインストールされてしまうけど)。
WITH_FOOはない。その代わりFLAVORSという仕組みがあり、特定のオプションをFLAVORで指定することができる。
# env FLAVOR="no_x11" make package
どんなFLAVORSがあるかはshow=FLAVORS。
> make show=FLAVORS
MULTI_PACKAGESという1つのportで複数のパッケージを扱う仕組みがある。例えば、foo-serverとfoo-client。特定のsubpackageをインストールするなら、
# env SUBPACKAGE="-server" make install
ただし、作成されるpackage名は必ずしもpackage-subpackageではない。
# cd /usr/ports/net/rrdtool # env SUBPACKAGE="-perl" make install
これでできるpackageはp5-RRD-1.2.23p0(p0はパッチレベル)。これがあるので、ディレクトリ名でpackageを探しても見つからないことがある。なので、探すときは前述したmake search name=fooで探すこと(p5-RRDで探せば出てくる)。
pkg_plistとpkg_descrはない。そのかわりpkg/PLISTとpkg/DESCRがある。subpackageがある場合は、pkg/{PLIST,DESCR}-subpackageになる。
もしX関係のsetをインストールしていないと
rrdtool-1.2.23 uses X11, but /usr/X11R6 not found.
というエラーが出ることがある。そういう場合はxbaseXX.tgz(rrdtoolの場合はfreetype2関連なのでxshareXX.tgzも必要。この辺はそれぞれの中身に何が入っているか知っておかないとむずかしいかも)
を取ってきて、以下のコマンドを実行。
# cd / # tar zxvhpf /path/to/xbaseXX.tgz # ldconfig -m /usr/X11R6/lib
こんなもんかな。
OpenBSD PRNG DNS Cache Poisoning and Predictable IP ID Weaknessの後日談。
きちんとbenchmarkとったら、今までのアルゴリズムは実は他の代替アルゴリズムより速くなかったことが判明。で、テストの結果、DragonFlyBSDの実装が一番速かったので、それをちょっとだけ速くしたものに置き換えたらしい。128KBのメモリを消費するけど、それぐらいは受け入れられるコストと判断したそうです。めでたしめでたし。
baseのBINDも同じコードが使われる予定。libcのresolverのコードはあまり問題ではないし、修正がややこしいので、4.3以降に持ち越されるそうです。
expatだけのために X をいれるってのは、らしくない気がしました。
まったくその通りで。
実はUpgrade Guide: 4.1 to 4.2の
“Packages are now using libexpat shipped with X; xbase42.tgz is your friend“に書いてあるんだけど、初めてインストールするときは見ないですよね。すみません。
とりあえずlibexpatを入れるだけならxbaseを全部入れなくてもOK。
> mkdir -p ~/tmp/xbase > cd ~/tmp/xbase > tar zxvf /path/to/xbase.tgz > cp usr/X11R6/lib/libexpat* /usr/lib
で、SambaをPortsから make && make install してるとエラーでこけた
もうひとつ、defaultでいいならpackageがお手軽です。PKG_PATHにミラーのURLを設定して、pkg_add一発です。
> echo $PKG_PATH http://ftp.ring.gr.jp/pub/OpenBSD/4.2/packages/i386/ # pkg_add zsh
Postfixってここ数年の間でたった2つしかバグ(筆者注 脆弱性)がないというようなことをお話されていた(と私の英語力では理解しました)Postfixは極力シンプルなコードで、バグを生まないような工夫をされているということもたしかお話されていて、これは懇親会のテクニカルセッションでお話があったOpenBSDに通じるなぁとふとその時は思いました。
バグが2つってのはないでしょ(その後、誤解だと判明)。んじゃ、自分が見つけたバグがそのうちの一つ?
今じゃすっかりPostfixから離れてしまって、最近のことは定かではないのですけど。Postfix(つーか、Wietse氏)のポリシーは、確かにOpenBSDのポリシーと共通するものがある。
- drasticな変更がない(evolution)
- 新機能に対して強い抵抗を示す
- でも、有用であれば実装する
- ユーザビリティにうるさい(必ずしも理想主義者というわけではない)
- ドキュメントが充実してる
- 開発体制が独裁者モデル(独裁的、ということではない)
- 標準(RFC、POSIX)に準拠する、けどundefな部分では好きにさせてもらう(securityのために)
- 負けず嫌い
じゃ、違う部分はと言うと?
- 変更できないdefaultはbugである(Postfix)
- 多すぎる「ボタン」は有害である(OpenBSD)
この辺、お互いがどう思っているのか聞いてみたい。ちなみにOpenBSD的には、PostfixがdefaultのMTAになることはありません(何だかんだ言って、sendmailの中の人たちはパッチを受け入れるから)。
そもそも論として、ランダムであることを要求するIDが16bitというのは短い。これは言っても仕方がないのだけど。
FreeBSDの修正のコメントにもあるように、この解決策のランダムなIDの生成方法はコストが高い。もうひとつ、OpenBSDは他のdistributionと異なり、defaultでIP IDをランダムにしている(他のdefaultはシーケンシャルなID)。なので、解決策を簡単にcommitすることもできない。開発者らは問題を認識しているけど、まだbetterな(defaultで有効にできるような)16bitの中から使われていない数を見つけるアルゴリズムがない。これが他のdistributionとの対応の差になっている。
インパクトとしてはDNSの毒入れがまずいのだけど、これはDNSサーバ上のpfで回避が可能。DNSの問い合わせ送信元portをランダムにすることで問題を緩和できる(NATではportがランダムになる)。
nat on egress inet proto { udp, tcp } from (self) to any port 53 -> egress
このへんの事情は、”OpenBSD is not reportedly planning to address this issue.“からは読み取れないよね。
I, newbie
I,



