networkの最近のブログ記事

http://vps.sakura.ad.jp/
さくらのVPS|VPS(仮想専用サーバ)はさくらインターネット

直前までさくらのレンタルサーバを検討つか実際申し込みしてお試し期間中だったんだけど、その間に9/1からこいつが始まっちゃったんで即決してみました。で既にお引っ越し完了。このブログももちろん動かしてますよ。

sshとMovableTypeの設定、あとpostfixにしてメール受信の設定を最小限済ませてあとは割と放置気味ですが、問題なく使えてます。あとtracも入れなきゃ。何かあれば詳報は以降随時ということで。

http://internet.watch.impress.co.jp/docs/news/20100824_389017.html
ヤマハ、ネットボランチ「RT58i」の後継となる「NVR500」10月下旬発売 -INTERNET Watch

RT58i級とRTX1200級の間を埋めるクラスが欲しいんだよなあ...。SRT100も悪くないんだけど、うーん...。VPN機能がPPTPだけとか、ねえ。

で。BS-G2016MRのファン音の騒音ぶりにさすがに耐えきれず、一時はヤフオクあたりで放出することも考えた。けどその前に試してみたっていいんじゃないかと思って一念発起、ふた開けてみた。注意深くネジを外す。

※なお本記事について、当方の個体以外においても内容を保証するものではありません。メーカー保証等も受けられなくなりますので、万一この記事を読んで試すなどされた方が居られましても、各自の環境にて生じた差異や損害などには責任を負いかねます。くれぐれもご了承の上ご覧くださいますようお願いします。(_ _)

IMG_0389.jpg

ちょっと分かりにくいけど、奥側が機器前方。で、手前側中央に黒く四角いのが見えていて、これがBS-G2016MR唯一のファン。外形は一般的な40mmファンの厚み15mm。当たり前だけどこいつの給電を外してやれば無音になった。さて。外してみると型番が判明。Delta ElectronicsのAFB0412MBという代物らしい。データシートがこちらで読める。

http://www.delta.com.tw/product/cp/dcfans/download/pdf/AFB/AFB40x40x15mm.pdf

ここから性能を確認してみると、だ。

  • 回転数(Speed) = 6000 R.P.M.
  • 最大風量(Maximum Air Flow) = 8.12 CFM
  • 最大静圧(Maximum Air Pressure) = 0.202 IN H2O
  • 騒音(Noise) = 24.5 dB-A

回転数がとにかく高い。6000RPMは高い。おそらく筐体から出ている高周波音はここから来ている。このファン単体で取り出してから回してみてもそんなに大した音ではないんだが、いざ取付けて回すと筐体全体と共鳴を起こしてひどい騒音になっている。しかしその一方で風量の8.12CFMというのはなかなかのもの。4cmファンの同クラスの中で探してみたけど、なかなかこれだけの出力を出すファンは見当たらない。おそらく、高回転・高出力と引き換えにこれだけの音量になってしまっているのだろう。

というわけで、静音タイプのファンに換装するとなると必然的に今のファンより出力上劣らざるを得ない。排熱効率が十分か、見守る必要はありそうだ。そこを何度か自分に問い直しつつ、いざ覚悟を決めたら次に進めだ。

内部を改めて眺めると、結構大型のヒートシンクがメインボード上に取付けられていて、主要チップ自体の冷却は大分手当てされている模様。排熱用のファンを筐体の狭い横側ではなくて、上方向に付けてより大きな6cmとか8cmファンにしておけばそもそも良いんじゃね?とも思ったが、まあそこは仕方なし。

というわけで閉店間際のPCDEPOT盛岡店に飛び込んで見つけてきたのがこれ。

http://www.scythe.co.jp/cooler/mini-kaze-ultra.html
株式会社サイズ | 商品詳細 |MINI-Kaze ULTRA 20mm厚

決め手は3500RPMとかなりの低回転・静音タイプでありつつ風量4.86CFMはだいぶ稼げそうな点。ケース内の設置空間もかなりギリギリではあったものの20mm厚も入れそうだったのでやってみた。この判断は結果から言うと成功。20mm厚でもメインボードとの間に3mmほど隙間が残り、ファンが干渉するおそれもない。

IMG_0394.jpg

ここで一度コネクタを繋いで電源を入れてみたが問題が残った。ファンが回らないのである。原因は2枚目の写真。それぞれケースファン電源用の3ピンコネクタである。上は取り外した元々のファン(AFB0412MB)、下は新しく取付けたファン(MINI-Kaze ULTRA 20mm厚/SY124020L)。ケーブルの色の順番に注意してほしい(ちょっと見えにくいが...)。AFB0412MBは上から「黒、青、赤」となっているのに対し、MINI-Kazeでは「(空き)、赤、黒」になっている。これもデータシートを参照すると下記のような記述を確認できる。

* Lead Wires :
  UL 1007 AWG #24 OR Equivalent
  Red Wire Positive(+)
  Black Wire Negative(-)

あれ、青(Blue)はどこ?

