下宿内乱(ベタやなぁ...)

常時接続の開通を睨んで下宿内LANを構築してみました。すでに似た趣向の頁はいくつかあると思いますが、まぁ備忘録半分ということでお付き合いください。
  1. 概略図と取り決め
  2. 安ノートPCの購入
  3. Linuxディストリビューションの選択
  4. Linuxの導入
  5. kernelの再設定
  6. PCMCIAのethernet card 二枚差し
  7. IP-masqueradeの導入
  8. clientの設定
  9. モバと繋ぐ (1) agetty
  10. モバと繋ぐ (2) pppd
  11. 軽量化
  12. Perlで遊ぼ
  13. 静音化
  14. 参考文献


概略図と取り決め

システムの概略はこんな感じです。
                 +------------------+ 
Internet         |    server        +----Ethernet--->[koshi-4]
 <----Ethernet---+    (heppoko)     |
                 |                  +----Serial----->[MobileGear]
                 +------------------+ 


安ノートPCの購入

下宿内LANを構築するには常時起動させておくserverが必要となり、消費電力と騒音からノートPCがそのようなサーバーとして最適と判断しました。

ノートPCだと値段の割にスペックがヘボいという欠点があるのですが、 それはOSの軽さでカバーすることにしましょう。IP-masquerade を動かすだけのサーバーで しかも回線が128kbps(÷使用人数 X-| )ですので、GUI不要と割り切れば 486ベースのマシンで十分です。但しPCMCIAスロットが二つ以上あるものを選択する必要がありますが。

秋葉原や日本橋で中古の専門店を丹念に回れば、486dx2,dx4あたりのノートPCであれば15,000円以内で入手できます。

ちなみに私はCompaqの Contura 410cx にメモリ8MBを増設たものを13,000円程度で購入しました。HDDが壊れたため500MBに乗せ換えたとかネットワークカードを 3枚買ったとかしましたが、それでも23,000円程度です。

名前の由来?スペックと自分がヘボヘボだからだけど。


Linuxディストリビューションの選択

ディストリビューションは Plamo Linux を選択しました。流行のRedHat系ではありませんが、

  1. CUIベースの設定に関する情報はslackwareを対象にしていることが多い
  2. 導入即 kernel設定ができる(導入されるパッケージが通常そのようになっている)
  3. パッケージの粒度が丁度良く、カスタマイズが楽
  4. パッケージ選択が面倒でも、「お任せ」なら300MBで必要なソフトがきっちり入る。
  5. slackwareに慣れている :-)

という利点があります。


Linuxの導入

こうして購入した安ノートPCには当然CD-ROMドライブが付いてきません。 このときの対処策は

  1. SCSI カード経由でCD-ROMを増設してインストール(Linuxで動作するSCSIカードとCD-ROMドライブが必要)
  2. ノートPCのHDDを外してデスクトップPCに付け、インストール(デスクトップPCが必要)
  3. NFSでインストール(Unix導入済デスクトップPCが必要)
  4. シリアル接続、パラレル接続でディストリビューションCD-ROMの内容をノートPCに コピーし、インストール(ノートPCに十分な空きが必要)

あたりが考えられます。私の場合は (2)を選択したところ ノートのHDDが死亡し、結局(3)にしました。 結構手間取りましたが、NFSサーバー(晒す側,Koshi4)の /etc/hosts.allow の設定をしていなかったのが原因でした(あ〜恥ずかし)。コツさえつかんでしまえば簡単なものです

CHSモードで13GB使っていたIDEポートにノートのHDDを繋げたら死亡。なむ〜

フロッピードライブがない(または潰れている)PCもあるかもしれませんが、 plamoはそういうPCにも対処するようなブートイメージを提供しています。 Rdisk 等を駆使してがんばってください。

ネットワークに関する設定は、とりあえず内部LANの方を先に決めてしまいます。

最後に「設定はノート用に保存しますか?」と聞かれますのではいと答えます。

プライベートアドレスは以下の通り。これらのIPはglobalなInternetでは使用されないため、 LAN内で自由に使用できます
  • 10.0.0.0/8 (10.0.0.1〜10.255.255.255)
  • 172.16.0.0/12 (172.16.0.1 〜172.31.255.255)
  • 192.168.0.0/16 (192.168.0.1〜192.168.255.255)

