大橋のページ

iproute2+tcを使って1台で複数インターネット接続

1 複数のインターネット接続
2 インタフェースとルーティングテーブル
3 ifconfigとrouteコマンド
4 Linuxカーネルのコンパイル 1
5 Linuxカーネルのコンパイル 2
6 iproute2+tcのインストール
7 ipコマンドでインタフェースの登録
8 ipコマンドでルーティング設定
9 namedをインタフェースごとに起動する
10 sendmailをインタフェースごとに起動する

3 ifconfigとrouteコマンド

ルーティングテーブルを確認する

ルーティングテーブルは、おおむね次のような内容です。

# /sbin/route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
255.255.255.255 *               255.255.255.255 UH    0      0        0 eth0
210.160.79.96   *               255.255.255.240 U     0      0        0 eth1
210.163.168.144 *               255.255.255.240 U     0      0        0 eth2
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
127.0.0.0       *               255.0.0.0       U     0      0        0 lo
default         210.160.79.97   0.0.0.0         UG    0      0        0 eth1

「Destination」は「目的地」つまり宛先のネットワークあるいかホストが表示されています。ホストの場合には、Genmask(ネットマスク)が「255.255.255.255」になっていて、Flagsに「H」が付いています。ネットワークの場合には、Genmaskが「255.255.255.0」とか「255.255.255.240」とか「255.0.0.0」「0.0.0.0」のようにネットワークを表わす数値になっています。

「Gateway」は、Destinationで指定されたネットワークまたはホストにパケットを届けるときに利用するゲートウェイの指定です。「*」と表示されているときは、デフォルトゲートウェイが使われます。

「Genmask」はネットマスクの意味です。

「Flags」はそのルーティングの状態を表わしています。「U」は利用可能であること、「H」はホストであること、「G」はゲートウェイであることまたはゲートウェイが指定されていることを表わしています。

「Metric」は、指定したゲートウェイまでにいくつのゲートウェイを経由するか(ホップ数)を表わしています。ゲートウェイXに到達するまでに、3つのゲートウェイを経由しなければならない場合にはMetricは3になります。

「Iface」はインタフェース名が表示されます。「lo」は「loopback interface」の略でループバックインタフェースです。

先頭行の「255.255.255.255 * 255.255.255.255 UH 0 0 0 eth0」は、IPマスカレードを設定しているために表示されています。

ifconfigコマンドを使う

ルーティングテーブルの閲覧・編集とは別に、各インタフェースの設定はifconfigコマンドを使って行ないます。「/etc/sysconfig/netowrk」や「/etc/sysconfig/network-scripts/ifcfg-eth*」に正しく設定されていれば、起動時に設定が終了していますが、起動後に変更したり、仮想的にIPアドレスを割り当てる(IPエイリアス)機能を使うときにこのipconfigコマンドを使います。

# /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 00:40:D0:00:0A:5D
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MTU:1500  Metric:1
          RX packets:5879 errors:0 dropped:0 overruns:0 frame:0
          TX packets:558 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          Interrupt:9 Base address:0x6400

eth1      Link encap:Ethernet  HWaddr 00:90:CC:00:78:A5
          inet addr:210.160.79.98  Bcast:210.160.79.111  Mask:255.255.255.240
          UP BROADCAST RUNNING MTU:1500  Metric:1
          RX packets:4221 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1834 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          Interrupt:10 Base address:0x6500

eth2      Link encap:Ethernet  HWaddr 00:90:CC:02:07:8B
          inet addr:210.163.168.151  Bcast:210.163.168.159  Mask:255.255.255.240
          UP BROADCAST RUNNING MTU:1500  Metric:1
          RX packets:2870 errors:0 dropped:0 overruns:0 frame:0
          TX packets:30 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          Interrupt:11 Base address:0x6600

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:3924  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0

eth0を見てみます。

eth0      Link encap:Ethernet  HWaddr 00:40:D0:00:0A:5D
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MTU:1500  Metric:1
          RX packets:5879 errors:0 dropped:0 overruns:0 frame:0
          TX packets:558 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          Interrupt:9 Base address:0x6400

