NICの認識、ネットワークの設定

作成:

さて、ずいぶん長いことかかって、やっとネットワークに関することをやることになりました。

まず簡単に今想定しているネットワークについて説明します。
右の図のような構成を取っていて、家庭内LANとインターネットの間にサーバーが入る形になります。
内側のLANはプライベートIPアドレスを用い、サーバーでIPマスカレードをして外部に接続できるようにする予定です。
私の回線はフレッツADSLですが、これをインターネットにつなげるプロトコルがPPPoEです。 簡単にいうと、PPPの認証機能を使ってユーザがNTTの収容局を経由しISPにつなげます。 そして、認証が成功すると上位層からはイーサネットケーブル→ADSLモデム→電話回線→専用回線(?)というつながりが 一本のデータリンクでつながっているように扱えるという代物。
インターネット側のIPアドレスは接続のたびに動的に割り当てられます。
固定IPは現在のISPだとやってないし、やってたとしても無駄に高いので趣味でやるにはちょっと手が出ません。
まあ、ちょっとややこしいけど何とかできるので、動的IPアドレスでやっていきます。

ネットワーク初心者なので間違ってることに気がつかれた方はツッコミよろしく。
あと、セキュリティー上ばらしちゃいけないよって情報を書いてたりするかも知れませんので親切な方お願いします。(笑)

NICのドライバインストール

まずは、NICの認識です。
メジャーで枯れた(長い間使われている)チップを搭載したNICの場合は自動的に認識してくれるます
私の場合VIAのメジャーなチップでドライバモジュールもVine Linuxに標準で用意されているものな訳ですが、 このドライバモジュールvia-rhineは実はカーネル2.2系に用意されているものは 非常に古いモジュールでメンテナンスされていないものらしく、 Xのツールで(今回は使いませんが)、ディフォルトでは選択できないように設定されているぐらいで、 うまく動かないんだそうです。

しかし、パッケージにLinux Readyと書かれているのは伊達ではなく、 ちゃんとドライバフロッピーの中にLinux用のドライバが用意されているのです。
では、こいつをインストールしてNICを使えるようにしましょう。

まずはフロッピーをマウントして適当なディレクトリへドライバに関係するファイルをコピーします。

# mkdir /root/tmp
# mount -t msdos /dev/fd0 /mnt/floppy/
# cp /mnt/floppy/linux/* /root/tmp/
# cd /root/mnt/
# ls -l
合計 64
-r-xr-xr-x    1 root     root         3653 Jun  2 02:52 linux.txt
-r-xr-xr-x    1 root     root           71 Jun  2 02:52 trans
-r-xr-xr-x    1 root     root        51798 Jun  2 02:52 viarhine.c
  

さて、「ls -l」を実行したとき、このようにtransの矢印がある列にxという文字が書かれているかを確認します。 これは実行可能ファイルであることを示しています。
実際はただ「ls」として文字が緑色になっていることを確認するだけでいいです。 「ls --color」としないといけないんだけど、はじめからlsは「ls --color」のエイリアスに設定してあるのでこうなる)
もし、そうでない場合は

# chmod +x trans

とします。
このtransというファイルの正体は単純なシェルスクリプトです。
内部では単純にgccに適当なオプションを指定してviarhine.cをコンパイルするだけのものです。

# ./trans
# ls
linux.txt  trans  viarhine.c  viarhine.o
# cp viarhine.o /lib/modules/2.2.19-r0/net/
# insmod viarhine

transを実行するとviarhine.oというオブジェクトファイルができています。
これがドライバモジュールです。
そして、これを/lib/modules/2.2.19-r0/net/へ持っていきます。
2.2.19-r0というのはカーネルのリビルドで説明した現在のカーネルバージョンです。 適宜読み替えてください。 (このモジュールは現在のカーネル専用ですので、 カーネルを更新した場合、再度ビルドを行わないといけません)
このディレクトリはカーネルのリビルドで作成されたローダブルモジュールのうち ネットワーク関連のモジュールが格納されている場所です。
ここへ持っていった後はinsmodコマンドでこのローダブルモジュールをカーネルへインストールします。

