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をインタフェースごとに起動する
ルーティングテーブルを確認する
ルーティングテーブルは、おおむね次のような内容です。
# /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」のように特定できるネットワークであれば、その経路を設定することができますが、同じインターネットではこういった設定は無理です。結局、通常のルーティングテーブルの編集だけでは対応できない状況です。
|