KLab若手エンジニアの これなぁに?

KLab株式会社の若手エンジニアによる技術ブログです。phpやRubyなどの汎用LLやJavaScript/actionScript等のクライアントサイドの内容、MySQL等のデータベース、その他フレームワークまで幅広く面白い情報を発信します。

2010年05月

とある遠隔勤務者の冒険記録#1 ~Linuxルータ作るよっていうかD510おいしいです~

はじめまして、インなんとかさんです。いやうそです。ごめんなさいよく知らないんですそのアニメ。 私たちKLabには、六本木本社や大阪、福岡の各事業所以外に、遠隔地から参加して勤務している社員が何名かおりまして、私はそのうちの一人です。普段の業務はメールはもちろんJabberやIRCやSkype、WikiやTracなど様々なツールを用いて連絡を取り合いつつ、通常勤務の人たちと変わらず日々はたらいております。 さてそんな折、自宅のネットワーク環境はやっぱりまあある程度充実させておきたいなと思うわけです。ましてやネットワークやLinuxをいじって飯食ってる手前、ただ漫然と○○バシカメラで買ってきたブロードバンドルータをつなげてわーいらくちんだなあえへへーとか言ってるんじゃいかんと思ったわけです。どうやってISPとつなげてどうやってパケットがルータを通って、とか見てみたいじゃないですか。 というわけでやってみました。Linuxマシンでルータづくり。 まず機材選定というか、PCを組まなければいけないわけですが最初から狙いはAtomで組もうと定めてました。mini ITXなら静音で小型のやつが組めるだろうなと。でどうせルータ用途に専念させるなら拡張性は無視でいいし、ディスク容量もほとんど要らないので取捨選択もしやすかったです。 http://www.intel.co.jp/products/desktop/motherboards/D510MO/D510MO-overview.htm Intel® Desktop Board D510MO - Overview 私が選んだのはScythe製BM639。縦置き可能なほうが都合よかったので選びました。 http://www.scythe.co.jp/case/bm639.html 株式会社サイズ | 商品詳細 |BM639 メモリやHDDはそこそこに、あとせっかくルータなのでNICを1枚買ってきてONUと直結用にしました。 http://buffalo.jp/products/catalog/item/l/lgy-pci-gt/ LANアダプタ|LGY-PCI-GT そして組み立ては無難に完了。LinuxのインストールはUSBメモリを使いました。 http://www.jp.debian.org/releases/lenny/i386/ch04s03.html.ja#usb-copy-flexible 4.3.2. ファイルのコピー — 柔軟な方法 [www.jp.debian.org] USBメモリを使ってインストールイメージを作成するのには、上記URLの方法を参考にしました。設定項目を入力していけばほとんど詰まることなくいけましたよ。 あとは設定ですね。まずはsysctl周り。
net.ipv4.ip_forward = 1
これがないとはじまりません。 続いてiptablesなんですが、最近のDebianでは/etc/network/if-pre-up.d/以下に配置するべきと聞きまして、下のようなスクリプトを用意しました。
#!/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の設定、こちらはマルチセッションでつないでいるので、以下のようなファイルを二つ、それぞれ/etc/ppp/peers/配下に置きました。
# /etc/ppp/peers/ISP_A
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
# /etc/ppp/peers/ISP_B
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,pap-secrets}に次の内容で配置します。
"aaa@bbb" * "ccc"
"xxx@yyy" * "zzz"
最後に、自動接続させるために/etc/network/interfacesに下記を追加。
auto eth1
iface eth1 inet static

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

auto ppp1
iface ppp1 inet ppp
  pre-up /sbin/ifconfig eth1 up
  provider ISP_B
最後に、マルチセッションの使い分けのためのルーティング設定を追加しました。ISP_Bの方の接続は固定IPアドレスになっていて、本社との間のsshやVPN接続を行う際の認証にこのIPアドレスでのフィルタリングも行っているためです。
#!/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
以上の設定で無事Linuxルータが稼働しました。でも、これはまだまだ最初の一歩にすぎません。せっかく市販のブロードバンドルータからLinuxに入れ替えたからには、中をいろいろといじりやすい環境になったわけですからまだまだいろいろと試してみたいじゃないですか。次回以降、これにさらに手を加えて自分なりにあそんでみたいと思います。

さっそくWebM(VP8)使ってみたよ!

umjammer です、 VP8 オープンソース化されましたね。これから Web 動画の覇権はどうなっていくのでしょうか?私は以前動画関連の仕事をしていたときライセンス関係で苦労したのでライセンスフリーなコーデックは大歓迎です。 さて、発表即日なのにもうインストールしている人がいたよ。こちらを参照してください。 で、私もインストールしてみました。以下は h.264 と適当に比較してみた結果です。 サンプルはここからお借りしました。 WebM はパラメータなんて使わないよとのことなので

$ ffmpeg -i BD_Video.m2ts -s 480x272 sample_vp8.webm

h.264 のエンコーディングパラメータはここの Single-Pass Constant Rate Factor (CRF) Example を参考にしました。

$ ffmpeg -i BD_Video.m2ts -s 480x272 -acodec libfaac -ab 96k -vcodec libx264 -vpre slow -crf 22 sample_h264.mp4

結果です、WebM に bps が出ていないのではっきりと比較出来ていませんがファイルサイズで見ると圧縮率はあんまり変わっていないようです。

$ ls
-rw-r--r-- 1 foo staff 66834432 2010-05-20 20:12 BD_Video.m2ts
-rw-r--r-- 1 foo staff  1674461 2010-05-20 20:26 sample_h264.mp4
-rw-r--r-- 1 foo staff  1519316 2010-05-20 20:17 sample_vp8.webm

$ ffmpeg -i sample_h264.mp4 
FFmpeg version SVN-r23201, Copyright (c) 2000-2010 the FFmpeg developers
 :
  Duration: 00:00:15.51, start: 0.000000, bitrate: 863 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 480x272 [PAR 136:135 DAR 16:9], 761 kb/s, PAR 161:160 DAR 483:272, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 95 kb/s
 :

$ ffmpeg -i sample_vp8.webm 
FFmpeg version SVN-r23201, Copyright (c) 2000-2010 the FFmpeg developers
 :
  Duration: 00:00:15.55, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: libvpx_vp8, yuv420p, 480x272, PAR 161:160 DAR 483:272, 23.98 tbr, 1k tbn, 1k tbc
    Stream #0.1: Audio: vorbis, 48000 Hz, stereo, s16
 :

画質は iPhone 用のサイズなのでよくわかりませんでした... ポーズしてみると若干 h.264 の方がキレイなんじゃないの?圧倒的な VP8 勝利を期待したのですが...動画に詳しい方ツッコミよろしくです。
VP8


h.264


 KLab若手エンジニアブログのフッター