まあひとまず、赤と黒の線はそれぞれ同じくプラスとマイナスで共通していると仮定し、これが全くあべこべの配線になっているので直してみる。AF0412MBの順番に習い、「赤、(空き)、黒」の順にする(青は無視。2ピンなんだし割り切れ>俺)。写真のコネクタには3ピンそれぞれの接点部分に金具部分がヒッカケになっているので、これを細身のドライバや針金などで強く押し込み、ヒッカケがはずれるのをさぐりつつケーブルをゆっくりと引き抜く。一気に強く引こうとすると切れてしまうと思われるので注意。金具を押し込みながら、押し込んだ方向と同じ向きに角度を付けて引くようにすれば割とあっさり抜ける。3枚目の写真に模してみたのでこちらを参照のこと。

IMG_0397.jpg

さてこれでコネクタ刺してフタして起動。おおっ。音がない。不安になるくらいファン音(とその共鳴音)がない(笑)。でも排気ダクトに手を当ててみるとちゃんと空気は出ているぞ。OKだ。すばらしい。

というわけでうちのBS-G2016MRヤフオク行きを何とか逃れました(何)。やったー。

で、早速届いたんですわBS-G2016MR。

http://buffalo.jp/products/catalog/network/bs-g2016mr/
レイヤー2 インテリジェントGigaスイッチ 16ポート | BS-G2016MR

さすが法人向けあって重厚っていうかすげえですな。ファン音が。(爆) うちの5台あるPC全部束にしてもまだこの一台のファン音のほうが大きいです。想定はしててもいざ火を入れて実感すると違うよねーってやつです。

まあ965BEのときと比べればまだまだだし、爆音ってほどじゃないにしても、でも結構ある。逆に言うと、Core i7/i5のマシンすらここまで音立ててないので、随分静音PCとしてうまく作れてたんだなと自分を褒めたくらい。^^;

まあどうせ仕事部屋は独立なんで気にしないでもいいし、設置して数時間して慣れてきつつはあるので、もう少し様子見ながらで行きますわ。

自宅のNAT内ネットワークをBIND使って固定IPとDHCP分とを合わせて一つのドメインでやってるんですけど、/etc/bind配下に置いてあるゾーンファイルをBIND自身が自分で書き換えようとして困る。まあ自然ちゃあ自然なんだけど...書き換え可能なディレクトリは/var/lib/namedとか/var/cache/namedとかに用意してあるんだし、*.jnlはそっちに吐き出してるわけだし、使い分けて欲しいなあとも思う訳で...。

例えばこんな感じでずっと出とるんですわ。

Apr 14 08:26:37 gw named[7331]: dumping master file: /etc/bind/tmp-VyOSuyztFl: open: permission denied
Apr 14 08:30:22 gw dhcpd: Wrote 5 leases to leases file.
Apr 14 08:30:22 gw dhcpd: DHCPREQUEST for 192.168.0.205 from xx:xx:xx:xx:xx:xx via eth0
Apr 14 08:30:22 gw dhcpd: DHCPACK on 192.168.0.205 to xx:xx:xx:xx:xx:xx via eth0
Apr 14 08:31:55 gw named[7331]: dumping master file: /etc/bind/tmp-LZ5RZ76NXe: open: permission denied
Apr 14 08:35:22 gw dhcpd: DHCPREQUEST for 192.168.0.205 from xx:xx:xx:xx:xx:xx via eth0
Apr 14 08:35:22 gw dhcpd: DHCPACK on 192.168.0.205 to xx:xx:xx:xx:xx:xx via eth0
Apr 14 08:40:22 gw named[7331]: dumping master file: /etc/bind/tmp-rKYx3u6RKw: open: permission denied
Apr 14 08:40:22 gw dhcpd: DHCPREQUEST for 192.168.0.205 from xx:xx:xx:xx:xx:x via eth0
Apr 14 08:40:22 gw dhcpd: DHCPACK on 192.168.0.205 to xx:xx:xx:xx:xx:xx via eth0
Apr 14 08:41:20 gw dhcpd: DHCPREQUEST for 192.168.0.202 from yy:yy:yy:yy:yy:yy via eth0
Apr 14 08:41:20 gw dhcpd: DHCPACK on 192.168.0.202 to yy:yy:yy:yy:yy:yy via eth0
Apr 14 08:45:09 gw named[7331]: dumping master file: /etc/bind/tmp-OflOZAy7fk: open: permission denied

debianだとデフォルトで/etc/bindはrootにしかwrite permissionなくて、肝心のnamedはbindユーザになって動作する。

hironobu@nelly:~$ ls -ld /etc/bind
drwxr-sr-x 2 root bind 4096 2010-04-13 01:06 /etc/bind
hironobu@nelly:~$ ps -C named -Fl
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN    RSS PSR STIME TTY          TIME CMD
5 S bind      7331     1  0  80   0 - 59460 rt_sig 52868   3 Apr13 ?        00:03:15 /usr/sbin/named -u bind