設定が終了したらリブート(ctrl-alt-deleteで再起動)します。bootの途中で「ピッ、ピッ」と高い音が二回鳴り、なおかつクライアント・サーバー双方の設定を正しくしていれば、問題なく動作するはずです。pingコマンドで確認してみましょう。

%ping 192.168.100.2 (自分のIPアドレス) または
%ping 192.168.100.3 (相手のIPアドレス)
駄目な場合は、以下の対策を練ってください。
  1. ケーブルを確認する。10base-T直結ならクロスケーブルが必要
  2. ifconfigコマンドで、ネットワークカードが認識されているか調べる。
  3. cardctlコマンドでカード自体が認識されているか調べる。
  4. ウェイト挿入・ポート設定(10baseT/2)等が必要な場合があるので、PCMCIA-HOWTOの3,4を見て 適宜対策する。
  5. 同じカードで悩んでいる人が居るかもしれないので、検索する。
  6. どうしても駄目なら、新しいカードを買う (;_;)

CentreCOMのLA-PCMは動作リストに載っていますが、Linuxでは癖があるので止めた方がよさそうです(ブランドに騙された、むきぃ〜)。ジャンク屋で適当なものを見繕ってくるほうがマシかも。

pingコマンドで返答が帰ってくるようでしたら、サーバー側の/etc/hosts.allowを次のように編集します。これでIPアドレスが 192.168.100.* であるPCからアクセスが可能となります。

ALL: 192.168.100.0/24 (クライアントのIPアドレス)

クライアントが数台しかない場合は

ALL: 192.168.100.3
ALL: 192.168.100.4
のように決め打ち設定することも可能です。


kernel 設定

CPUとかその辺に付いて一応調べたあとで
make menuconfig
と打つと、kernel設定画面になります。

さて、IP-masqueradeに必要な設定は以下の通り。

あとの注意事項として、

などを挙げておきます。モジュール化を突き詰めて軽量化するのも良いのですが、ネットワークやファイルシステムはあまりモジュール化しない方が宜しいかと。

設定が終わったら、
#cd /lib/modules
#tar cvfz modules_org.tgz ./$VERSION (モジュールのバックアップ)
#rm -rf ./$VERSION/ (モジュール類を消去)
#cd /usr/src/linux-$VERSION
#make dep; make clean ; make zImage ; make modules; make modules_install
しばらくお待ちください。Pentium3の500MHzくらいなら5-10分ですが、ここで用いたマシンだと50分くらい掛かります(苦笑)。そのあとで PCMCIA-CS のソースがあるディレクトリに移動し、
#make config
設定をどこから読むか?と聞かれるので、「2:現在のカーネルソースから読む」と 答えておけばおっけー。。一通り設定が終わったら、
#make all ; make install
#cd /lib/modules/2.0.36/
#depmod -a
で上手く行くはずです。


PCMCIAのethernet card 二枚差し

まず、起動時のオプションを

eth=0,0,eth0 eth=0,0,eth1
のように設定します。

PCMCIA ネットワークカードのIP等の設定は /etc/network.optsで行います。 インストール時の設定が既にこの中に書かれていると思いますので、二枚目の 設定も書くことにします。

カードのスロット番号によって設定するには、以下のように書けば大丈夫です。 ethernetアドレスによる設定を行うようにすることも可能です(4番目の * を書き換える)。
case "$ADDRESS" in
*,0,*,*)
    #内部LANに関する設定が書かれているはずです。
    ;;
*,1,*,*)
    #Internet接続サービスプロバイダから貰った設定を書いてください。
    ;;
esac

再起動し、 ifconfig コマンドで設定を確認してください。eth0, eth1が設定されていればオーケーです。起動する度に eth0とeth1のIP設定 が反対になることもありますが、物理的接続とIP設定の整合性に問題はありません。

外向けネットワークがまだ開通していないなら 二枚差しする必要がありません。むしろトラブルの元になりますので、開通まで外部向けネットワークカードは外しておくのが良策です。

なお、PCMCIAに関してはJFにHowToがありますので、迷ったら即読んでみてください。


IP-masqueradeの導入

この時点で 入門本に書かれている ifconfig の設定とか route の設定は終了していますので、あとは実際に IP-masquerade を動かすだけです。

但し、いくつかの通信プロトコルに対応するにはmodprobeによるモジュールの導入が必要です。 kernel設定時に IP-masquerade 機能をONにしていれば/lib/modules/$VERSION/ipv4あたりにip_masq_*.oがありますので、適当にmodprobeで導入してください。kerneldは使えません。

