2004年1月12日月曜日

Debian GNU/Linux, Win98, イーサネットによるホームLAN とインターネット

LANとADSLインターネット

ISDNからADSLに回線を変更することになった。 いままでは、ISDNターミナルアダプタAtermITX80DのITMUXなる機能を利用して2台のコンピュータを同時にインターネットに繋ぐようにしていた。 もちろん、回線変更に伴いISDNターミナルアダプタは使えなくなる。 何も手を打たなければ、2台のコンピュータが同時にインターネットに繋げなくなってしまう。

そこで、家のコンピュータでプライベートなネットワークを組むことにした。 インターネットに出るときは、そのネットワーク内にあるゲートウェイに問い合わせをするようにする。 ゲートウェイ役を、とりあえず『レンタルモデム(ルータタイプ)』に任せることにする。
このモデム(ルータタイプ)はHUB機能こそついてないものの、 DHCP、NAT、IPマスカレードなどなどの多彩な機能をもつ。 これらのモデムの機能はWebブラウザから設定することができ、本当にこれはモデムなのか?、と疑うほどの簡単さなのだ。
なおそのモデムはFLASHWAVE 2040 M1(富士通)である。
なお、上記にあげたモデム(FLASHWAVE 2040 M1)の取扱説明書を手に入れるのならここにいくとよいだろう。

LANの構成、ADSLの詳細をまとめてみたい。

  • プロトコルはPPPoE(PPP over Ethernet)だとプロバイダに言われた。
  • モデム(ルータタイプ)のIPマスカレード機能を使うことにする。
    プライベートネットワーク内のパソコンの代わりにモデム(ルータタイプ)がインターネットに繋ぐ。
    ゲートウェイとなってもらうのだ。
  • モデム(ルータタイプ)と3台のパソコンは、192.168.0.0/24(192.168.0.0/255.255.255.0)というプライベートなネットワーク内にいる。
  • ゲートウェイ=モデム(ルータタイプ)は192.168.0.1/24を名乗る。
  • WinMEを搭載したノートパソコンは192.168.0.2/24を名乗る。
  • Win98を搭載したデスクトップパソコンは192.168.0.3/24を名乗る。
  • Debian GNU/Linuxを搭載した筆者のパソコンは192.168.0.4を名乗る。
  • WinMEもWin98もDebianもネットワークの設定はほぼ同じである。
    ゲートウェイを192.168.0.1にするだけだ。

買い物に行く。
買ってくるのは、パソコン用のNICと、LANケーブル(必要本数)、そして、Ethernetハブ(1つ)だ。
まだレンタルモデムが家に郵送されていなくても、これだけあればとりあえずLANだけは楽しめる(?)はずだ。

NICのインストール on Debian
筆者が買ってきたのは、RealTek RTL8139というチップののったNICだった。 NIC基板上のチップのところにカニの絵が描かれていたので、これはおそらく世間一般に言われているカニさんチップであろう。

NICをPCIスロットに挿してもOSが勝手に自動認識してくれなかったNICを挿しただけでちゃんと動いたと言う人のカーネルは相当膨らんでいるのだろうな、と憂えてしまう瞬間である。 (負け惜しみ)
そんなわけで、デバイスを認識してくれないということはカーネルまわりをいじらないといけないのだろう。
カーネル2.2.17の

Network device support → Ethernet(10 or 100 Mbit) → RealTek 8129/8139(not 8019/8029!) support

を n から m へと設定を変える。

ドライバをモジュールとして扱うことで得られる利点は多い。
ドライバをカーネルに完全に組み込んでしまうとカーネルは肥大化する。 カーネルは物理メモリにロックされるので、ディスクにスワップアウトされない。 つまり肥大化した分だけRAMを圧迫しつづけるというのだ。

