大橋のページ

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をインタフェースごとに起動する

8 ipコマンドを使ってルーティングテーブルを編集する

ipコマンドを使ってルーティングテーブルを編集する

続いてルーティングテーブルの編集を始めますが、カーネルをコンパイルしなおすとルーティングテーブルが複数持てるようになり、従来のような送信先アドレス(宛先アドレス=destination)から判断されるルーティングのルールだけでなく、送信元アドレス(source)から判断するソースルーティングや、インタフェースを指定したルーティングのルールが適用できるようになっています。

# /sbin/ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup 253

のように「local」「main」「253」というように3段階のテーブルをデフォルトで持つようになっています。「253」は、本来「default」と表示されますが、「default gateway」を設定しないようにしてしまったため、数値で表示されています。「default gateway」の設定されている環境では、「default」と表示されるでしょう。

ルーティングテーブルは、255個持てるようで(未確認)、「local」が255、「main」が254ときて、「default」が253となっているようです(未確認)。テーブルは先頭の数値(pref)で順番に評価されてゆくようになっているようで、当然「local」の0が最優先され、「local」は消去することもできません。

ここでは、「main」と「default 253」にもルーティング情報を持たせないようにして(「/sbin/ip rule del table main」や「/sbin/ip rule del table 253」で削除することもできます。ただし、「main」は削除しないほうが安全です)、テーブル「1」に最優先するLAN側(192.168.1.0/24)からのパケットをルータA(210.160.79.97)に渡すというルールを作って、localの次に優先すべきルールとします。

その次がテーブル「2」で、ルータB(210.163.168.145)から届いたパケットすべて(0.0.0.0/0=0/0)をルータBから返すというルールを設けます。

最後(テーブル「3」)が、それ以外のすべてのパケット(0.0.0.0/0)をルータAから返すというルール設定にします。

# ip route add 0/0 via 210.160.79.97 table 1
# ip rule add from 192.168.1.0/24 table 1 pref 32900
# ip route add 0/0 via 210.163.168.145 table 2
# ip rule add from 210.163.168.144/28 table 2 pref 32901
# ip route add 0/0 via 210.160.79.97 table 3
# ip rule add from 0/0 table 3 pref 32902

「ip rute add」でルーティングルールの設定をし、それにテーブルとしての名前を付けます。

# ip route add 0/0 via 210.160.79.97 table 1

は、送信先(宛先)アドレスが「0/0」であるパケットを、「210.160.79.97」をルータとして送り出すルールを「1」という名前のテーブルで定義しています。

# ip rule add from 192.168.1.0/24 table 1 pref 32900

「ip rule add」では、「192.168.1.0/24」から届いたパケットは、テーブル「1」のルールに従って処理するように定義しています。「pref 32900」はそのルールが何番目のルールかを表わす数値です。

3つのルーティングの仕方とルールを定義すると次のようになります。

# /sbin/ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup 253
32900:  from 192.168.1.0/0 lookup 1
32901:  from 210.163.168.144/0 lookup 2
32902:  from all lookup 3

(ここでは、「pref 3290x」を使って、「main」「default」のあとに定義していますが、「3275x」などと定義して、「main」より前に配置すれば、「main」より前に評価されるのではないかと思われます。また、「table 1」と「table 3」の内容が同じであるため、「table 3」を定義しないで、「ip rule add from 0/0 table 1 pref 32902」とすればいいのではないかと思われます。)

ルーティングテーブルの編集が終わったら、期待どおりの結果になっているかどうかを確認します。確認は、pingを使ってIPアドレスあてに行ないます。

  • そのマシンから自身の各インタフェースあてにpingしてみます。
  • 内部LAN側にあるマシンに対してpingしてみます。
  • ルータAにあててpingしてみます。
  • ルータBにあててpingしてみます。
  • インターネット側にある外部ホストのIPアドレスにpingしてみます。

このとき(「-c 4」は回数を指定)

# ping -c 4 192.168.1.32
PING 192.168.1.32 (192.168.1.32) from 192.168.1.1 : 56(84) bytes of data.
64 bytes from 192.168.1.32: icmp_seq=0 ttl=32 time=0.5 ms
64 bytes from 192.168.1.32: icmp_seq=1 ttl=32 time=0.4 ms
64 bytes from 192.168.1.32: icmp_seq=2 ttl=32 time=0.4 ms
64 bytes from 192.168.1.32: icmp_seq=3 ttl=32 time=0.4 ms

--- 192.168.1.32 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.4/0.4/0.5 ms
#

「from 192.168.1.1」とあるのをそれぞれ確認します。とくに、外部ホスト宛てのときは、期待通りのインタフェースから発せられているかどうかを確認します。

# ip route add 0/0 via 210.160.79.97 table 3
# ip rule add from 0/0 table 3 pref 32902

で設定したルータを経由しているはずです。

次に、インターネット側にある外部のホストから、そのマシンのグローバル空間側のIPアドレスに対してpingしてみます。実際に行なうには、

  • 知人にやってもらう
  • ダイヤルアップ接続して、プロバイダー側から自分で行なう
  • インターネットサイトにあるpingのできるページを使う

などの方法があります。

いずれのテストでもpingが帰ってくれば、成功です。名前解決ができるマシンなら、ホスト名でpingしてみて確認すれば万全です。

「ip route」のヘルプ。

# /sbin/ip route help
Usage: ip route { list | flush } SELECTOR
       ip route get ADDRESS [ from ADDRESS iif STRING ]
                            [ oif STRING ]  [ tos TOS ]
       ip route { add | del | replace | change | append | replace | monitor } RO
UTE
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
            [ table TABLE_ID ] [ proto RTPROTO ]
            [ type TYPE ] [ scope SCOPE ]
ROUTE := NODE_SPEC [ INFO_SPEC ]
NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]
             [ table TABLE_ID ] [ proto RTPROTO ]
             [ scope SCOPE ] [ metric METRIC ]
INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]...
NH := [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS
OPTIONS := FLAGS [ mtu NUMBER ] [ rtt NUMBER ] [ window NUMBER ]
           [ realms REALM ]
TYPE := [ unicast | local | broadcast | multicast | throw |
          unreachable | prohibit | blackhole | nat ]
TABLE_ID := [ local | main | default | all | NUMBER ]
SCOPE := [ host | link | global | NUMBER ]
FLAGS := [ equalize ]
NHFLAGS := [ onlink | pervasive ]
RTPROTO := [ kernel | boot | static | NUMBER ]

「ip rule」のヘルプ。

# /sbin/ip rule help
Usage: ip rule [ list | add | del ] SELECTOR ACTION
SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK ]
            [ dev STRING ] [ pref NUMBER ]
ACTION := [ table TABLE_ID ] [ nat ADDRESS ]
          [ prohibit | reject | unreachable ]
          [ realms [SRCREALM/]DSTREALM ]
TABLE_ID := [ local | main | default | NUMBER ]

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