はじめまして、インなんとかさんです。いやうそです。ごめんなさいよく知らないんですそのアニメ。 私たち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に入れ替えたからには、中をいろいろといじりやすい環境になったわけですからまだまだいろいろと試してみたいじゃないですか。次回以降、これにさらに手を加えて自分なりにあそんでみたいと思います。