networkの最近のブログ記事

2010年9月 7日

さくらのVPSに移転してみるなど

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

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

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

2010年8月25日

RTに久々の新型ですって。

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

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

2010年5月31日

BS-G2016MRの静音化手術に成功しましたよ

で。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ヤフオク行きを何とか逃れました(何)。やったー。

2010年5月19日

さすが法人向けは伊達じゃない(何

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

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

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

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

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

2010年4月14日

BINDでdynamic dnsやってると勝手にゾーンファイル本体を書き換えようとしてくれやがる件

自宅の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/配下を勝手に書き換えられるのも気持ち悪いんだよねえ...。どないしたもんか。

2010年4月11日

LinuxルータでOCN IPv6設定をやったよ 〜その2 wide-dhcpv6-clientとradvdとその他の巻〜

引き続きその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リンクの確立とルーティングが行われるようになります。

2010年4月10日

LinuxルータでOCN IPv6設定をやったよ 〜その1 xl2tpdの巻〜

で、前回作った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の設定に行きます。

2010年4月 7日

routerをSRT100からLinux PCサーバに入れ替えたよ その2

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

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の設定分とかは次回に続く。

2010年4月 6日

routerをSRT100からLinux PCサーバに入れ替えたよ

一通り設定が終わったのでリプレース、多少てこずったというかひさびさのケーブリングで戸惑ったりしたけど何とか無事に完了。distroはdebian(lenny)で、スペックはAtom 330(Intel D945GCLF2)にメモリ2GBのSSD 40GB(これもIntel)。NICも2枚差し(正確には内1個オンボード)なんて何年振りだろ。多少まごついたけどおさだまりのip_forwardとiptablesでNAT(今回の場合はMASQUERADE)とフレッツ用のpppoeと、そのくらいでだいたい行けた。もちろん(?)kernelソースも持って来てはありますが、まだ使いどころが無かった。

一緒にOCN IPv6サービスも申し込んだので、こちらの設定も追々する予定。ああ、不要なdebパッケージをお掃除したいね。

2009年9月10日

MT4のStyleCatcherの処理に時間がかかるのだ

で、さっそく問題発声。ギャース。いや発生。

MT4プラグインであるStyleCatcherは、ネットワーク上のレポジトリに公開されているMT用のブログスタイルを取ってきて自分のブログに適用してくれるわけですが、標準のレポジトリ(http://www.sixapart.com/movabletype/styles/mt4/library)にとりにいくと、数が多いせいかかなり待たされます。で、SuiteXのHTTPサーバ(Apacheだよね?)のタイムアウト設定が短めで1分?かそこらに設定されていて、全ての処理が終わりきる前にタイムアウトが起こり、処理が継続できなくなるという事態に陥ってしまったのでした。うはあ。

"Timeout waiting for output from CGI script"てやつですな。

じゃ、一気に全部のスタイルを持ってこようとするのがよくないので、タイムアウトを起こさない程度の少量ずつを取ってくるようにすれば問題ないはずだよねと素朴に変更を加えてみたのが以下の通り。

diff -x mt-config.cgi -ur MT-4.261-ja/plugins/StyleCatcher/lib/StyleCatcher/CMS.pm MT-4.261-ja.new/plugins/StyleCatcher/lib/StyleCatcher/CMS.pm
--- MT-4.261-ja/plugins/StyleCatcher/lib/StyleCatcher/CMS.pm	2009-06-16 14:45:32.000000000 +0900
+++ MT-4.261-ja.new/plugins/StyleCatcher/lib/StyleCatcher/CMS.pm	2009-09-10 01:42:06.000000000 +0900
@@ -138,7 +138,7 @@
     my $app = shift;
     return $app->json_error( $app->errstr ) unless $app->validate_magic;
 
-    my $data = fetch_themes($app->param('url'))
+    my $data = fetch_themes($app->param('url'), $app->param('offs'), $app->param('count'))
         or return $app->json_error( $app->errstr );
     return $app->json_result( $data );
 }
@@ -449,7 +449,7 @@
 # pulls a list of themes available from a particular url
 sub fetch_themes {
     my $app = MT->app;
-    my ($url) = @_;
+    my ($url, $offs, $count) = @_;
     return undef unless $url;
 
     my $blog_id = $app->param('blog_id');
@@ -503,6 +503,10 @@
             }
             push @repo_themes, $css;
         }
+        $data->{paginate}{total} = $#repo_themes + 1;
+        $data->{paginate}{offset} = $offs;
+        $data->{paginate}{count} = $count;
+        @repo_themes = splice(@repo_themes, $offs, $count);
 
         my $themes = [];
         for my $repo_theme (@repo_themes) {
diff -x mt-config.cgi -ur MT-4.261-ja/plugins/StyleCatcher/tmpl/view.tmpl MT-4.261-ja.new/plugins/StyleCatcher/tmpl/view.tmpl
--- MT-4.261-ja/plugins/StyleCatcher/tmpl/view.tmpl	2009-06-16 14:26:14.000000000 +0900
+++ MT-4.261-ja.new/plugins/StyleCatcher/tmpl/view.tmpl	2009-09-10 02:04:15.000000000 +0900
@@ -393,6 +393,9 @@
         }
         if (data.result.themes)
             loadThemes(data.result.themes, cat);
+        var paginate = data.result.paginate;
+        if (paginate.offset + paginate.count < paginate.total)
+            getStyles(repo_id, data.result.repo['url'], paginate.offset + paginate.count, paginate.count);
     }
 
     function createCategory(cat_name, cat_title, url) {
@@ -484,7 +487,7 @@
         }
     }
 
-    function getStyles(repo_id, url) {
+    function getStyles(repo_id, url, offs, count) {
         var btn = getByID("find-button");
         TC.addClassName(btn, "hidden");
         TC.removeClassName(TC.elementOrId("loading-styles"), "hidden");
@@ -496,6 +499,8 @@
             'arguments': {
                 '__mode': 'stylecatcher_js',
                 'magic_token': '',
+                'offs': offs ? offs : 0,
+                'count': count ? count : 9,
                 'url': url
             }
         });

取得中状態の見せ方をもう少しかっこ良くすることもできると思うけど、とりあえずこんなかんじ。流れは以下のようになっちょります。まじで素朴にpaginate。

  • ブラウザからサーバへの取得リクエスト時に、「今回のオフセット」と「個数」を追加して送信
  • サーバ(CGI)は指定されたオフセットと個数分のみを切り出してブラウザに対して応答
  • このとき、応答に「今回のオフセット」と「個数」、さらに「全体の個数」を付加
  • サーバの応答を受け取り、ブラウザは表示処理を行う
  • 「今回のオフセット」+「個数」=「次回のオフセット」として計算
    • 「次回のオフセット」が「全体の個数」を下回れば、「次回のオフセット」と「個数」を用いて次の取得リクエストを送信し、同じ内容を繰り返す。
    • 「次回のオフセット」が「全体の個数」を上回るか等しければ、繰り返しを終了。