[General]iproute2 と複数インターネット接続(2002.1203)

注意書き。

この文章は、やっぱり Debian GNU/Linux(unstable) をベースに書かれています。 RedHat など、他の distribution をお使いの方は、適切に読みかえるなり、 他の文書を当たるなりしてください。

はじめに

私は、もともと IIJ4U を ISP として 使っていたのですが、最近 natcracker を 利用して固定 IP アドレスを得ることができました。 (natcracker で固定 IP を使おう 参照)

210.***.***.a   210.***.***.b
Flets ADSL      natcracker
    |                :
    |PPPoE           :VTun
    |<ppp0>          :<tun0>
    |                :
+-(eth1)------------------+
|        Linux PC         |
+---------(eth0)----------+
            |
            |
       LocalNetwork
       192.168.0.c

しかし、natcracker で紹介されている接続方法では、 default gateway を natcracker への virtual tunnel に変更してしまうため、

通信速度が遅くなる
すべての internet 上の host に対する通信は、 一回 natcracker に到達してから配信されていきます。 network 経路としても遠回りをすることになり、基本的に通信速度が遅くなります。 *1
対外線が IIJ4U と natcracker の二つに依存してしまう
ISP である IIJ4U がサービスを停止している場合には、 natcracker が利用できないのは当然ですが、 default gateway が natcracker へ向いている場合には、 natcracker がサービスの停止をしていると、 internet 自体を利用することができなくなります。 たとえ、IIJ4U を介して internet に接続されていても、です。 *2

しかし、default gateway を IIJ4U に設定したままでは、 natcracker 側との通信をうまく行うことができません。 そこで、ここでは LinuxBox を Advanced router として設定することで、 この問題を解決します。

Advanced router と iproute2

LinuxBox を Advanced router として利用するには iproute2 を用います。 iproute2 は debian package として 登録されている ので、

% apt-get install iproute

とするだけで、install することができます。

また Linux kernel の

という機能を利用しますので、これらを kernel に組み込んでおく必要があります。 *3

iproute2 の使い方

Linux の Advanced router というモードは

の二つの概念から成り立っています。

route というのは今までの routing table と同じものだと思ってかまいません。 source address や destination address などから どこの host に relay すればよいか決定する table を保持しています。 route は設定によっては複数用意することができます。

rule というのは、route を選択するために利用します。 rule には source address や destination address、interface device などを 設定することができ、これらを元に route に振り分けます。

イメージとしては、ipchains のチェインに近いと思います。

iproute2 の使い方

iproute2 を使って Advanced router の設定をするためには、 主に ip コマンドを利用します。 また、一部の設定は今まで通り ifconfig や route を利用して 設定することもできるようです。 *4

route は ip コマンドに route オプションをつけて、

% ip route add 0/0 dev tun0 table 1
% ip route add 192.168.0.0/24 via 172.0.0.1 table 2
% ip route del 210.0.0.0/8 dev ppp1 table 3
% ip route list table 1

のように変更します。 末尾の table n というのは table id で、 1-252 の間で自由に指定することができます。 *5

次に、rule は ip コマンドに rule オプションをつけて

% ip rule add from 0/0 table 1 pref 100
% ip rule add dev ppp0 table 5 pref 101
% ip rule del from 210.0.0.0/8 table 3
% ip rule

のように変更します。 add の直後に分岐条件を記述し、 条件に合った場合に選択する routing table を指定します。 末尾の pref n というのは preference と呼ばれる priority code で、 低いものほど優先的に条件チェックが行われるようです。

他にも ip コマンドは interface device の登録なども行うことができるのですが、 私は利用していませんので割愛します。 *6

実際に設定してみよう

では、実際に設定をしてみましょう。 次のようなルールを考えてみます。

  1. tun0 から入ってきた packet は tun0 を使って返事をする
  2. LocalNetwork への packet は eth0 から出力する
  3. その他の packet は ppp0 を経由で出力する

この場合、2. と 3. は既に通常の routing で設定することができるので、 route コマンドで設定してしまいます。

% route add -net 192.168.0.0/24 dev eth0
% route default gw 210.***.***.***

ここで設定した内容は main table に保存されているので、

% ip route list table main
ip route list table main
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.33
default via 210.***.***.*** dev ppp0

とするとみることができます。

次に、1. の設定をします。まずは route をルールに従って、

% ip route add 0/0 dev tun0 table 1

のように作成します。 そして、この route へ分岐するための rule を

% ip route add 210.***.***.*** table 1 pref 100

という風に作成します。 このとき、rule を main table への参照よりも優先度を高く設定しておくことで、 tun0 から受け取った packet のみを特別に routing することができます。

終わりに。

ここでは iproute2 を使った複数インターネット接続の方法を紹介しました。 事例として、自宅で試してみた PPPoE + natcracker の接続を挙げましたが、 実際には企業などで ATM + ppp などで利用することが多いと思われます。

そういう場所では iproute2 に加えて、 tc を利用した QoS も使っているかもしれません。 これも興味深い題材なので、気が向いたら実験してみたいですね:)

参考にした資料

こういった資料がなかったら、くじけていたでしょう。多大なる感謝を捧げます。


*1 無論、natcracker は通信速度の保証はありません。
*2 routing を IIJ4U に戻せば正しく動作はしますが、非常に面倒です:p
*3 他にも、知らずのうちに設定しているオプションがあるかもしれません。
*4 多くの文書には使わない方がよい、と記述されていますが、うまく組み合わせて使う分には問題ないようです。
*5 0,253-255 は default で利用されている table id です。これらの table を削除するのであれば、利用できます。
*6 やはり、なれている ifconfig を使うのが一番です。