逆に、モジュールならば、別のチップのNICを扱うときにカーネルを再構築したり、再起動したりする必要はなくなる。 実際には、今カーネルに組み込んでいるモジュールをrmmodコマンドで消して、新たなモジュールをinsmodコマンドで組み込んでやればよい。 さらに、modprobeコマンドを使えばモジュールの依存関係までも考慮して組み込んでくれる。
さらに、NICを複数枚挿す際、各々のNICに対するドライバの指定方法も簡単になるのだ。

システム管理者というのはここまで深く考慮しなければならないらしい・・・。 嗚呼、大変だ・・・。

次に/etc/modules.confというファイル内に

alias eth0 rtl8139

の1行を付け加え、NICに対してモジュールを指定。 なお、同様にして2枚目のNICのeth1に対するモジュールの指定も可能である。

その後なぜかノリでカーネルを再構築する。 とはいえ、リブートをしたら、NICをeth0として認識してくれていた。 起動時のメッセージや、ifconfigコマンドの結果などからそれを確認できるはずだ。
今思えば、再構築までしなくてもよかったな。

なお、今回、Debianのバージョンを2.2から3.0へと上げてから初めてのカーネル再構築となった。 最初、make-kpkgでエラー(arch/i386-none/Makefile が見つからないよ、というエラーだった)が出て止まってしまったが、以下のようにしてなんとか乗り切った。

# cd /usr/src/kernel-source-2.2.17
# mkdir ./arch/i386-none
# echo '' > ./arch/i386-none/Makefile
# make-kpkg clean
# make-kpkg --revision Custom.1.000 kernel_image
# cd ../
# dpkg -i kernel-image-2.2.17_Custom.1.000_i386.deb

しかし、dpkgでカーネルパッケージをインストールする際も、カーネルのバージョン(make-kpkg kernel_image する際に --revision のあとに続けて書くことでバージョンをつけられる)を下手に動かすとALSAが文句を言い出すためこれまたインストールが止まってしまう。
バージョン番号を振り変えるだけでエラーってのもすごいが、
とりあえずALSAユーザは要注意(?)。
筆者の場合、カーネルのバージョンを1.00から動かせなくなってしまった。 今後は1.000、1.0000、1.00000.....のように 0 を増やして対応していこうかと思っている。

Debianのネットワーク設定(IP割り振り、ルーティングテーブル)
ifconfigコマンドでeth0というデバイスが認識されていればあとはもう楽だ。 このeth0というネットワークインターフェースに対して、IPアドレス、ネットマスクを振り、ゲートウェイがどこにあるのかを教えればよいのだ。
とりあえず手動でコマンドを打って設定を行う。 もちろん、このようなネットワーク設定を起動時に自動的に行わせる方法もあるが、それは後述する。

NICにIPアドレスを振るifconfigコマンドの最低限の使い方

デバイス(eth0など)の設定を見るなら

ifconfig デバイス

デバイスに特定のIPアドレスを振り、ネットマスクをかけた状態でインターフェースを使用できるようにするには

ifconfig デバイス IPアドレス broadcast ブロードキャストアドレス netmask ネットマスク up

のようにコマンドを打つとよい。
eth0に192.168.0.4/24を名乗ってもらうようにするには以下のように打つ。 upを指定しているため、このコマンドを打っただけでインターフェースが利用できるようになる。

# ifconfig eth0 192.168.0.4 broadcast 192.168.0.255 netmask 255.255.255.0 up

現在の設定を確認するには以下のように打ち、出力を眺めればよい。

# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0A:79:04:E9:4F  
          inet addr:192.168.0.4  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:93531 errors:0 dropped:0 overruns:0 frame:0
          TX packets:72978 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:73196745 (69.8 MiB)  TX bytes:8174396 (7.7 MiB)
          Interrupt:11 Base address:0xec00

2行目の出力部分にインターフェースのIPアドレスなどが書かれている。
3行目はいくつかのフラグが見える。

  • UP:そのインターフェースが利用可能でパケットの送受信ができる状態であることを表す
  • BROADCAST:全てのブロードキャストを受信できる
  • RUNNING:このインターフェース用のドライバが動いている
  • MULTICAST:マルチキャストが可能
  • MTU:このインターフェースが出すパケットの最大バイト数(Maximum Transfer Unit)
  • Metric:優先度みたいなもの、よくわからん、同じ設定のものがあっても、この値の小さい方を優先的に使うらしいのだが・・・

