PlamoLinuxとLibrettoでPCルータ

386や486のAT互換機にNICを2枚さして FreeBSD や Linux を入れてルータに使うのは簡単にできます。
HDDなんか必要なくて、フロッピー1枚だけでルータが作れるってんで便利みたいです。
しかし場所はとるし、音はうるさいし、電気代も馬鹿にならない。
リブレットなら小さいくて騒音・電気をあまり気にせずバッテリつけとけばUPS風で停電にも強いし便利そう。
東芝リブレットの初代 Libretto20 でPCルータができれば便利そうだと思いつき試してみました。
今となってはLibretto20が眠っている人って結構いるんじゃないですか。

Windowsのバックアップや、PlamoLinuxのインストールのお話は、戻って確認してください。


ネットワーク2枚差し対応

まずはネットワークカードを2枚指した場合の設定から。
PCカード用ネットワークカードが認識されると、自動的に下記のスクリプトが走ります。
    /etc/pcmcia/network start eth0
2枚目の認識時には
    /etc/pcmcia/network start eth1
となります。

両方指してブートすると、本体スロットにeth0、増設スロットにeth1が割り当てられます。

標準のままだとIPアドレスの設定がうまくいきませんので細工が必要です。

私は以下のように変更しました。

/etc/pcmcia/network の30行目くらい
変更前  . $0.opts
変更後  . $0.$DEVICE.opts

# cd /etc/pcmcia/
# ln -s network.opts network.eth0.opts
# cp network.opts network.eth1.opts
# vi network.eth1.opts (編集する。DHCPの場合は次を参照)

ここで eth0 をシンボリックリンクにしているのは、netconfigを無駄にしないためです。


DHCPクライアント

eth1をDHCPクライアントで、IPアドレスを振るにはこうしました。
eth0を内(ローカル 192.168.0.0)、eth1を外(CATVとか DHCP)とやった方が楽だと思います。

PlamoLinuxのCDに入っている contrib/Networking/dhcpcd.tgzをインストールします。
   # installpkg dhcpcd.tgz

もしかしたら次のファイルが更新されてしまうので注意してください。
リブレットの場合、PCカード側で処理するのでこれらは書き変わる必要がないです。(たぶん)
インストール後に元に戻しましょう。
   /etc/rc.d/rc.M
   /etc/rc.d/rc.inet1
   /etc/rc.d/rc.inet2
   /etc/rc.d/rc.dhcp
   /etc/pcmcia/network.opts

こっちは変更されてないとまずい場合もある。DHCPの定義が入ってることを確認。
変更されている場合、上でやった修正を反映するのを忘れずに。
   /etc/pcmcia/network

DHCPがうまくいかない場合、/etc/pcmcia/network の dhcpcd の起動のところを dhcpcd -r と、-r オプションをつけてみてください。
DHCPのサーバによっては -r が必要な場合があります。

・PlamoLinux1.3の場合
/etc/pcmcia/network.eth1.optsから既存の設定を全て "" に変更して、そこに以下の2つを追加。
   DHCP="Y"
   DHCPSTF="/etc/pcmcia/network.eth1.dhcp"
DHCPでホスト名の通知が必要な場合は /sbin/dhcpcd に "-h ホスト名" という引数を追加。