あ、おまけに言うけど $VERSIONはLinuxのバージョンです。Plamo Linux1.4.4 なら $VERSIONは2.0.36になります。

#modprobe ip_masq_irc.o
#modprobe ip_masq_ftp.o
#modprobe ip_masq_cuseeme.o

forwardingの亜種として動かす、つまり素通しの設定で良いなら、

#ipfwadm -F -p masq
だけで十分に思えますが、これだと成りすましに対してあまりにも無防備なので
#ipfwadm -F -p deny
#ipfwadm -F -a masquerade -S 192.168.100.0/24 -D 0.0.0.0/0
くらいはやりませう。台数が少ないなら一台ずつ つらつらと並べるのも可でしょう。

#ipfwadm -F -p deny
#ipfwadm -F -a masquerade -S 192.168.97.2/32 -D 0.0.0.0/0
#ipfwadm -F -a masquerade -S 192.168.97.3/32 -D 0.0.0.0/0
#ipfwadm -F -a masquerade -S 192.168.97.4/32 -D 0.0.0.0/0
#ipfwadm -F -a masquerade -S 192.168.97.5/32 -D 0.0.0.0/0

これが出来たら、さらにポートスキャンを防ぐためにいろいろと制限を加えてみてください。私は失敗したため詳細を書きませんが、やはりJFに文章があります

動作を確認したら、これらをまとめて/etc/rc.d/rc.masqというスクリプトファイルにしておき、実行属性(chmod 775くらいか)を付けた上で /etc/rc.d/rc.localから呼び出させるようにすればおっけーです。

おまけに、kernelの2.2.xではipchainというソフトを使うそうで、複雑な設定を行うときはこっちの方が便利だそうです。


LAN内clientの設定

クライアントの設定は以下の通りです。


モバと繋ぐ (1) agetty

「HAM and MobileGear page」と銘打っているからには、モバとの接続は必要不可欠です

というのは冗談としても、棚に置きっぱなしにしているserverをメンテナンスしたいときなどに Windowsマシンを起動するのは面倒です、よね?

server側
/etc/inittabに以下の行を入れ、rootになってinit qとコマンドを打つ。

s1:12345:respawn:/sbin/agetty -Lh 19200 ttyS0 vt100

もば側
htermを導入する。設定は面倒ですが、communicationのところを適当にいじったら動くでしょう。ログインしたら stty rows 19のように行数を指定すればよろし(専用の termcap を書いて 上記の vt100 と取り替えるのも手です)。

これで、モバイルギアをserverの端末として使うことが出来るようになりました。


モバと繋ぐ (2) pppd

gettyによる接続は(慣れると)非常に簡単で、事実モバイルギアをネットワーク機器設定端末として持ち歩いている本職SEの方もいるそうです。

ですが、やはりgettyによる接続には幾つかの限界(?)があります

  1. モバ側のアプリケーションが使用できない
  2. 回線の速度を落とさないと文字化けが多い(9600〜19200bpsまでに制限される)
  3. ファイルのやりとりが少し面倒 (Kermit,zModemなどを使用)
  4. Internet接続環境が整っているので、そちらを使いたい

というわけで、pppd の出番です。LinuxをPPPのクライアントとして用いる事例は多くありますが、今回はサーバーとして用います。JFにある PPP-HOWTO29章、およびポケットBSDに関するページを参考にしています。

Server側

  1. pppdを導入する。
  2. /etc/pppd/options を以下のように設定する。
    asyncmap 0
    netmask 255.255.255.0
    19200
    proxyarp
    crtscts
    local
    
  3. /etc/pppd/options.ttyS0 (/dev/ttyS0に関する設定)に、「自分のIP:相手のIP」を書く。
    192.168.100.2:192.168.100.4
    
  4. ~/.cshrc などのシェル設定に コマンドのエイリアスを定めてしまう。
    alias ppp 'exec /usr/sbin/pppd -detach'
    

Clilent側

  1. dosppp等を導入する。
  2. 主設定ファイル (pppd の file オプションで読まれるファイル)には modemの代わりに local オプションを充てる必要がある。
    com1
    irq 4
    local
    pktvec 0x61
    19200
    asyncmap 0
    crtscts
    
  3. IP設定ファイルは、ethernetで繋いだclientの設定を参考に編集する。自分自身のIPはserverに貰うため定める必要はなく、残りはそのまま流用可能。
  4. スクリプトファイルはこんな感じになる。2行目は無条件で改行、heppoko はプロンプトを想定しており、pppは先に設定したエイリアスである。
    TIMEOUT 10
    '' ''
    ogin: yuzo
    ssword: MyPaSSword
    heppoko ppp
    