そのほかにも、インターフェースから見えるネットワーク上の全てのトラフィックを受け入れることを表すPROMISCというフラグもある。 これが今、週刊B春で流行りの「ネットワークスニファ」機能につながるのだ。

ルーティングテーブルを作るrouteコマンド

ルーティングテーブルはパケットの処理方法を制御するのに役立つ。 パケットの宛先を参考にしてそれを次にどこへ飛ばすかを決めるのだ。
ルーティングテーブル自体はメモリ上にあるらしい。 確認するには以下のコマンドを打つといい。

# route -n

-n をつけると、IPアドレスの名前解決をさせないようにできる。

どのようなルーティング規則にするかを考えなければならない。 とはいえ、筆者の家のネットワーク構成がそれほど複雑ではないため、それほど難しくはない。

  1. 家庭内のネットワーク(192.168.0.0/24)にあるホストへパケットを飛ばす際はブロードキャスト(FF:FF:FF:FF:FF:FF)を使い、返事をしてきたホストに送る。 つまり、イーサネットをそのまま使うのだ。
  2. それ以外の宛先にパケットを送る際はゲートウェイ(デフォルトゲートウェイ)192.168.0.1/24に送り、代わりに届けてもらう。

という風にする。

ルーティングテーブルに経路を追加/削除するにはrouteコマンドを使う。

route add -net ネットワークアドレス netmask ネットマスク gw ゲートウェイ dev デバイス

デフォルトゲートウェイとして 192.168.0.1 を指定するには以下のようにした。

# route add -net 0.0.0.0 netmask 0.0.0.0 dev eth0 gw 192.168.0.1

これで、自ネットワーク以外の宛先へパケットを送る際には192.168.0.1に送るようになった。 ゲートウェイ(モデム ルータタイプ)側ではIPマスカレードにより、ローカルIPを伏せて代わりに通信をしてくれるので、パソコン側にこれ以上の設定をする必要はないはずだ。
最終的にルーティングテーブルは以下のようになった。

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0