さて、これでドライバモジュールのインストールは終了したわけですが、 これだけでは使えません、次に、デバイスに対するドライバモジュールの指定を行います。

これには、/etc/conf.modulesを編集します。
この中にはあらかじめ何か書かれている場合もあり、何も書かれていない場合もありますが、 ともかく、この中に以下の内容を追加します。

alias eth0 viarhine
alias eth1 viarhine

この書式は「alias <デバイス名> <ドライバモジュール名>」です。
eth0はイーサネットデバイスの0番目とかいう意味です。
2枚NICが差さっている場合どちらが0番目になるのかはよく分かりませんが、 私の場合PCIスロットが上のデバイスが0番目になっていました。IRQの若い順でしょうか?

ネットワークの設定

次は、ネットワークの設定を行います。
まず、ここで編集するのは/etc/sysconfig/networkです。
このファイルははじめは以下のようになっていると思います。

NETWORKNG=yes
HOSTNAME=localhost.localdomain

NETWORKINGはネットワークを使うか否かを指定します。これは当然yesですね。
HOSTNAMEはホスト名を指定します。
他に指定できるのは、
FORWARD_IPV4、IPマスカレードを使用するか否か
DOMAINNAME、ドメイン名の指定
GATEWAY、ゲートウェイのIPアドレス
GATEWAYDEV、ゲートウェイにつながっているデバイスの名前
などが指定できます。

NETWORKNG=yes
FORWARD_IPV4=yes
HOSTNAME=www2.mm2d.net
DOMAINNAME=mm2d.net

私の場合このようにしました。
ゲートウェイのIPアドレスですが、これは外側のNICのIPアドレス、 もしくはISPルータのIPアドレスですが不明なので書いていません。 またデバイスについても、確かPPPoEの接続では別のデバイス名になったと思うのでとりあえず指定しないままです。 (そこの設定はADSLの接続ソフトがやってくれる)
ここのドメインですが、私の入っているISPの@niftyが新たに始めたサービス、 ダイナミックDNSで取得したドメインです。
ホスト名については適当です。

2002/10/05 niftyのDDNSをやめて Earth Dynamic Domain Serverに乗り換えました。 (日本人経営つまり日本語、しかも無料、ワイルドカードが使用可能といいことずくめ、 定期的に更新しないと削除されちゃうけど、無料サービスだから当然の措置です) これまでのblue.atnifty.comはアクセスできなくなります。 場合によっては他の利用者がこのドメインを利用する可能性があります。

2003/06/16 さらにドメイン変更 Value Domain.comにて正式にドメインを購入しました。 日本語でやりとりできるレジストラの中ではおそらく最安値。
購入したドメインは mm2d.net です。 ホスト名 www はホスティングサービスに利用しているので自宅サーバには home www2 ftp2 等を割り当てました。

次に、各デバイスの設定です。
これは、/etc/sysconfig/network-scripts/に設定用のファイルを作成します。
eth0はifcfg-eth0、eth1はifcfg-eth1というファイルで設定します。 このファイルはあらかじめ用意されていないと思うので自分で作成します。 (すでにインストール時にNICの設定を行っている場合は当然あると思いますが) 作成するファイル名を間違うと読み込んでくれませんので気をつけてください。
たとえば、ifcfg-eth0はこのようにします。

DEVICE=eth0
IPADDR=192.168.2.1
NETMASK=255.255.255.0
NETWORK=192.168.2.0
BROADCAST=192.168.2.255
ONBOOT=yes
BOOTPROTO=none

DEVICEはデバイス名
IPADDR はこのデバイスに割り当てるIPアドレス
NETMASK はIPアドレスに対するネットマスク
NETWORK はネットワークアドレス
BROADCAST はブロードキャストアドレス
ONBOOT は起動時にデバイスをアクティブにするか否か
BOOTPROTO は起動させる時に使うプロトコル(DHCPを使う場合はBOOTPROTO=dhcpとする)
を設定します。