「HWaddr 00:40:D0:00:0A:5D」はこのインタフェースのハードウェアアドレス(MACアドレス)を、「inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0」は、順にIPアドレス、ブロードキャストアドレス、ネットマスクを表わしています。「RX packets:5879 errors:0 dropped:0 overruns:0 frame:0」や「TX packets:558 errors:0 dropped:0 overruns:0 carrier:0」「collisions:0 txqueuelen:100」はパケットの送受信状態を表わしています。ここではとくに「errors:0」「dropped:0」「overruns:0」や「collisions:0」などの値に注意しておきましょう。パケットが正常に送受信されていないと「0」でなく、数字が表示されます。「Interrupt:9 Base address:0x6400」は、インタフェース(ネットワークカード)が使っているIRQ(ここでは9)とメモリのアドレスが表示されています。

ifconfigコマンドを使うには、

# /sbin/ifconfig eth1 210.160.79.99 netmask 255.255.255.240 broadcast 210.160.79
.111

ようにし、「ifconfig <デバイス名> <IPアドレス> netmask <ネットマスク> broadcast <ブロードキャスト>」を入力します。

Linuxでは、IPエイリアスと呼ばれる機能がサポートされていて、物理的には存在しないインタフェースを論理的に割り当てることができます。たとえば、物理的にはIPアドレス「210.160.79.99」として組み込まれている「eth1」しか存在しなくても、論理的に別のインタフェース(たとえば、IPアドレス「210.160.79.100」)として割り当てて使うこともできます。その場合には、「eth1:0」のように、「物理的に存在するデバイス」に続けて「:」+「0から始まる数値」をデバイス名として使います。

# /sbin/ifconfig eth1:0 210.160.7.100 netmask 255.255.255.240 broadcast 210.160.
79.111

IPエイリアス機能を使って割り当てたインタフェースは、ifconfigでは、

# /sbin/ifconfig | more
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Bcast:127.255.255.255  Mask:255.0.0.0
          UP BROADCAST LOOPBACK RUNNING  MTU:3584  Metric:1
          RX packets:85694 errors:0 dropped:0 overruns:0
          TX packets:85694 errors:0 dropped:0 overruns:0

eth0      Link encap:Ethernet  HWaddr 00:C0:0C:B0:8C:AB
          inet addr:192.168.1.3  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:358743 errors:0 dropped:0 overruns:0
          TX packets:306713 errors:0 dropped:0 overruns:0
          Interrupt:4 Base address:0xef80

eth1      Link encap:Ethernet  HWaddr 00:40:05:42:A0:18
          inet addr:210.160.79.99  Bcast:210.160.79.111  Mask:255.255.255.240
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:692492 errors:0 dropped:0 overruns:0
          TX packets:696133 errors:3 dropped:0 overruns:0
          Interrupt:10 Base address:0xec80

eth1:0    Link encap:Ethernet  HWaddr 00:40:05:42:A0:18
          inet addr:210.160.79.100  Bcast:210.160.79.111  Mask:255.255.255.240
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:1324 errors:0 dropped:0 overruns:0
          TX packets:27 errors:0 dropped:0 overruns:0

のように表示されます。「eth1:0」がIPエイリアスで作られたインタフェ−スであるため、「HWaddr」が「eth1」と「eth1:0」で同じであり、「eth1:0」には「Interrupt:10 Base address:0xec80」のようなIRQやメモリアドレスに関する情報がありません。

routeコマンドを使う

ルーティングテーブルを変更(編集)するには、routeコマンドを使います。

routeコマンドでホストを追加するには、

# /sbin/route add -host 210.160.79.98 dev eth1 gw 210.160.79.97

のように「route add -host <IPアドレス> dev <デバイス名> gw <ゲートウェイ>」と入力します。このとき、ゲートウェイやデバイス名も指定することができます。削除するには、

# /sbin/route del -host 210.160.79.98 dev eth1 gw 210.160.79.97

と、「del」を使います。

同様にして、ネットワークを追加するには、

# /sbin/route add -net 210.160.79.96 netmask 255.255.255.240 gw 210.160.79.97

削除するには、

#/sbin/route del -net 210.160.79.96 netmask 255.255.255.240 gw 210.160.79.97

と入力します。「-host」のときには「dev eth1」のようにデバイス名を指定できますが、「-net」のときにはデバイス名は指定できません。

また、オプションの順番を間違えるとエラーが出たり、実行するルーティング環境によってエラーが出ますので注意してください。