そういえば、ループバックアドレスはどこへ行ってしまったんでしょうね?(ぉ

Winのネットワーク設定
Win系ではマニュアルをもとにCD-ROMからNICのドライバをインストールすれば楽だろう。 マイコンピュータを右クリックし、プロパティだかを選ぶと、パソコンのシステム画面が出たと思う。 その中の左から2番目のタブをクリックし、デバイスの接続状況を見る。 NICがうまくインストールされているかどうか(アイコンに?マークや×マークが付いていない)、さらにプロパティを開けてみて、そのNICデバイスに使用可能のチェックマークが入っているかを確認したい。
うまくインストールされていなければ、デバイスドライバの削除/再インストールをしなくてはならない。
使用可能のチェックマークが入っていなければチェックをいれなくてはならない。

ネットワークの設定はDebianと同じで、

  1. 家庭内のネットワーク(192.168.0.0/24)にあるホストへパケットを飛ばす際はブロードキャスト(FF:FF:FF:FF:FF:FF)を使い、返事をしてきたホストに送る。 つまり、イーサネットをそのまま使うのだ。
  2. それ以外の宛先にパケットを送る際はゲートウェイ(デフォルトゲートウェイ)192.168.0.1/24に送り、代わりに届けてもらう。

のようにすればいい。 唯一 異なるのは各々のホストパソコンに名乗らせるIPアドレスだけだろう。
手順はだいたい次のようになった

  1. コントロールパネルを開き、ネットワークをダブルクリック
  2. TCP/IP→(使っているNICの名前)を選択し、プロパティボタンをクリック
  3. IPアドレスタブを開け、「IPアドレスを指定」にチェックをし、割り振りたいIPアドレスを書きこむ
  4. ゲートウェイタブを開け、ゲートウェイのIPアドレス(192.168.0.1)を書きこみ、追加ボタンをクリック
  5. WinME機のみの設定
    DNS設定タブを開け、「DNSを使う」にチェックをし、ゲートウェイのアドレス(192.168.0.1)を書き込む。 ホスト名も(適当に)書かなければならない。
    WinMEでは、この設定がないと名前解決をちゃんとやってくれなかった。
  6. OKボタンを押して、ダイアログを全部閉じようとすると「再起動しますか」などと恐ろしいことを聞かれるので、言う通りにする

あとはコントロールパネル→ネットワークオプション→接続タブあたりに残っている、今まで使っていたISDNでの設定を消し、ダイアルしないでLANから繋がせるようにすればいい。

クリックマンセーである。

Ping打!
物理的にホスト同士をハブで繋いだら、 自ネットワークの全てのホスト(自分自身も含め)に向けpingを打ちあってみて、返事がちゃんと返ってくるか確かめよう。
pingコマンドはLinuxにもWinにも入っているはずだ。
もちろん、WindowsではMS-DOSプロンプトを使ってコマンドを打とう。 LinuxでもWinでも以下のようにpingの引数に宛先を指定すればいい。 Linux版では Ctrl-c を押して止めないと延々 ping を送出し続けるので気をつけよう。

# ping 192.168.0.1
# ping 192.168.0.2
# ping 192.168.0.3
# ping 192.168.0.4
# ping 192.168.0.255

自ネットワーク192.168.0.0/24内のホストに向けてpingを打っているのに、ゲートウェイを抜けて外に出てしまった、なんてことは絶対にないようにしたい。
自ネットワーク内で全ホスト同士がちゃんとpingを受け取り合うことができれば、次に外のインターネットワーク上のホストに向けて打ってみよう。

以下の例は www.google.com へ ping を打つときの例である。

# ping 216.239.33.101
# ping www.google.com

なお、traceroute(tracertコマンド)も有用だ。 これは経路の途中に通過したルータを表示してくれる。
こちらはWin用のものしか試したことはない。 Linux用もあるらしい。
Win用のtracertコマンドはpingコマンド同様に以下のようにして使う。

> tracert 216.239.33.101



ネットワークインターフェースの定義を起動時に自動的に行う方法。
/etc/network/interfaces というファイル内にネットワークインターフェースの設定をまとめて書いておくことができる。 /etc/init.d/networking が起動時に実行されれば、このファイルの設定を行ってくれる。
以下に例をあげる。

auto lo eth0                    #自動起動の定義
iface lo inet loopback          #loインターフェースにloopback127.0.0.1を定義
iface eth0 inet static          #eth0インターフェースに
        address 192.168.0.4     #  静的なIPアドレスを定義
        network 192.168.0.0     #  ネットワークアドレスを定義
        broadcast 192.168.0.255 #  ブロードキャストアドレスを定義
        netmask 255.255.255.0   #  ネットマスクを定義
        gateway 192.168.0.1     #  ゲートウェイのアドレスを定義

もしスイッチングハブではなく、ダムハブ(バカハブ)を買っていれば、家庭内でネットワークスニファ(監視)ができた。 今思うと残念でならない。
ちなみに最近、週K文春で「ねっとわーくすにふぁ怖イヨ怖イヨ怖イヨプぷらいべーとナめーるモうぇぶモミーンナ丸見エダヨヽ(`Д´)ノウワーン」みたいに(なんと11/7から2週連続で)掲載していた。
ある意味、「パケットなんだから、見えて当り前」だ、と納得。 全く見えなかったら相手に届かないしね☆

参考文献
Linuxルータの導入とネットワークの設計
トニー・マンシル著
河村政雄訳
ピアソンエデュケーション出版

整然と設置されていると第三者が触ったりいじってみようという気を起こしづらいので、ルータは整然と設置すべきだ とまで書いてあるシステム管理者向けの面白い本。 システム管理者って大変だ。
学校図書室で発見。N教授の本のそばにあった。(ワラ