特にmasqueradeの設定は必要なさそうです。

(注意事項)

server側のppp起動方法にはもう少しスマートな方法もありそうですが、「あんさんのカーネルはPPPをサポートしてまへんで」みたいな文句を言われて尽く突っぱねられました。

速度を上げるためには、

の三つを変更する必要があります。PPP一本に絞るのであれば115,200bpsまで上げても大丈夫です(/etc/inittabには複数の速度をカンマ区切りで記述できるが、速度の認識が巧く行かない)。


軽量化

マシンが非力である以上、軽量化は必須項目です。Plamo Linuxの場合、インストールしたパッケージは /var/log/package/ にリストアップされますので、これを見ながら

  1. X-windows関連はばっさり切りましょう。フォントも不要です。
  2. Tex,dvi2ps,ghostview関連も斬っちまいましょう。
  3. lib関連、開発言語関連は消さないのが賢明かな。
  4. ヘルプ類やマニュアルも容量を圧迫するなら消去。
  5. muleは noX版を入れます。そうしないとTeraterm等からmuleが使えないので。
  6. TeraTerm等によって外部から日本語を入力するのであれば、canna/wnn/skkも不要です。
  7. 日本語入力を外部に任せるなら mule はnoIMでも可かも。
  8. その他、絶対使わないと思われるものはどんどん消去。

としませう。

また、不要なデーモンを起動しないようにするのも重要です。

やはり
JFに良いHowToがありますので、これを参考にして sendmail, nfsd, mountdあたりの不要daemonが起動しないように/etc/rc.d/rc.*を編集し、端末の数も3つ位に減らすようinittabを編集すれば(c1:...とある行)多少はマシになるのではないでしょうか。


Perl/LWPであそぼ

Perlは文字列の扱いが簡単と言われていますが、モジュールによって提供される 豊富な機能もまた大きな特徴です。

たとえば libwww-perl (LWP)というモジュールを入れると、

  use LWP::Simple;
  $doc = get 'http://www.sn.no/libwww-perl/';

たったこれだけのスクリプトで Webpageの取得が可能となります(このスクリプトはLWPの説明書ファイル(lwpcock.pod)からの抜粋です)。

これ使えば 目的に合った Webpage tracer/getter が簡単に出来そうでそ?

おまけとして 私が使用しているPerlスクリプトを掲載しておきます。これは一URL一行で書かれたURLリストファイルを読み込んで そこに書かれたWebpageを順に取得するスクリプトです。決め打ちが非常に多いので再配布禁止というかこんなん配る阿呆いーへんって。


静音化:サーバーは黙っとれ!

メインマシン(腰5)の静音化がほぼ完成の域に達すると、20cm前にあるメインマシンより1.5m後ろにあるノートのHDD音が耳に付くようになりました。ノートPCは手を入れる余地が少ない分だけ静音化に向かないかもしれません。

HDDをSCSI接続の外付けにして密封するという方法も有りそうですが、面倒なのでノートごと箱に入れてしまいました。A4サイズのノートPCにはマザーボードの箱が適しています(笑)。


参考文献

The Linux Japanese FAQ Project (Japanese)
迷ったらここ、基本です。検索も可能なり。
Linuxネットワーク(小山 裕司,斎藤 靖,江後田 基広,川井 俊,木村 稔, 小島 三弘,佐々木 浩,中込 知之,播口 陽一 共著 トッパン)
上記のJFをもう少し噛み砕いた内容です。借りっぱなしでゴメン>同僚のK氏

Perlに関してはこんな感じです。

新Perlの国へようこそ(小山 裕司,斎藤 靖,前田 薫,布施 有人 共著 サイエンス社)
入門書として最適。第一章で驚きを隠せなかった。
プログラミング Perl(Larry Wall, Tom Christiansen, Randal L. Schwarz 共著 近藤嘉雪 訳 O'relly )
説明不要の「駱駝本」です。
CPAN
Perlのモジュールを集めているサイト。
libwww-perl
このモジュールを使えば、WWW関連のプログラムが一気に書けます。

主頁に戻る