routeコマンドでデフォルトゲートウェイを追加するには、次のようにします。

# /sbin/route add default gw 210.160.79.97 metric 0 eth1

と「route add default gw <ゲートウェイのIPアドレス> metric <数値> <デバイス名>」のように入力します。削除するには、

# /sbin/route del default gw 210.160.79.97 metric 0 eth1

のように入力します。

routeコマンドでテーブル編集

iproute2を使ってパケットを制御する前に、通常のifconfigコマンドとrouteコマンドを使った場合、どういった問題が発生するかを確認してみます。

インターネット-------          -------------インターネット
          |          |
          |          |
         ルータA       ルータB
          |210.160.79.97    | 210.163.168.145
          |          |
   210.160.79.98 ------ゲートウェイ---- 210.163.168.151
               | 192.168.1.1
               |
               |
               |
              LAN 192.168.1.0/255.255.255.0

(ゲートウェイは、IPマスカレード機能により、IPアドレスの変換をしている)

上のような構成の場合、ルーティングテーブルは以下のようにおおむねなります。

# /sbin/route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
255.255.255.255 *               255.255.255.255 UH    0      0        0 eth0
210.160.79.96   *               255.255.255.240 U     0      0        0 eth1
210.163.168.144 *               255.255.255.240 U     0      0        0 eth2
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
127.0.0.0       *               255.0.0.0       U     0      0        0 lo
default         210.160.79.97   0.0.0.0         UG    0      0        0 eth1

デフォルトゲートウェイとしてもうひとつ追加することもできます。たとえば、インタフェース「eth2」にデフォルトゲートウェイとして「210.163.168.145」を追加してみると、

# /sbin/route add default gw 210.163.168.145 metric 0 eth2

のように入力します。実際にルーティングテーブルを表示してみると、

# /sbin/route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
255.255.255.255 *               255.255.255.255 UH    0      0        0 eth0
210.160.79.96   *               255.255.255.240 U     0      0        0 eth1
210.163.168.144 *               255.255.255.240 U     0      0        0 eth2
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
127.0.0.0       *               255.0.0.0       U     0      0        0 lo
default         210.160.79.97   0.0.0.0         UG    0      0        0 eth1
default         210.163.168.145 0.0.0.0         UG    0      0        0 eth2

のようになります。これでうまくいきそうですが、実際にはそうなりません。それは、eth1経由から届いたパケットは、その返事のパケットが、デフォルトゲートウェイ(ここではルータA)を経由して送り出されますが、ところがeth2経由から届いたパケットも、その返事のパケットは、eth2−ルータBを経由しないで、eth2からeth1にルーティングされ、同じようにルータAを経由して送り届けられます。ルータA側のパケットフィルタリングで、グローバル空間A側からのパケット以外破棄するように設定していた場合、そのパケットは破棄されてしまいます。かりにルータを通過でき、もともとの送信元に届いたにしても、受け取る側からすれば、まるで違う経路から返事が届くという矛盾が発生してしまいます。いずれにしろ送受信は正常に行なわれません。現象としては、インターネット側からは、ルータB側のサーバは見えないということになります。

なぜそうなるかといえば、ゲートウェイ自身からすれば、本来、ルータA側のネットワークとルータB側のネットワークは、別々のものであるべきなのですが、実際にはインターネットという同じネットワークであるということに無理があります。ゲートウェイを中心に考えれば、「192.168.1.0/255.255.255.0」というネットワークと「210.160.79.96/255.255.255.240」というネットワーク、「210.163.168.144/255.255.255.240」というネットワークの3つのネットワークがあって、それ以外のネットワーク「0.0.0.0/0」がその先にあることになります。ところが、ルータA側のネットワークも、ルータB側のネットワークも、「それ以外のネットワーク」で区別ができません。その結果、先に登録されているデフォルトゲートウェイが適用され、ルータAから送り出されてしまいます。

これが、ルータB側のネットワークが、「192.168.2.0/255.255.255.0」のように特定できるネットワークであれば、その経路を設定することができますが、同じインターネットではこういった設定は無理です。結局、通常のルーティングテーブルの編集だけでは対応できない状況です。

著作権、商標等について (C) 2000 HyperDyne Inc.