いくつかぐぐって記事を見てみると「何だよこれならおまえ/etc/bindでchmod g+wすりゃ済むじゃん馬鹿じゃねえのHAHAHA」的な陽気なアメリカンスタイルがこだましている。うーん。それはそれで分かるんだけどさあ的な。でやってみると確かにゾーンファイルが変わってて、DHCP分の最初書いてなかったdyndns分の登録まで入ってる。うわー。

まあ、ゾーンファイルがオリジナルになるんだからdynamic dnsして登録されたホストもゾーンファイルに載らなきゃ困るって話はあるかもしれない。write permissionなしでどないしてゾーンファイル管理しろってんだとBINDからすれば思うかも知れない。しかし/etc/配下を勝手に書き換えられるのも気持ち悪いんだよねえ...。どないしたもんか。

引き続きその2。分けたことに余り意味はない。っていうかあまりにいろいろ貼ってたら長くなって来たので途中で一息つきたかっただけですにょ。おほほ。

wide-dhcpv6c(wide-dhcpv6-client)とradvdについては、前出の"Memo - OCN IPv6"と変わる所はありません。そのまま持って来て通ります。

http://www.ln-lab.net/lunar-night.lab/page2-memo_ocnipv6/design-white/lang-ja
Memo - OCNIPv6

# /etc/wide-dhcpv6/dhcp6c.conf
interface ppp2 {
        send ia-pd 0;
};

id-assoc pd 0{
        prefix-interface eth0 {
                sla-id 1;
                sla-len 0;
        };
};
# /etc/radvd.conf
interface eth0
{
        AdvSendAdvert on;
        MinRtrAdvInterval 30;
        MaxRtrAdvInterval 100;
        prefix 2001:380:aaaa:bbbb::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
        };

};

wide-dhcpv6-clientを起動して、まず指定のインタフェイスにOCNから指定されたprefixでv6アドレスが付くことを確認しましょう。prefixが"2001:380:aaaa:bbbb"だとしたらこのようになっているはずです。

hironobu@nelly:~$ /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx  
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: 2001:380:aaaa:bbbb:xxxx:xxxx:xxxx:xxxx/64 Scope:Global
          inet6 addr: fe80::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:20969 errors:0 dropped:0 overruns:0 frame:0
          TX packets:22630 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3654118 (3.4 MiB)  TX bytes:15726726 (14.9 MiB)
          Interrupt:252 Base address:0xe000 

さらにradvdを起動して、RA(Router Advertisement)が同セグメントの他のPCに配信され、inet6アドレスが付くのを確認します。

hironobu@shirley:~$ /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr zz:zz:zz:zz:zz:zz 
          inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: 2001:380:aaaa:bbbb:zzzz:zzzz:zzzz:zzzz/64 Scope:Global
          inet6 addr: fe80::zzzz:zzzz:zzzz:zzzz/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:98633 errors:0 dropped:0 overruns:0 frame:0
          TX packets:60699 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:87034901 (83.0 MiB)  TX bytes:6714585 (6.4 MiB)
          Interrupt:16 Base address:0x2400 

ちなみにnellyがルータで、shirleyは同セグメント上のサーバです。ここまで確認してOKであれば、ipv6用のルーティングを登録します。

# ip -f inet6 route add default dev ppp2
$ ip -f inet6 route
2001:380:aaaa:bbbb::/64 dev eth0  metric 256  mtu 1500 advmss 1440 hoplimit 4294967295
fe80::/64 dev eth1  metric 256  mtu 1500 advmss 1440 hoplimit 4294967295
fe80::/64 dev eth0  metric 256  mtu 1500 advmss 1440 hoplimit 4294967295
fe80::/64 dev ppp2  metric 256  mtu 1390 advmss 1330 hoplimit 4294967295
fe80::/10 dev ppp2  metric 1  mtu 1390 advmss 1330 hoplimit 4294967295
fe80::/10 dev ppp2  metric 256  mtu 1390 advmss 1330 hoplimit 4294967295
default dev ppp2  metric 1024  mtu 1390 advmss 1330 hoplimit 4294967295

こうすることでipv6パケットがppp2インタフェイスを通じて外に出て行くようになります。早速ping6してみましょう。

