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 ]
|