5月 132009
 

前回書いた続編と言うか・・。

一応、apache を Proxy として利用できるようになり、コメントで hagyさん から、mod_mem_disk と mod_mem_cache の両方を書いたときの動作確認してよー。って言われたので、そのテストをしようと思った矢先・・。

テスト環境では、キャッシュしようと思っていたデータがベーシック認証の中にあったのでありました。つまり、キャッシュしてはいけないデータなので apache Proxy はデータをキャッシュしてくれないんですね・・。

フリーソフトウェアのほとんどの Proxy サーバはベーシック認証やダイジェスト認証の中にあるコンテンツについて、セキュリティの観点によりキャッシュサーバでは絶対にキャッシュしない。と言うポリシーのもとで作成されているみたいです。apache の場合、ドキュメントにちゃんと書いてあります。

http://httpd.apache.org/docs/2.2/ja/mod/mod_cache.html#cacheignorecachecontrol

NetApp 社の NetCache もしかりですが、設定が用意されているみたいで on no-cache とか on uncond-cache がそれにあたります(当然、設定 GUI からもできるとは思いますが;-)。

さてと。どーすんべなぁ。とか思って、一応 apache のソースを眺めたらわりと簡単にソース修正できそうだったので変更してしまいました。以下はそのパッチです。

--- modules/cache/mod_cache.c.ORG       2009-05-02 10:40:03.000000000 +0900
+++ modules/cache/mod_cache.c   2009-05-02 10:39:25.000000000 +0900
@@ -95,9 +95,12 @@
/* First things first - does the request allow us to return
* cached information at all? If not, just decline the request.
*/
+
+    /* Authorization pass.
if (auth) {
return DECLINED;
}
+    */
/* * Try to serve this request from the cache.

 
認証を通った後の判断を調べてリターンしている所をそっくりコメントアウトするパッチです。これにより、ベーシック認証通過後のコンテンツもキャッシュすることができるようになります。

ふぅ。これでキャッシュ用 Proxy サーバはなんとかでき上がりました。では続いて懸案であった、mod_mem_disk と mod_mem_cache の両方を書いたときの動作確認をしたいと思います。

が・・。どう言うわけか mod_mem_cache の設定を書いていると httpd が Segmentation fault(11) してしまいます(今回は prefork で make したので一個のプロセスが Segmentation fault を起こすのみで、全ての httpd は死んではいないため port:80 では LISTEN が可能状態です)。一番最初、キャッシュしていない状態でアクセスがあった場合はマスターサーバから、仮に「A」と言うコンテンツを取ってきてキャッシュして、そしてクライアントに返します。

次に別のクライアントがコンテンツ「A」を取りに来たとき、httpd がこの時に Segmentation fault(11) で落ちてしまう。と言う状態に陥ったのでありました。なので、コンテンツは DISK 上(もしくはメモリ上)に溜まるけど、利用されることは無い。と言う感じですね。

#ちなみに mod_mem_cache で溜まったキャッシュの情報ってどうやって確認するのだろう・・。メモリ利用量のみで判断するのかなぁ?

mod_mem_cache を削除して mod_mem_disk の設定のみを書いたときは正しくキャッシュできて、 Segmentation fault(11) もせず、キャッシュされたデータも再利用できることを確認しました。なので運用的にはキャッシュデータは DISK のみに保存する。と言う方向で行きたいと思います。

ごめんねー。hagyさん。

それにしても、色々詳しく調べるまで、ベーシック認証配下のコンテンツはキャッシュしない。と言うのを知らなかったなぁ。まぁ、考えてみれば当たり前だよなー。認証の奥にある情報が実は Proxy キャッシュサーバの中に残っていた。なんてのは怖いことだもんなぁ。

4月 242009
 

前回は、mrtg が実質的に IPv6 に対応していないねぇ。って所で話が終わったのですが、そこから進展がちょっとあったので書いてみたいと思います。

net-snmp に対して IPv6 で接続したい人は前の記事を先に読んで 、その後でこの記事を読んでください。

さてと。物語りは前回からの続きなのですが、mrtg の config ファイルを記述した時、 Target に IPv6 を記述した場合 ifIndex でしかトラフィック情報が取得できない。と言う所で終わりました。

確かに、何度試してもダメだったので、debug オプションを有効にしてログを見つつソースコードなどを眺めていたら問題点を発見しました。最近の ports-current から mrtg をインストールするとmrtg-2.16.2,1 がインストールされるのですが、その時に /usr/local/lib/perl5/site_perl/5.8.9/Net_SNMP_util.pm も併せてインストールされます。こいつの中で Net::SNMP を呼んでいる時に -domain で udp/IPv4 しかセットしていないみたいなので udp/IPv6 をセットするようにしたら IPv6 でも一応動くようになりました。

修正分のパッチはこの辺りに置いておきます

このパッチを適用することにより、FQDN で問い合わせした時は ifDescr でも値が取れる事を確認できました。以下におさらいしてみることにしましょう。

・IPv6 で SNMP が取得できるもの

Target[dir_re1]: 2:public@taro6.running-dog.net:
Target[dir_re1]: \re1:public@taro6.running-dog.net:
Target[dir_re1]: 2:public@[2001:200:161:14cc::1:1]:161:

 
taro6.running-dog.net は DNS に IPv6 のみのアドレスが登録されています。

この設定では IPv6 では ifIndex と ifDescr でトラフィック量を取得することができました。

・取得できないもの

MAC アドレス指定(FQDN・IPv6 共に)
ifDescr 指定での IPv6 アドレスを記述した場合

とまぁ、こんな感じで ifDescr で取得できるようになったのでヨシとしておきましょう。それにしても DNS は必須になってしまうのですが・・。

後、net-snmp って –enable-ipv6 で make しても snmpwalk は IPv6 に対応していないのねぇ。DNS に IPv6 のみ登録してある FQDN を指定しても「そんなアドレス知らん。」とか言われます。/etc/hosts に書いてもダメ。snmpd が IPv6 に対応しているだけにもったいないことです・・。

さてと。ここまでは net-snmp と mrtg のお話で、前回の続きの完結編。と言う感じになります。

続きまして rrdtool に行ってみましょうか。ports 的には ports/databases/rrdtool になりますが、これをインストールすると RRDs と言う perl のモジュールをインストールしてくれて RRDs::graph と言うモジュールを使うと MRTG グラフを表示してくれます。グラフを作成する際のオプションとして IPv6 アドレスが存在した場合にどうなるのか?

正解ですが、”:” は区切り文字に使われているので DEF: の設定に IPv6 アドレスがあるとまともに動作してくれません。

ports 的な rrdtool-1.3.5 のソースを見てみると rrdtool-1.3.5/src/rrd_graph_helper.c に以下のような記述が所々にあり、”[]” で囲むとか “\:” などしても全然対処できないと言うことが解ります。

if (line[*eaten] == '\0' || line[*eaten] == ':') {
    dprintf("- no (or: empty) legend found\n");
    return 0;
}

 
と、言うことで RRDs を使う場合には IPv6 を意識しないようにしないとまずいです。では、どんな時に IPv6 を使う必然性が出てくるのかとなるのですが、僕の場合、rrdfile と PNG ファイルの保存場所に IP アドレスを利用してる感じですね。

/data/mrtg/192.168.1.1/re1.rrd
/data/mrtg/2001:200:161:14cc::1:1/re1.rrd

でもって RRDs::graph では以下のようなコーテイングをしていたらこらアカンですわなー。

:
my $rrdfile = "/data/mrtg/2001:200:161:14cc::1:1/re1.rrd";
my $pngfile = "/data/mrtg/2001:200:161:14cc::1:1/re1.png";
push (@options
    :
    ,"DEF:avein0=${rrdfile}:ds0:AVERAGE",  "CDEF:avein=avein0,8,*"
    ,"DEF:maxin0=${rrdfile}:ds0:MAX",      "CDEF:maxin=maxin0,8,*"
    :
);
my @rv = RRDs::graph( $pngfile ,@optins : );

 
なので、結局 $rrdfile =~ s/:/_/g; など言う弱いことをして問題回避したのでありました。

これで、net-snmp・mrtg・rrdtools の IPv6 対応が一応終わった感じかなぁ。10Gbps 問題も回避できたし、今の所は多分これで IPv6 な世界が来ても大丈夫なような気がします。が・・。mrtg には IPv6 対応をもう少し頑張ってもらい所ではあります。

http://oss.oetiker.ch/mrtg/doc/mrtg-ipv6.en.html

こんな所読んだって Target の所がハショッて書いてありすぎで全然ダメなんだもの・・。トホホ。

くーーっ。MacOSX Leopard の /usr/sbin/snmpd は 5.4.1 使っているのに IPv6 に対応してないじゃん。 udp6:161 のオプション、そんなのねーー。とか言いやがる・・orz。これはヒサンだ・・。

つまり、どういうことかと言うと、例えば MacOSX を leopard.running-dog.net と言う FQDN で 192.168.1.30 と 2001:200:161:14cc::1:10 の二つ RR レコードを記述していた場合、mrtg.cfg の Tagrt に FQDN を記述すれば mrtg は IPv6 で問い合わせに行くことになります。

けど、MacOSX の snmpd は IPv4 にしか答えないので mrtg はエラーとなります。そして、mrtg は「IPv6 から IPv4 にフェイルオーバーしないよ。」と言う仕様なので、MacOSX への mrtg.cfg の設定における Target は FQDN ではなく、IPv4 アドレスを記述しないと正しく情報が取得できないことになります。

いやぁ・・。奥が深い・・。まず最初に監視対象機器が DNS に A と AAAA があるか確認した後、当該機器の snmpd が IPv6 に対応しているか確認してからでないと mrtg.cfg の記述が完成しないんだー・・。

と。言うこで、このネタ。ここまでにしておきましょう・・。

3月 252009
 

Proxy サーバ、何が一番良いのだろう?と、思い、まず、パッとひらめいたのが squid だったので、それを利用して Proxy サーバを構築してみた。ふむ。設定を施した後はちゃんと動作してキャッシュも溜まっていくねぇ。と言う感じだったのだけど・・。

ps で確認してみると squid は一個のプロセスでしか動作していない。でもってマルチスレッドにもなっていないので、ふと「これで同時にたくさんのアクセスがあった場合どうなるんだ?」とか思い調べてみると・・。あぁら。squid はファイルハンドラがボトルネックになって大規模な運用を行うのには向いてないのねぇ(そら、squid サーバを複数台立てれば大規模サイトの運用できるのは解るけど、全然現実的しゃないじゃん;-()。というのが発覚。

default で 1024 個のファイルハンドラしか無い状態で一個の接続に三つのファイルハンドラを利用するとなると同時に接続できるのは 300 個のクライアントじゃん。ダメだこら。と言うことで別の Proxy サーバを探し始めます。

続いてトライしたのが apache の 2.2.9 。まぁ、大規模環境において動けば良いのでねぇ。他にも色々あるみたいだけど、勝手知ったると言うか・・(^^;;。

Proxy サーバと、後、キャッシュサーバとしてのみ動作させるので要らない機能は落とします。configure 時のオプションはこんな感じ。–with-mpm=worker を付けたのでスレッドな httpd として動作します。

$ ./configure --enable-headers --enable-so
--with-mpm=worker
--disable-cgi --disable-cgid --disable-userdir
--enable-proxy --enable-proxy-ftp --enable-proxy-http --enable-proxy-connect
--enable-file-cache --enable-cache --enable-disk-cache --enable-mem-cache

 
さてと。インストールが終わっていよいよ設定ですが、今回は以下のようにします。

・192.168.1.200 で動作しているサーバの情報をキャッシュするための Proxy サーバを構築します。
・Proxy サーバに対して port:8080 でアクセスした場合はキャッシュしません。
・Proxy サーバに対して port:8081 でアクセスした場合はキャッシュして、その情報を利用するようにします。

オープン Proxy サーバとならないように 192.168.1.200 にのみアクセス可能なサーバとします。これでどこから接続があってもまるで利用できないものとなりますし;-)。

で、設定は大体こんな感じなのだけど、一番苦労した点が、port:8080 にアクセスした場合にキャッシュしないもしくはキャッシュ情報を利用しないで、port:8081にアクセスがあった場合はキャッシュを利用するもしくは新規に取ってきた情報をキャッシュするように動作する設定でした。

<IfModule mod_proxy.c>
    ProxyRequests Off
    ProxyVia On
    AllowCONNECT 8080 8081
<Proxy *:8080> Order deny,allow # Deny from all Allow from all </Proxy>
<Proxy *:8081> Order deny,allow # Deny from all Allow from all </Proxy>
<VirtualHost *:8080> ProxyPass / http://192.168.1.200/ <IfModule mod_cache.c> CacheDisable / </IfModule> </VirtualHost>
<VirtualHost *:8081> ProxyPass / http://192.168.1.200/ <IfModule mod_cache.c> <IfModule mod_disk_cache.c> CacheRoot /data/httpd/cache/ CacheEnable disk / CacheMaxExpire 5184000 CacheDefaultExpire 5184000 CacheDirLevels 3 CacheDirLength 5 </IfModule>
<IfModule mod_mem_cache.c> CacheEnable mem / MCacheSize 2048000 MCacheMaxObjectCount 100 MCacheMinObjectSize 1 MCacheMaxObjectSize 10240000 </IfModule> </IfModule> </VirtualHost> </IfModule>

 
Proxy ディレクティブはアクセス制限のためにしか書けないのねぇ。けっこう悲しい。僕的には <Proxy *:8080> の中に mod_cache の情報が書けるとすごーい嬉しいと思ったのだけど・・。

しょーがないので VirtualHost ディレクティブを記述して、そこで port をわけて、一個は CacheDisable、もう一個の 8081 では CacheEnable を記述すると言う、非常にややこしい設定となってしまいました。まぁ、それが apache の設定だぜぃ。と言われればその通りで、この設定をパッと思いついてしまう自分もすっかりと apache に染まっているのだなぁ(自慢か?;-P)と思ってしまうのだけど・・。

個別の設定については詳しい説明は書きませんので apache.orgのドキュメントを参照してください。

今回やりたかったのは、キャッシュを利用するポートとキャッシュを利用しないポートでサービスができる Proxy サーバが欲しかった。と言う感じでしょうか。

2月 192009
 

FreeBSD で net-snmp のデーモンを起動して、別のマシンから MRTG でデータを取得してグラフを表示させる。なんてのは google で検索するとゴマンと出てくるので、ここではもっと局所的な情報を書いてみたいと思います。

まず、net-snmpd ですが、起動時に以下のオプションを付加すると IPv6 対応になります。 以下は rc.conf.local への書き方です。udp6:161 と udp:161 で待っているよ。ってオプションを追加します。

snmpd_enable="YES"
snmpd_flags="udp6:161 udp:161"
snmpd_pidfile="/var/run/snmpd.pid"
snmpd_conffile="/usr/local/etc/snmp/snmpd.conf"

 
これで snmpd のほうは IPv6 対応になるので、まぁそこそこ簡単です。起動した時のプロセスを見るとこんな感じです。

/usr/local/sbin/snmpd -c /usr/local/etc/snmp/snmpd.conf -p /var/run/snmpd.pid udp6:161 udp:161

 
さてと。問題は MRTG のほうですが、こっちはたくさん色々あります。まず、 ports から /usr/ports/net-mgmt/mrtg をインストールするのですが IPv6 enable にしてインストールします。その時、perl モジュールとして p5-Socket6 と p5-IO-Socket-INET6 がインストールされたことを確認します。

けど、FreeBSD の ports からインストールした場合、これだけではまともに mrtg が動作しません。p5-SNMP_Session(この中の SNMP_util.pm を mrtg が利用します) も併せてインストールしてあげる必要があります。この p5-SNMP_Session は mrtg の関連性でインストールされないので明らかに mrtg の ports の問題だと思われます。 send-pr ネタです;-)。

後、mrtg の ports にはもう一個問題と言うか気になる点が有って Cisco などのルータやスイッチの 10G インターフェースをグラフに表示しようとすると桁あふれしてまともなグラフになりません。10Gbps なインターフェースは 32bit int では足りなくて 64bit int が必要と言うことですね。そんな時は p5-Math-BigInt と p5-Math-BigInt-GMP を併せてインストールしてあげます。これも mrtg の port において関連性を是非付けてもらいたいものです。
# 10G インターフェースあるルータの MRTG なんざとらねぇよ。って声が聞こえてきそうですが・・;-)。

さてと。これでようやっとインストールが完了しました。これで mrtg を起動しますが、その前に mrtg.cfg を用意して上げます。今回は cfgmaker で作成してもしなくとも良いです。mrtg.cfg はこんな感じになりました。IPv6 アドレスでアクセスしたいぜぃ。って感じです。

#############################################################################
# System: WebServer (2001:200:161:14cc::1:1) Descr: re0
#############################################################################
#Target[[2001:200:161:14cc::1:1]_re0]: \re0:nopublic@[2001:200:161:14cc::1:1]:
Target[[2001:200:161:14cc::1:1]_re0]: 1:nopublic@[2001:200:161:14cc::1:1]:
MaxBytes[[2001:200:161:14cc::1:1]_re0]: 125000000
Title[[2001:200:161:14cc::1:1]_re0]: Traffic re0
Directory[[2001:200:161:14cc::1:1]_re0]: 2001:200:161:14cc::1:1
PageTop[[2001:200:161:14cc::1:1]_re0]: 以下略

 
それにしてもすごーく大きな問題点が・・。インターフェース情報の設定において Target には ifIndex しか書けない状態となっております。ifDescr などを書くとエラーとなってしまうのです。orz。上記の場合、re0 は固定な NIC なので良いけど、gif とか gre なインターフェースみたいに動的に生えたり消えたりするインターフェースの場合、どうすんのさぁ・・。ちなみに /IP でも設定してみたけど、やはりダメ・・。困ったなぁ・・。

MRTG 2.16.2 configuration reference

この辺りを見ても全然ダメなので MRTG_lib.pm に直接手を加えるしか無いかも・・。そもそも、 “&”, “:”, “@” とか ” ” を “\” で修飾しなさい。ってんだけど、IPv6 アドレスに “:” があるのでマトモに動作しないんだろうなぁ。と勝手に思っているのですが・・。

あぁ。ちなみに nopublic@ の後に IPv6 アドレスでなく FQDN を書いた場合は無事に動作します。ただ、MRTG の仕様として IPv6->Ipv4 へのフェイルオーバーはしない。と言っているのでその点をどう考えるかですね。

後、ルータやスイッチなどのネットワーク機器は基本的に DNS へは登録しないので FQDN だと OK よ。って言われてもいまいち説得力ないですよねぇ・・。

今の段階の MRTG ではこれが限界なのかな。新しいバージョンに大いに期待することにしましょう。

この後、話は rrdtool にまで及ぶのでしょうか? 既に “:” がある IPv6 アドレスを DEF: とかに記述した段階で動いていないのですが、まだそこまで手は回っていません;-)

この記事のつづきを書きました。

11月 122008
 

渋谷に新しくヤマダ電気が出来たのだけど、そこの特売で今はディスコンのバッファロー(FreeBSD 的には MELCO)の WLR-UC-G が 1,480yen で売っていた。

USB 接続の無線 LAN アダプタで、WindowsXP 上では AOSS と言うソフトウェアルータを利用して無線アクセスポイントになれる。と言うヤツ。

Windows 専用のアプリケーションをインストールすると無線アクセスポイントになれるんだけど、これを FreeBSD に接続してフツーに無線 LAN アダプタに利用できないかなぁ。と思い、購入。まぁ、FreeBSD で動かなければ WindowsXP で iPod Touch 用に利用すれば良いかな。とも思ったんだけど。

で、FreeBSD に早速接続してみた。kldload if_* とかした後で。けど、かわいくないなぁ。ugen0 に落ちてしまった。しくしく。

さてと。格闘はここから。まず、WLR-UC-G はどんなチップが乗っているのか? google で探すのだけど、どうも解らない。Linux 方面での実績を調べてみたのだけど、それも無いみたい・・。あらら。結局どんなチップを使っているのか google では解らなかったので、しょーがない。Windows に付属の CD からドライバをインストールして調べてみた。すると、Ralink Technology Corp. と言う所のドライバを利用しているみたい。ふぅ。

ちなみに FreeBSD に接続した時の usbdevs -v はこんな感じ。

port 5 addr 2: high speed, power 300 mA, config 1, WLR-UC-G(0x0119), Buffalo(0x0411), rev 0.01

 
ただ、こいつ、しゃらくさいことにプロダクト ID を二つ持っている。AP モードにした場合は 0x0119、クライアントモードにした場合は 0x0116 となる。これを覚えておいてと。

これ位の情報が手に入ると後は簡単。FreeBSD で Ralink Technology Corp. 用のカーネモジュールが無いか調べてみたら if_rum と言うのがあるじゃーん。と、言うことで最新の 7.1-STABLE のソースコードを持ってきてエントリを追加します。

でもって出来たパッチはこの辺りにおいておきます。

http://www.icmpv6.org/Prog/FreeBSD_patches/MELCO_WLR-UC-G.patch

プロダクト ID を二つ登録したので AP モードでもクライアントモードでもどっちでも 無線 LAN アダプタとして利用可能です。けど、クライアントモードで利用したほうが安心かも;-)。

実際に利用するするためには色々なカーネルモジュールをロードする必要がありまずが、ここでは割愛させていただきます;-)。 僕が試した感じでは ifconfig rum0 up して、ssid 付けて dhcp でアドレスが付きました。後 ifconfig rum0 scan も利用できました。

FreeBSD において AP モードは利用できないけど、ハードウェア自体は利用できるようになりました。めでたしめでたし。と言うことにしましょう;-)。

10月 142008
 

新しい BB ルータを買ったら、IPv6 閉域網のアドレスが降ってきて、FreeBSD の rtsol で付くようになってしまった。と言うのは前回書いた

この時は「ip6addrctl より先ににまずはルーティングだよねぇ。」って書いたんだけど、いよいよ ip6addrctl が必要になってきた。と、言うのも、僕の場合、/etc/hosts には以下のように書いている。

# google
2001:4860:0:2001::68       www.google.com

 
そー。ipv6.google.com と、言うのがあるんだけど、これを default で見に行くように設定しているのでした。

この設定をした場合、ipv6.google.com に対してアクセスするとき、僕が持っている IPv6 グローバルアドレスである、2001:200:: より、 NTT の Flet’s v6 (以降「IPv6 閉域網」と記述)の 2001:c90:: のほうが「デスティネーションと同じかより大きなスコープのアドレスが優先」されると言う法則により、ソースアドレスの IPv6 アドレス、つまり、自分のマシンのソースアドレスが IPv6 閉域網のアドレスになるので ipv6.google.com にはアクセスできない。と言う事態が発生してしまうのでした。

こらーもう /etc/ip6addrctl.conf 書くしかねぇべや。と言うことで当初書いていたのがこんな感じ。

:ffff:0:0/96 50     0
::1/128       40    1
::/0          30    2
2002::/16     20    3
::/96         10    4
2001:200::/35 10  100
2001:c90::/32  1  101

 
これでもーたいじょーぶだべ。とか思って、しばらく利用していたんだけど、どうもおかしい。やはり、ipv6.google.com にアクセスできない場合がある。で、どういう時にアクセスできないのか?と、言うと ifconfig でインターフェースについている IPv6 アドレスのうち、一番上についているアドレスがソースアドレスとして動作している。と言うことが解りました。

つまり、IPv6 閉域網のルータ通知デーモンと、自宅の rtadvd が動作しているルータから rtsol で IPv6 アドレスを取得した場合、NTT 側のルータが先に反応すると IPv6 閉域網の IPv6 アドレスが一番先に付いてしまうので ifconfig した時に一番上に来てしまう。その状態で ipv6.google に ping6 してもソースアドレスが IPv6 閉域網のものであるために到達性が無い。と言うことですね。

それにしても ip6addrctl の設定ファイルを書いてもなんでじゃー!?どうしてじゃー!?状態に陥るのでこざいました・・。

で、とある有識者、FreeBSD と IPv6 に詳しい人にお尋ねしたところ、自分が利用したい IPv6 は /etc/ip6addrctl.conf に書く必要はないので消せば良いでしょう。ちゃんと RFC3484 読もうねぇ。と言われつつ教えていただきました。

なので、正しい /etc/ip6addrctl.conf の書き方は以下のようになりますねー。

::ffff:0:0/96 50    0
::1/128       40    1
::/0          30    2
2002::/16     20    3
::/96         10    4
2001:c90::/32  1  101 

 
自分が利用したいアドレスである 2001:200::/35 を削除するのが正解なのでした。この設定を有効にした状態でなおかつ IPv6 閉域網のアドレスが ifconfig で見たときに一番上に来ていても、2001:200:: のアドレスをソースアドレスとして ipv6.google に到達できるようになりました。

良かった良かった。そして、ありがとうございました。

なお、その他の設定の意味については以下の URL を参照すれば大丈夫だと思われます。

http://www.imasy.or.jp/~ume/presentation/CBUG-20031129/text0.html

それにしてもこのドキュメントが書かれたのは 2003 年 11 月ですか・・。

ありがとうございました。 ume さん。

ちなみに MacOSX Leopard には ip6addrctl コマンドがありません。そして、やはり ifconfig で一番上に付いた IPv6 アドレスがソースアドレスになってしまうようです。

ただ、もしかしたら rtsol の時に何かしているのかもしれません。FreeBSD とは違って、IPv6 閉域網の IPv6 が、グローバル IPv6 アドレスより先に付くことは無いですね。ネットワークの設定の所でどっちをメインの IPv6 に使うか設定があったかなぁ?今手元に MacOSX が無いので良くわからないのですけど・・。

9月 122008
 

Aterm WR8500N を購入した 。と言うのは前回のブログに書きました。こいつには IPv6 ブリッジ機能があって、フレッツ・スクウェア v6 の IPv6 アドレスが rtsol で取得できる。WindowsXP もフレッツ・スクウェアの IPv6 アドレスが取得できる。

けど、うちにはグローバルな IPv6 も存在するのでこの時点で一つのノードは二つの prefix を持つことになる。

自宅にはグローバル IPv6 のルータが存在して、これは dtcpc で /54 を持ってて、家の中では /64 を利用している。でもって、WR8500N で IPv6 ブリッジ機を有効にするとヒサンな目に遭う。

何が悲惨かと言うと、IPv6 の default gateway がフレッツ・スクウェア v6 のアドレスに設定されてしまって、全ての IPv6 パケットは NTT の閉域網に流れてしまう。

rtsol を実行したときに rtadvd が二か所で動いているとどう言うルールで default gateway を乗っ取るのだろう?どちらかメインのほうを決めることとか出来ないのだろうか・・。

実はできる。自宅の IPv6 ルータで起動している rtadvd の設定ファイルである /etc/rtadvd.conf において raflags の 3,4bit 目を 01 にすると自宅の IPv6 サーバの rtadvd のほうが優先順位が高くなり、default gateway として設定される。ただ、NTT 側の rtadvd に相当するものが同じような設定をしていた場合にはどっちも優先順位が一緒なのでまたまた泥沼にはまるけど;-|。

しかし、ルーティングの設定については FreeBSD において /etc/rc.conf で設定ができるみたいです。

以下は例ですが、ipv6_defaultrouter でグローバル IPv6 網宛ての default gateway を設定して、フレッツ・スクウェア v6 は /32 で static route にしましょう。と言う感じです。ともにリンクローカルアドレスを gateway として設定します。

ipv6_defaultrouter="fe80::20d:bff:fe48:ef52%re1"
ipv6_static_routes="flets"
ipv6_route_flets="2001:c90::/32 fe80::217:fff:fe1c:501a%re1"

 
うちの環境ではフレッツ・スクウェア v6 の IPv6 アドレスは 2001:c90:609:42a6/64 が降ってきますが、NTT 東日本側では 2001:c90::/32 が利用されているため、その static route を設定します。

さて、これではイマイチ動作が見えないので、手動でルートを設定するスクリプトを書いてみました。こんな感じ。

http://www.icmpv6.org/Prog/IPv6Route.sh.sample

まずは詳細についてですが、上の部分でネットワークの設定を行います。

この二つの設定は v6tunaddr でグローバル IPv6、v6tunprefix はその prefixlength。fletsaddr はフレッツ・スクウェア v6 の アドレスで fletsprefix はその prefixlength。

v6tunaddr="3ffe:505:1411::"
fletsaddr="2001:c90::"
v6tunprefix="-prefixlen 64" fletsprefix="-prefixlen 32"

 
リンクローカルアドレスに必要な NIC 名 は netstat から取得します。

以下は gateway となるリンクローカルアドレスの設定。v6tungw はグローバル IPv6 の gateway、下は NTT 側。

v6tungw="fe80::20d:bff:fe48:ef52%${llif}"
fletsgw="fe80::217:fff:fe1c:501a%${llif}"

 
これらの値を自分の家の設定にして、後はコマンドを実行するだけ。そーすると、route コマンドをバババと打ってくれてネットワークの到達性を確保してくれます。

普段から ra に慣れていると、IPv6 の route コマンドって難しいよねぇ。FreeBSD と Linux では全然違うし、MacOSX Leopard では “/32” とかが使えないので -prefixlen と指定しなければならなかったり。

と、言うことで上記のコマンドは FreeBSD と MacOSX Leopard で動作確認済みです。実行後は ping6 してちゃんと到達で来ているかも確認します;-)。

さてと。route の設定が終わってから初めて ip6addrctl のお話に移れるわけだねぇ。ソースアドレスセレクションについてですが、詳細は以下の URL に詳しいと思います。なので僕は書きましぇん;-)。

http://karl0204.at.webry.info/200804/article_44.html

と、言うことで、グローバル IPv6 を持っている人が、NTT フレッツの IPv6 をブリッジする BB ルータを手に入れたとき、一番気にする必要があるのは route だと言うとこですねぇ;-)。

9月 102008
 

Corega の CG-WLBARGNH を購入したけど返却可能キャンペーンにより Corega に送り返した。そして、いよいよお金が振り込まれたので新しい BB ルータ兼 WifiAP としてかねてからの懸案であった NEC の Aterm WR8500N を購入した。

早速接続して PPPoE してみたが、まぁ、簡単に繋がる。HUB の部分は GiGa ポートなので RJ45 ケーブルに接続した PC から RBB のスピード計測を試してみると 70Mbps 位出るので、まぁ、速いかなぁ。と言う感じ。

でもって、無線 LAN のほうは Draft 802.11n だと言うので MacBook 2GHz の Leopard で試してみたが、今回は Corega の CG-WLBARGNH とは違い、無事に接続できたので、やはり RBB で試してみた。PPPoE は 70Mbps 出ているのでボトルネックは無い状態で試したら 20Mbps ほど出ていた。ふむー。Draft 802.11n の公称よりは遅いけど、無線 LAN で 20Mbps 出れば速いよなぁ。と言う感じで、まぁ許せるかな。

ちなみに 802.11g の NotePC で RBB を試してみたら 10Mbps 位だったので Draft 802.11n はおよそ倍の速度が出ているわけだ。

さて、細かい設定についてですが、僕は自宅にサーバを立てています。WR8500N で PPPoE するのでサーバのサービスに必要なポートは WR8500N からポートフォワードする必要があるのですが、ポートマッピングの設定では 50 個設定ができるので、サーバ上では色々なサービスを公開できる点が嬉しいです。

がっ!! もっと嬉しいことにプロトコルの転送までできる設定があるではないですかっ!!早速、プロトコルパン号 41 番を転送設定するのでありました。

display.jpg

プロトコル番号 41 番とは何か? と言われれば、IPv6 トンネルの転送です。自宅サーバが BB ルータの NAT 内にあった場合、IPv6 トンネルが掘れないのですが、BB ルータにおいて、プロトコル番号 41 番を転送することによって NAT 内のサーバでも IPv6 トンネルが掘れるようになります。

ちなみに dtcp で試したところ、無事にトンネルを掘ることが出来ました。嬉しいですねぇ;-)。

コンシューマ向けでプロトコル転送の機能を持っていることに感動しました。いちじきアライドテレシスの AR410 を買おうかと悩んでいただけに・・。

と、言うことで今回は、前回の Corega の CG-WLBARGNH とは違い、そこはかとなく大満足なのでした;-)。まぁ、値段は安いサイトで比べれば倍近くになるんですけどねぇ・・。

と、言うことで、このネタは次回に続きます。次回は IPv6 ブリッジについてです;-)。

8月 222008
 

Draft IEEE802.11n と HUB 部分の全ポート GiGa インターフェースと言うのにあこがれて BB ルータを新調してみた。

同じようなものに去年の暮れに NEC から Aterm WR8500N が出たのだけど、これがずっと欲しいなぁ。と思っていた。しかし、Corega から CG-WLBARGNH と言うのが出たので、どっちにしようかと悩んでいるうちに、値段に負けて CG-WLBARGNH を買ってしまった。送料込で大体 9,500yen 位。

さて、自宅に届いて早速利用したのだけど、まぁ、サクサク動く。有線 GiGa ポートに接続した PC から RBB のスピード計測 で確認すると 70Mbps 位出るのでまぁ、速いなぁ。とは思った。

無線 LAN のほうは Draft IEEE802.11n 対応なんだけど、NotePC が IEEE802.11g にしか対応していないのでこれで試すと 13Mbps 位。おぉ。無線 LAN で 10Mbps 越えたんだ。とちょっと感激。

んならば MacBook 2GHz の Leopard で接続して確認するべ。と思い試したらなんとっ!! 700kbps しか出ない。これはひどいなぁ・・。まぁ、僕は MacBook にディスプレーとキーボードをつけて、本体はふたを閉じてまな板立てに立てて使っているのでアンテナが本体と干渉してこれくらいしか出ないのだろう。と安易な気持ちでいた。

なんせ、MacBook には GiGa ポートが付いているので、デスクトップ機のように使っている現状では無線 LAN を使う必要が無いので;-)。

さて、僕の家にはサーバがあるのだけど、BB ルータからポートフォワードしてサーバに転送するのだが、CG-WLBARGNH は 10 個しか転送できない。ダメダこらー・・。

更に悪いことにサーバは GiGa NIC を持っている、FreeBSD で言う所の if_re で BB ルータに接続しているのだけど、これが定期的に link Down/Up を繰り返すようになってしまった・・。せっかく GiGa ポート搭載の BB ルータを購入したのに頻繁に Down/Up が発生したら全然ダメじゃん・・。

以前利用していた BB ルータはそんなことは無かったので、相性問題かもしれないけど、 CG-WLBARGNH が悪さしているのかもしれない。GiGa ポートへの省電力機能って何よ?オン/オフはメニューで設定できないのかしら?

この辺りで、「ムムムちょっと動作おかしいぞ。」と思えてきたので、再度 MacBook を引っ張り出してきて、今度はちゃんとフタを明けて、キーボードもディスプレーも外して、由緒正しい NotePC の形で Draft IEEE802.11n を試してみた。

が・・。接続できない・・。Leopard は「タイムアウトしました。」と表示され、BB ルータ側のログも「認証 OK よん。」と表示されている。認証は wep で MAC アドレスフィルターをしているのだけど、 MAC アドレスフィルターを無効にして接続しようとしても Leopard は一向に接続できない。

しかし、他の NotePC や iPod Touch は IEEE802.11g で何の問題も無く接続できている・・。

あぁ・・。もうイヤになった・・。やっぱ NEC のにしておけば良かった・・。などと思い始める。でもって買ってきた CG-WLBARGNH の箱を見るとなにやらキャンペーンをやっている。

http://corega.jp/cp/005/

「つながらなかったらコレガが直接 “返金・返品” 受け付けます。」ってのをやっているではないかっ!! これはラッキー。と言うことで、早急に送り返したのでした。現在はコレガからの返事待ちです。

さて、ここでもう一度再確認してみましょう。

・今まで BB ルータに(100Mbpsだけど)接続していたサーバを CG-WLBARGNH に接続するようにしたら Link の Up/Down が頻発するようになり、サーバの運用に支障が出てきた。なお、Down タイムは 2,3 秒だが、NIC の復旧時間はもっとかかるため、実質一分程度 LinkDown 状態となる。

・ IEEE802.11g 対応の NotePC や iPod Touch は無線 LAN に接続でき、10Mbps 程度の速度が出るが、Draft IEEE802.11n の MacBook 2G は速度が出ない、もしくは全く接続できない状態しか体験できなかったので、CG-WLBARGNH の仕様にうたわれている Draft IEEE802.11n の恩恵がまるで受けられない。

以上の理由により、今回のキャンペーンに申し込んだのですが、この判断は妥当?

#Corega 買う時点で間違っているよ。って解答は却下;-)。本当は Cisco Catalyst 3560-E 辺りが欲しいんだから。自宅にはオーバースペックなんだけどねぇ;-P。

8月 032008
 

iPod Touch で Cisco VPN やって、それだけで満足しているのもまた変な話でして。FreeBSD でもきっちりと Cisco VPN を使えるようにしましょう。

まぁ、iPod Touch で Cisco VPN の所でも書いたのだけど、Cisco ルータ側をいじる権限は僕には無いので何を利用しているのか全然解らないのです。ただ、単にアカウント情報をもらっただけ。

Windows 用のクライアントはあるみたいですが、今回は FreeBSD でやります。

それらしい ports は無いかしら?とか調べていたら /usr/ports/security/vpnc と言うのがありました。早速 make してインストールして起動してみましょう。あぁ。インストールのオプションはフルオプションつけたほうが良いかもしれません。認証のためのオプションだと思うのですけどねぇ。

/usr/local/etc/vpnc.conf に設定ファイルがあるのでこちらにアカウント情報を記述します。設定内容は書きませんが;-)。設定寺の問題点と言うか、難儀した所。 IKE Authmode hybrid と言う設定があると Cisco 側と無事に接続できないみたいです。なので、この行をコメントアウトしました。Cisco ルータとの認証にまつわる設定だと思うのだけどねぇ。この行があるとうまく接続できませんでした。

そして、VPNなんてのはずっと接続しておく必要は無いので、必要な時のみデーモンを起動するだけで十分でしょ。となるので、/usr/local/etc/rc.d/vpnc onestart とかして起動します。なんか、簡単に Cisco に接続してアドレスが降って来てしまいました(^^;;。

VPN が成功すると tun0 インターフェースが生えて来ます。ここに網内の IPv4 アドレスが付加されました。それにしても DNS が降ってこないのでやはり /etc/hosts に必要なホスト名は記述する必要はありますが、まぁ、いとも簡単に利用できてめでたしめでたし。と言う感じでしょうか;-)。

あー。一点。 /usr/local/etc/rc.d/vpnc onestop とかして vpncd を停止させるんだけど、tun0 が削除されないです。この後、もう一回 vpncd を起動すると tun1 を利用するようになってしまいます。なので、デーモンを停止した後は ifconfig tun0 destroy して、インターフェースを削除したほうが良いですねぇ。