ネットワークアドレスとブロードキャストアドレスは IPアドレスとネットマスクがあれば分かるので、ここで指定しなくても全く問題ありません。
また、eth0はインターネット側のデバイスなので手動でIPアドレスを設定したりはしないのですが、 動作テストをするためにこのように設定しました。
同じ要領でifcfg-eth1作成します。

さて、これで準備は整いました。
ネットワークをリスタートさせます。

# /etc/rc.d/init.d/network restart
Shutting down interface eth0                               [  OK  ]
Shutting down interface eth1                               [  OK  ]
Setting network parameters                                 [  OK  ]
Bringing up interface lo                                   [  OK  ]
Bringing up interface eth0                                 [  OK  ]
Bringing up interface eth1                                 [  OK  ]

このようにOKと表示されれば成功です。

確認

では、実際に設定がどうなっているのか見てみましょう。

# ifconfig -a
eth0      リンク方法:イーサーネット  ハードウェアアドレス 00:90:CC:08:6B:40
          inetアドレス:192.168.2.1 ブロードキャスト:192.168.2.255 マスク:25
5.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:100
          割り込み10 ベースアドレス:0xe400

eth1      リンク方法:イーサーネット  ハードウェアアドレス 00:90:CC:08:6B:2D
          inetアドレス:192.168.1.1 ブロードキャスト:192.168.1.255 マスク:25
5.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:100
          割り込み12 ベースアドレス:0xe800

lo        リンク方法:ローカルループバック
          inetアドレス:127.0.0.1マスク:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:3924  Metric:1
          RXパケット:6 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:6 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
# netstat -r
カーネルIP経路テーブル
受信先サイト    ゲートウェイ ネットマスク   フラグ  MSS Window  irtt インタ
ーフェース
192.168.2.0     *            255.255.255.0   U        0 0          0 eth0
192.168.1.0     *            255.255.255.0   U        0 0          0 eth1
127.0.0.0       *            255.0.0.0       U        0 0          0 lo

と、しっかり設定されています。
次に、実際に通信が可能かどうか確認します。
それぞれのインターフェイスにLANケーブルをさして、もう1台のWindowsマシンに対してpingを打ってみます。
ただし、当然のことですが上のルーティングテーブルを見てもらうと分かりますが、 192.168.2.xxのIPアドレスを指定するとeth0を、 192.168.1.xxのIPアドレスを指定するとeth1を使って通信します。
そこで通信テスト相手のマシンのIPアドレスを、 eth0のテストのときは192.168.2.2、eth1のテストのときは192.168.1.2にしてテストしました。

# ping -c4 192.168.2.2
PING 192.168.2.2 (192.168.2.2) 送信元 192.168.2.1 : 56(84) bytes of data.
64 バイト応答 送信元 192.168.2.2: icmp_sec=0 ttl=128 時間=288 マイクロ秒
64 バイト応答 送信元 192.168.2.2: icmp_sec=1 ttl=128 時間=120 マイクロ秒
64 バイト応答 送信元 192.168.2.2: icmp_sec=2 ttl=128 時間=141 マイクロ秒
64 バイト応答 送信元 192.168.2.2: icmp_sec=3 ttl=128 時間=154 マイクロ秒

--- 192.168.2.2 ping 統計 ---
送信パケット数 4, 受信パケット数 4, パケット損失 0%
Round-Trip 最小/平均/最大/mdev = 0.120/0.175/0.288/0.067ミリ秒
# ping -c4 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 送信元 192.168.1.1 : 56(84) bytes of data.
64 バイト応答 送信元 192.168.1.2: icmp_sec=0 ttl=128 時間=336 マイクロ秒
64 バイト応答 送信元 192.168.1.2: icmp_sec=1 ttl=128 時間=164 マイクロ秒
64 バイト応答 送信元 192.168.1.2: icmp_sec=2 ttl=128 時間=154 マイクロ秒
64 バイト応答 送信元 192.168.1.2: icmp_sec=3 ttl=128 時間=152 マイクロ秒

--- 192.168.1.2 ping 統計 ---
送信パケット数 4, 受信パケット数 4, パケット損失 0%
Round-Trip 最小/平均/最大/mdev = 0.152/0.201/0.336/0.079ミリ秒

という具合に、通信成功!!