hironobu@shirley:~$ ping6 www.ocnipv6.jp
PING www.ocnipv6.jp(www.ocnipv6.jp) 56 data bytes
64 bytes from www.ocnipv6.jp: icmp_seq=1 ttl=54 time=17.0 ms
64 bytes from www.ocnipv6.jp: icmp_seq=2 ttl=54 time=17.7 ms
64 bytes from www.ocnipv6.jp: icmp_seq=3 ttl=54 time=16.3 ms
64 bytes from www.ocnipv6.jp: icmp_seq=4 ttl=54 time=16.8 ms
64 bytes from www.ocnipv6.jp: icmp_seq=5 ttl=54 time=17.5 ms
hironobu@shirley:~$ traceroute6 www.ocnipv6.jp
traceroute to www.ocnipv6.jp (2001:218:2001:3005::7f), 30 hops max, 40 byte packets
 1  2001:380:aaaa:bbbb:xxxx:xxxx:xxxx:xxxx (2001:380:aaaa:bbbb:xxxx:xxxx:xxxx:xxxx)  0.168 ms  0.162 ms  0.184 ms
 2  2001:380:8140::a (2001:380:8140::a)  16.904 ms  16.969 ms  17.010 ms
 3  2001:380:8140:9::1 (2001:380:8140:9::1)  17.050 ms  17.186 ms  17.353 ms
 4  2001:380:8130:3::1 (2001:380:8130:3::1)  17.067 ms  17.177 ms  17.385 ms
 5  2001:380:8130:12::4 (2001:380:8130:12::4)  17.594 ms  17.430 ms  17.617 ms
 6  2001:380:8230:f::2 (2001:380:8230:f::2)  17.348 ms  16.086 ms  16.258 ms
 7  ae-0-1.a20.tokyjp01.jp.ra.gin.ntt.net (2001:218:2000:5000::49)  16.339 ms  14.535 ms  14.307 ms
 8  ae-7.r20.tokyjp01.jp.bb.gin.ntt.net (2001:218:0:6000::185)  13.996 ms  14.411 ms  14.337 ms
 9  2001:218:0:6000::52 (2001:218:0:6000::52)  17.269 ms  17.430 ms  17.303 ms
10   (2001:218:2001:17::2)  17.715 ms  17.330 ms  17.749 ms
11  www.ocnipv6.jp (2001:218:2001:3005::7f)  17.763 ms  18.246 ms  17.849 ms

接続できましたにょ。

さて残る問題は、前回のxl2tpdも含めて、「OS起動時にどうするか」です。上に述べたようにxl2tpdに名前付きパイプへのechoを使ってxl2tpdへの操作を行いますが、これを/etc/init.d/*でやりたいですよね。Linuxルータを再起動したら何もせずとも自動的にipv6リンクも立ち上がっているようになるのが理想的です。

hironobu@nelly:~$ ls -l /etc/rc*/*xl2tpd
lrwxrwxrwx 1 root root 16 2010-04-10 01:02 /etc/rc0.d/K20xl2tpd -> ../init.d/xl2tpd
lrwxrwxrwx 1 root root 16 2010-04-10 01:02 /etc/rc1.d/K20xl2tpd -> ../init.d/xl2tpd
lrwxrwxrwx 1 root root 16 2010-04-10 01:02 /etc/rc2.d/S20xl2tpd -> ../init.d/xl2tpd
lrwxrwxrwx 1 root root 16 2010-04-10 01:02 /etc/rc3.d/S20xl2tpd -> ../init.d/xl2tpd
lrwxrwxrwx 1 root root 16 2010-04-10 01:02 /etc/rc4.d/S20xl2tpd -> ../init.d/xl2tpd
lrwxrwxrwx 1 root root 16 2010-04-10 01:02 /etc/rc5.d/S20xl2tpd -> ../init.d/xl2tpd
lrwxrwxrwx 1 root root 16 2010-04-10 01:02 /etc/rc6.d/K20xl2tpd -> ../init.d/xl2tpd

このxl2tpdが起動されたあとに、できるだけすぐにecho "c ocnipv6" > /var/run/xl2tpd/l2tp-controlを送りたい訳です。私が採った手は、このxl2tpdのすぐ後に起動するinitスクリプトを登録してやることです。下のようなスクリプトを作成し、まず/etc/init.d/ipv6として配置します。

#!/bin/sh

### BEGIN INIT INFO
# Provides:          ipv6
# Required-Start:    $remote_fs $network $syslog
# Required-Stop:     $remote_fs $network $syslog
# Should-Start:      $local_fs slapd
# Should-Stop:       $local_fs slapd
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: IPv6 service
# Description:       (empty)
### END INIT INFO

. /lib/lsb/init-functions

NAME="ocnipv6"
L2TPC="/var/run/xl2tpd/l2tp-control"
CMAX=10

do_start() {
  C=0;
  while [ ! -p $L2TPC ] && [ $C -lt $CMAX ]; do
    sleep 1;
    log_progress_msg '.';
    let C=C+1;
  done
  if [ $C -lt $CMAX ]; then
    echo "c $NAME" > $L2TPC
    return 0
  else
    return 1
  fi
}

do_end() {
  echo "d $NAME" > $L2TPC
  return 0
}

case "$1" in
  start)
    log_daemon_msg "Starting ipv6"
    if do_start; then
      log_end_msg 0
    else
      log_end_msg 1
      exit 1
    fi
    ;;
  stop)
    log_daemon_msg "Stopping ipv6"
    do_end
    log_end_msg 0
    ;;
  restart)
    log_daemon_msg "Restarting ipv6"
    do_end
    sleep 3
    if do_start; then
      log_end_msg 0
    else
      log_end_msg 1
      exit 1
    fi
    ;;
esac

exit 0