/etc/pcmcia/network.eth1.dhcp を以下のようにする。
シェルなので実行権もつけて置いてください。(chmod 755 network.eth1.dhcp)
/lib/modules/2.0.35/ipv4/*.o がモジュールです。
実際試した訳じゃなくてこんな感じだったかなぁってだけで書いてます。間違ってるかも。

#!/bin/sh
/sbin/modprobe ip_masq_cuseeme
/sbin/modprobe ip_masq_ftp
/sbin/modprobe ip_masq_irc
/sbin/modprobe ip_masq_quake
/sbin/modprobe ip_masq_raudio
/sbin/modprobe ip_masq_vdolive
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
/sbin/ipfwadm -F -f
/sbin/ipfwadm -F -p deny
/sbin/ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0

・PlamoLinux1.4の場合
/etc/pcmcia/network.eth1.optsから既存の設定を全て "" に変更して、そこに以下の1つを追加。
   DHCP="Y"
DHCPでホスト名の通知が必要な場合は /sbin/dhcpcd に "-h ホスト名" という引数を追加。

/etc/network の 'start')の最後の処理に以下を入れる。
/lib/modules/2.0.36/ipv4/*.o モジュールです。

if [ "$DEVICE" = "eth1" ]; then
    /sbin/modprobe ip_masq_autofw.o
    /sbin/modprobe ip_masq_cuseeme
    /sbin/modprobe ip_masq_ftp
    /sbin/modprobe ip_masq_irc
    /sbin/modprobe ip_masq_mfw
    /sbin/modprobe ip_masq_portfw
    /sbin/modprobe ip_masq_quake
    /sbin/modprobe ip_masq_raudio
    /sbin/modprobe ip_masq_user
    /sbin/modprobe ip_masq_vdolive
    echo "1" > /proc/sys/net/ipv4/ip_forward
    echo "1" > /proc/sys/net/ipv4/ip_dynaddr
    /sbin/ipchains -F
    /sbin/ipchains -P forward DENY
    /sbin/ipchains -A forward -j MASQ -s 192.168.0.0/24 -d 0.0.0.0/0
fi

start_fn $DEVICE
;;

・PlamoLinux2.0の場合
/etc/pcmcia/network.eth1.optsから既存の設定を全て "" に変更して、そこに以下の1つを追加。
   DHCP="Y"
DHCPでホスト名の通知が必要な場合は /sbin/dhcpcd に "-h ホスト名" という引数を追加。

/etc/network の 'start')の最後の処理に以下を入れる。
/lib/modules/2.2.14/ipv4/*.o がモジュールです。

if [ "$DEVICE" = "eth1" ]; then
    /sbin/modprobe ip_masq_autofw.o
    /sbin/modprobe ip_masq_cuseeme
    /sbin/modprobe ip_masq_ftp
    /sbin/modprobe ip_masq_irc
    /sbin/modprobe ip_masq_mfw
    /sbin/modprobe ip_masq_portfw
    /sbin/modprobe ip_masq_quake
    /sbin/modprobe ip_masq_raudio
    /sbin/modprobe ip_masq_user
    /sbin/modprobe ip_masq_vdolive
    echo "1" > /proc/sys/net/ipv4/ip_forward
    echo "1" > /proc/sys/net/ipv4/ip_dynaddr
    /sbin/ipchains -F
    /sbin/ipchains -P forward DENY
    /sbin/ipchains -A forward -j MASQ -s 192.168.0.0/24 -d 0.0.0.0/0
fi

start_fn $DEVICE
;;

/proc/sys/net/ipv4/ip_foward に 1 を書き込んでいますが、これをやらないとIP転送をしてくれません。
また、DHCPによりWAN側アドレスをもらう場合は、/proc/sys/net/ipv4/ip_dynaddr にも 1 を書き込みます。

なお、ネットワーク対応ゲームなどで、特定のポートをあける必要があるときは下記のような感じです。
※「192.168.0.xxx」はゲームをするマシンのプライベートIPアドレス

# Age of Empires
ipmasqadm autofw -A -r upd 1100 7000 -h 192.168.0.xxx
ipmasqadm autofw -A -r tcp 1100 5000 -h 192.168.0.xxx
ipmasqadm autofw -A -r udp 47624 47624 -h 192.168.0.xxx
Masq Appicationsが参考になります。


DHCPサーバ

http://www.isc.org/products/DHCP/ からファイルをゲットしてくる。
私が試したのは PlamoLinux 2.0 と dhcp-2.0.tar.Z

とにかく作る。

# tar zxvf dhcp-2.0.tar.Z
# cd dhcp-2.0
# ./configure
# make
PlamoLinux 2.0 標準のカーネルだと、setsockoptのSO_ATTACH_FILTERでエラーとなるようである。
よくわかんないから(^^;)コメントアウトしたら動くようになった。
だってカーネル作り直すの遅いし容量ギリギリだし面倒なんだもん。
いいんかなぁ、、、セキュリティとか問題なりそうだな。。。試すなら自己責任ってことで。
コメントアウトしたのはcommon/lpf.cの195〜204行目と224〜233行目のsetsockoptんとこ。
これ何やってる処理なんだろう。まあいいや。
でも /var/log/messages にうるさいくらいエラーがでてますなぁ。。。これもコメントアウトしちゃお(ぉぃ

マニュアルのインストール先が PlamoLinux2.0 で都合悪いので変更する。

# vi server/Makefile
修正前 FFMANDIR = /usr/share/man/man5
修正後 FFMANDIR = /usr/man/man5

必要なのは dhcpd だけなので、インストールはそれだけでよい。

# cd server
# make install
# touch /var/state/dhcp/dhcpd.leases

定義ファイルを設定する。

# vi /etc/dhcpd.conf
最低限の設定ならこんな感じかな。
細かい制御は man dhcpd.conf と 元からのサンプル server/dhcpd.conf を参照

---dhcpd.conf---
option domain-name "ドメイン名:無し("")でもいい";
option domain-name-servers プライマリDNSのIPアドレス, セカンダリDNSのIPアドレス;

option subnet-mask 255.255.255.0;
default-lease-time 86400;
max-lease-time 86400;

subnet 192.168.0.0 netmask 255.255.255.0 {  ←割り当てるネットワーク
  range 192.168.0.100 192.168.0.199;     ←割り当てる範囲
  option broadcast-address 192.168.0.255;   ←ブロードキャストアドレス
  option routers 192.168.0.1;         ←ルータマシン自身のIPを書く
}
---
これで準備は完了。
サービス開始は
# /usr/sbin/dhcpd eth0

/etc/pcmcia/network に追加しておけば自動化できる。

if [ "$DEVICE" = "eth0" ]; then
    /usr/sbin/dhcpd $DEVICE
fi

if [ "$DEVICE" = "eth1" ]; then
(中略)
fi

start_fn $DEVICE
;;
カード抜いたときに対応しないなら、'stop')処理に改造が必要です。


使用感

やる前は遅くてダメかと思ったけど、全然そんなこと無いみたいです。
上位が256KBとかで制限されている場合、結構平気な感じがします。
どの辺まで持つかは環境がないのでよくわかりません。
600Kbpsとかでも余裕みたいです。ルータとして十分で機能するでしょう。
セッション数多かったりするとどうなるかわかりませんが。。
リブレット一式が余っていてCATVに加入してルータどうしようと思ってる人は挑戦してみましょう。
最近ならCATV向けの安価なルータも出てきたのでうま味はあまりないかもしれませんが、
ファイヤウォールやらIPマスカレードやらで、細かく制御できるのが利点でしょうか。
Webサーバ、ftpサーバ、ファイルサーバなどにも使い回せます。


戻る