次に、update-rc.dを使って登録しますが、ランレベル2-5ではS21、同0-1,6ではK19になるようにします。つまり、起動時(2-5)ではxl2tpdの直後、終了時(0-1,6)ではxl2tpdの直前に、上のスクリプトを呼ぶ訳です。こうしないと、xl2tpdが起動しないうちに/var/run/xl2tpd/l2tp-controlをさわろうとするものの、当然起動前ならこのパイプは存在しないので、失敗することになるためです。

# update-rc.d ipv6 start 21 2 3 4 5 . stop 19 0 1 6 .
hironobu@nelly:~$ ls -l /etc/rc*/*ipv6
lrwxrwxrwx 1 root root 14 2010-04-10 01:26 /etc/rc0.d/K19ipv6 -> ../init.d/ipv6
lrwxrwxrwx 1 root root 14 2010-04-10 01:26 /etc/rc1.d/K19ipv6 -> ../init.d/ipv6
lrwxrwxrwx 1 root root 14 2010-04-10 01:26 /etc/rc2.d/S21ipv6 -> ../init.d/ipv6
lrwxrwxrwx 1 root root 14 2010-04-10 01:26 /etc/rc3.d/S21ipv6 -> ../init.d/ipv6
lrwxrwxrwx 1 root root 14 2010-04-10 01:26 /etc/rc4.d/S21ipv6 -> ../init.d/ipv6
lrwxrwxrwx 1 root root 14 2010-04-10 01:26 /etc/rc5.d/S21ipv6 -> ../init.d/ipv6
lrwxrwxrwx 1 root root 14 2010-04-10 01:26 /etc/rc6.d/K19ipv6 -> ../init.d/ipv6

さらに、スクリプト内でもパイプの生成を待つようにしています。上の例では10回=10秒間待ちますが、CMAXをいじれば調整可能です。

あとはルーティングですが、これはpppdを利用します。ipv6でのリンクが確立すると、pppdは/etc/ppp/ipv6-upおよび/etc/ppp/ipv6-up.d/*のスクリプトを起動しようとします。これを利用して、/etc/ppp/ipv6-up.d/routeスクリプトを下のように設置します。

#!/bin/sh

if [ "x$PPP_IFACE" = "xppp2" ]; then
  ip -f inet6 route add default dev $PPP_IFACE

  /etc/init.d/wide-dhcpv6-client restart
fi

また、/etc/ppp/ipv6-down.dディレクトリにも同じようにrouteスクリプトを置きます。

#!/bin/sh

if [ "x$PPP_IFACE" = "xppp2" ]; then
  ip -f inet6 route del default dev $PPP_IFACE
fi

wide-dhcpv6-clientにrestartを掛けている点に注意してください。ipv6スクリプトによってppp2がlink upを開始しますが、その完了を待たずにwide-dhcpv6-clientが起動されてしまうのです。ppp2のリンクが完了したタイミングでもう一度wide-dhcpv6-client

lrwxrwxrwx 1 root root  15 2010-04-07 05:17 S20rsync -> ../init.d/rsync
lrwxrwxrwx 1 root root  16 2010-04-11 00:02 S20xl2tpd -> ../init.d/xl2tpd
lrwxrwxrwx 1 root root  14 2010-04-10 01:26 S21ipv6 -> ../init.d/ipv6
lrwxrwxrwx 1 root root  28 2010-04-05 23:20 S40wide-dhcpv6-client -> ../init.d/wide-dhcpv6-client

これによって、起動後自動的にipv6リンクの確立とルーティングが行われるようになります。

で、前回作ったLinuxルータにOCN IPv6の設定を入れてみた。大まかにはこちらの内容を参考にしてなんだけど、debian(lenny)なので微妙に違えています。

http://www.ln-lab.net/lunar-night.lab/page2-memo_ocnipv6/design-white/lang-ja
Memo - OCNIPv6

xl2tpdの設定

まずxl2tpdを動かします。lennyのパッケージそのままだと1.2.0なんだけど、これだとうまくL2TP接続を確立してくれませんでした。というわけでソースパッケージをそのまま持ってきます。

http://www.xelerance.com/software/xl2tpd/
Xelerance - Xelerance: Software: xL2TPD

こちらからどうぞ。一緒にdebビルド用のスクリプトがdebian/ディレクトリ配下に有るのでこれを使う。

$ wget http://www.xelerance.com/software/xl2tpd/xl2tpd-1.2.4.tar.gz
$ tar zxvf xl2tpd-1.2.4.tar.gz
$ cd xl2tpd-1.2.4
$ chmod +x ./debian/rules
$ env PREFIX=/usr dpkg-buildpackage -rfakeroot

ここで環境変数としてPREFIX=/usrにしてdpkg-buildpackage渡す必要があります。そうしないと出来上がったdebパッケージをインストールしたときに/usr/local/sbin/xl2tpdのパスで入れられちゃうんですけども、一緒にインストールされるinitスクリプトが/usr/sbin/xl2tpdにあることを想定して動くので、かなしいことに(´・ω・`)なります。

で、出来上がりがこうなるので、

hironobu@nelly:~/xl2tpd-1.2.4$ ls -l ..
合計 1148
-rw-r--r-- 1 hironobu hironobu    700 2010-04-10 00:46 l2tpd_1.1.11.dfsg.1-2_all.deb
drwxr-xr-x 9 hironobu hironobu   4096 2010-04-10 00:46 xl2tpd-1.2.4
-rw-r--r-- 1 hironobu hironobu 541039 2009-03-09 08:27 xl2tpd-1.2.4.tar.gz
-rw-r--r-- 1 hironobu hironobu    500 2010-04-10 00:46 xl2tpd_1.1.11.dfsg.1-2.dsc
-rw-r--r-- 1 hironobu hironobu 541003 2010-04-10 00:46 xl2tpd_1.1.11.dfsg.1-2.tar.gz
-rw-r--r-- 1 hironobu hironobu   1603 2010-04-10 00:46 xl2tpd_1.1.11.dfsg.1-2_amd64.changes
-rw-r--r-- 1 hironobu hironobu  68346 2010-04-10 00:46 xl2tpd_1.1.11.dfsg.1-2_amd64.deb

xl2tpd_1.1.11.dfsg.1-2_amd64.debをインストールすればよいでござる。バージョンが"1.1.11"になってるのは同debianディレクトリ配下のどこか設定ファイルか何かがあるはずのをいじればいいじゃないかな。(適当)

$ sudo dpkg -i xl2tpd_1.1.11.dfsg.1-2_amd64.deb

インストールは完了。で、設定。

; /etc/xl2tpd/xl2tpd.conf
[lac ocnipv6]
lns = foobar.ocn.ne.jp
hostname = aaa@bbb
ppp debug = yes
pppoptfile = /etc/ppp/peers/ocnipv6
length bit = yes
require chap = yes
refuse pap = yes
require authentication = yes
redial = yes
redial timeout = 10
max redials = 6
# /etc/ppp/peers/ocnipv6
nodefaultroute
noip
+ipv6
usepeerdns
user aaa@bbb
mtu 1390
noipdefault
default-asyncmap
nopcomp
noaccomp
noccp
novj
nobsdcomp
nodeflate
lcp-echo-interval 30
lcp-echo-failure  2
lock
noauth

1つ目はxl2tpd.conf。lnsにはOCNから指定された接続サーバ名を、hostnameにはOCNにPPPoE接続を設定した際のユーザIDをそれぞれ設定する。あとは上に挙げたページからそのまま持って来ています。

2つ目はそのxl2tpd.conf中のpppoptfileオプションを通じて指定される、L2TP上でのppp接続で使われるpppd設定ファイルです。こいつも同じくOCNでのユーザIDを持って来ています。

さらに/etc/xl2tpd/l2tp-secretsにOCNのユーザIDとパスワードを書きます。書式は/etc/ppp/{chap-secrets,pap-secrets}と同じ。

"aaa@bbb" * "ccc"

ここで一度xl2tpdを再起動しておきます。

Apr 11 00:23:41 gw xl2tpd[2606]: setsockopt recvref[22]: Protocol not available
Apr 11 00:23:41 gw xl2tpd[2606]: This binary does not support kernel L2TP.
Apr 11 00:23:41 gw xl2tpd[2607]: xl2tpd version xl2tpd-1.2.4 started on nelly PID:2607
Apr 11 00:23:41 gw xl2tpd[2607]: Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.
Apr 11 00:23:41 gw xl2tpd[2607]: Forked by Scott Balmos and David Stipp, (C) 2001
Apr 11 00:23:41 gw xl2tpd[2607]: Inherited by Jeff McAdams, (C) 2002
Apr 11 00:23:41 gw xl2tpd[2607]: Forked again by Xelerance (www.xelerance.com) (C) 2006
Apr 11 00:23:41 gw xl2tpd[2607]: Listening on IP address 0.0.0.0, port 1701

こんな感じに出ますのでね。続いてxl2tpdを操作してL2TP接続を開始させます。

# echo "c ocnipv6" > /var/run/xl2tpd/l2tp-control

でこんなログが出るはず。

Apr 11 00:23:41 gw xl2tpd[2607]: Connecting to host foobar.ocn.ne.jp, port 1701
Apr 11 00:23:41 gw xl2tpd[2607]: Connection established to x.x.x.x, 1701.  Local: 36525, Remote: 60956 (ref=0/0).
Apr 11 00:23:41 gw xl2tpd[2607]: Calling on tunnel 36525
Apr 11 00:23:41 gw xl2tpd[2607]: Call established with x.x.x.x, Local: 26379, Remote: 27351, Serial: 1 (ref=0/0)
Apr 11 00:23:41 gw xl2tpd[2607]: start_pppd: I'm running: 
Apr 11 00:23:41 gw xl2tpd[2607]: "/usr/sbin/pppd" 
...
Apr 11 00:23:41 gw pppd[2617]: pppd 2.4.4 started by root, uid 0
...
Apr 11 00:23:41 gw pppd[2617]: CHAP authentication succeeded
Apr 11 00:23:41 gw pppd[2617]: CHAP authentication succeeded
Apr 11 00:23:41 gw pppd[2617]: sent [IPV6CP ConfReq id=0x1 ]
Apr 11 00:23:41 gw pppd[2617]: rcvd [IPV6CP ConfReq id=0x1 ]
Apr 11 00:23:41 gw pppd[2617]: sent [IPV6CP ConfAck id=0x1 ]
Apr 11 00:23:41 gw pppd[2617]: rcvd [IPV6CP ConfAck id=0x1 ]
Apr 11 00:23:41 gw pppd[2617]: local  LL address fe80::xxxx:xxxx:xxxx:xxxx
Apr 11 00:23:41 gw pppd[2617]: remote LL address fe80::yyyy:yyyy:yyyy:yyyy
Apr 11 00:23:41 gw pppd[2617]: Script /etc/ppp/ipv6-up started (pid 2648)

で最終的に接続が完了すれば、ifconfigで下のようなpppxインタフェイスが出現します。

ppp2      Link encap:Point-to-Point Protocol  
          inet6 addr: fe80::xxxx:xxxx:xxxx:xxxx/10 Scope:Link
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1390  Metric:1
          RX packets:481 errors:0 dropped:0 overruns:0 frame:0
          TX packets:297 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:163773 (159.9 KiB)  TX bytes:32095 (31.3 KiB)

ここまでで結構長くなったので一旦終わり。次はwide-dhcpv6cの設定に行きます。

さて。どんな設定したかって話なんですが、びっくりするくらいあっさりしてた。いい世の中になったものですな。

sysctl: ip_forward

/etc/sysctl.confに以下の設定を有効化。IPv6まわりの設定はまだこれからですけど、一応含めました。

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_ra = 0

iptables(firewall+NAT)

一番戸惑ったのはiptablesをどこで設定するのかというところ。前に見た時は/etc/init.d/iptablesとか何とかあったと思ったんですが、lenny以降は無くなったみたいですね。というわけでこちらに倣って/etc/network/if-pre-up.d/iptablesにスクリプトを置いてみました。えいやで作ったので甘いかもしんないですがとりあえずINPUTとFORWARDはDROPにしとかなきゃだぜぜぜ。

#!/bin/sh

IPTABLES='/sbin/iptables'

LOCAL_IF=eth0
LOCALNET='x.x.x.x/yy'

##########
# initialize

$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z

$IPTABLES -t nat -F POSTROUTING

$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT

##########

$IPTABLES -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
$IPTABLES -A INPUT -j ACCEPT -i lo
$IPTABLES -A INPUT -j ACCEPT -s $LOCALNET
$IPTABLES -A INPUT -j ACCEPT -p tcp --dport 1723
$IPTABLES -A INPUT -j ACCEPT -p 47

$IPTABLES -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED

##########

$IPTABLES -N outer_local

##########

$IPTABLES -N local_outer
$IPTABLES -A local_outer -j ACCEPT -s $LOCALNET

##########
# nat

$IPTABLES -t nat -A POSTROUTING -j MASQUERADE -s $LOCALNET -o ! $LOCAL_IF

##########
# main table

$IPTABLES -A FORWARD -j outer_local -i ! $LOCAL_IF -o $LOCAL_IF
$IPTABLES -A FORWARD -j local_outer -i $LOCAL_IF

$IPTABLES -A INPUT   -j outer_local -i ! $LOCAL_IF

PPPoE周り

pppoeconfっていうパッケージがあるみたいで、これを使ったら本当にあっけなく設定できたんですけど、Bフレッツのマルチセッションを使ってたので結局自分でファイルをいじるしかなかったみたいです。

というわけで、BフレッツONUをeth1側に繋げたことを確認しつつ、まずはデフォルトセッション側に"defaultroute"を付けて。(/etc/ppp/peers/session1)

noipdefault
defaultroute
hide-password
lcp-echo-interval 20
lcp-echo-failure 3
connect /bin/true
noauth
persist
mtu 1492
noaccomp
default-asyncmap
plugin rp-pppoe.so eth1
user "aaa@bbb"
usepeerdns

デフォルトじゃない側では"nodefaultroute"として"usepeerdns"を付けずに、また"noproxyarp"も指定。(/etc/ppp/peers/session2)

noipdefault
nodefaultroute
noproxyarp
hide-password
lcp-echo-interval 20
lcp-echo-failure 3
connect /bin/true
noauth
persist
mtu 1492
noaccomp
default-asyncmap
plugin rp-pppoe.so eth1
user "xxx@yyy"

さらに/etc/ppp/chap-secretsおよび/etc/ppp/pap-secretsに次のようにパスワードを設定。どっちも同じ書式でいいのね。

"aaa@bbb" * "ccc"
"xxx@yyy" * "zzz"

あとはこれを自動接続にするように、/etc/network/interfacesに追記。

allow-hotplug eth1
iface eth1 inet static

auto ppp0
iface ppp0 inet ppp
  pre-up /sbin/ifconfig eth1 up
  provider session1

auto ppp1
iface ppp1 inet ppp
  pre-up /sbin/ifconfig eth1 up
  provider session2

で、マルチセッションというからには、destinationによって振り分けてroutingをちゃんと指定しておきたいよね、と。最初/etc/network/interfacesのppp1にup/down行を追加してみたんですが、うまくいかなかったです。代わりに/etc/ppp/ip-up.d/routeというスクリプトを置いてchmod +xしました。

#!/bin/sh

if [ "x$PPP_IFACE" = "xppp1" ]; then
  ip route add a.a.a.a dev $PPP_IFACE
  ip route add b.b.b.b dev $PPP_IFACE
fi

他には...

BINDとかIPv6の設定分とかは次回に続く。

MacOSX上でネットワークを扱うプログラムを書く場合、やり方はいくつかある。

  • ソケット
  • NSStream
  • NSURLConnection
  • 分散オブジェクト環境

あと、CarbonベースでもよC言語向けのが欲しければCFNetwork、あとBSDソケットとほぼ同等だけどCFSocketという手もある。まだ他にもあるかななな。

http://www.geekpage.jp/programming/macosX-network/
Geekなぺーじ : Mac OS Xネットワークプログラミング

まあ、NSURLConnectionなんかはURLベースなので「ネットワーク」というには大分限定的・局所的だし、分散オブジェクト環境に至ってはCocoaアプリケーション同士でないとほとんど使いこなせない。汎用性ではソケットに勝るものは無いでしょう。ただ、状況に応じていろんな選択肢があること、これを常に心に留めておくことはとっても重要。

あと、Cocoaではソケット・ファイルディスクリプタをwrapすることのできるNSFileHandleもあるので、ぜひこれらをフル活用していきたい。通知(NSNotification)やデリゲートの仕組みを元に、メインループからの非同期的読み込みの機構も実装されているので、これを使った方がCocoa GUIアプリケーションとしてより自然な挙動を実現することができる。

確かにソケットでよく使うFIONBIOやselect()/poll()などはそのまま適用可能だけど、UNIX系由来のコードを出来るだけそのまま動かすといった明確な意図に基づいて扱う場合以外は、それが有効に効力を発揮する局面はあんまり無いように思う。(≒GUIを持たない、純粋にC言語でmain()からがりがり書くようなケースも含む。ただそれでも、結果的にCocoa/Carbonに乗っておいた方が楽になれることも結構ある)

まあ、NSStreamとNSFileHandleさえあればわりとごはん3杯くらいいけます。はい。

http://developer.apple.com/documentation/Cocoa/Conceptual/Streams/Streams.html
Stream Programming Guide for Cocoa: Introduction to Stream Programming Guide for Cocoa

http://developer.apple.com/documentation/Cocoa/Conceptual/LowLevelFileMgmt/LowLevelFileMgmt.html
Low-Level File Management Programming Topics: Introduction to Low-Level File Management Programming Topics

RT58iがこわれたよ

| コメント(0) | トラックバック(0)

Yamaha ブロードバンドVoIPルータ RT58i
Yamaha ブロードバンドVoIPルータ RT58i
ヤマハ 2006-09-30
売り上げランキング : 1035

おすすめ平均 star
star値段の割に高機能
starRT57iより機能がいっぱいで速い.

Amazonで詳しく見る
by G-Tools

うちはもうだいぶ長いことRTシリーズ指名買いなんだが、今回ばかりは参ったなあ。

先週の出張中に家のネットワーク環境が使えなくなったんだけど、ここ2,3ヶ月ほど同じ症状を繰り返していたのでだいたい原因の察しはついていた。その症状というのは、RT58iにつなげて使っていた8ポートHUBとの間でシグナルの激しい明滅を繰り返していて、何度か電源を入れ直すと直るという程度だったので、まあHUBかRTのどちらかがとちくるってしもうたのだろうと。

しかも外からはVPN(PPTP)でつなげていたのだがこれは普通に使えるし、そこでLAN側インタフェイスを無効化して再度有効化してみると、何となく復活したりする。うーん。帰りしなにHUB買ってって交換してみるかあ、とやってみたら...。全然かわんないでやんの。

(´・ω・`)

どうやら、1番から4番まであるRTのLAN側ポートの4番に刺してたHUB越しで試してたのがダメで、ポート1もダメ。2につないだら今度は復活。ってなわけで壊れてたのはRTの方、しかもポート1と4だったのねん。

土日を何とか生きてるポート2,3でしのぎ、その間に代替機を発注、と。

ヤマハ ファイアウォールルーター SRT100 SRT100
ヤマハ ファイアウォールルーター SRT100 SRT100
ヤマハ
売り上げランキング : 16533


Amazonで詳しく見る
by G-Tools

とりあえずBフレッツ接続のための最小限の設定を導入して移行。詳しくは追って。