next up previous contents
Next: 3.3.1 IP forwarding Up: 3. ルーティング Previous: 3.2 ルーティングとネットマスク

3.3 静的ルーティング

FreeBSD でルーティングのテーブルを見るには、/usr/bin/netstat コマンドを 使います。

# netstat -rn
Routing tables

Internet:
Destination        Gateway           Flags  Ref   Use   Netif  Expire
default            10.16.128.254     UGSc     3     0   rl0
10.16.128/24       link#1            UC       0     0   rl0
10.16.128.101      0:40:5:17:64:73   UHLW     0   324   rl0   945
10.16.128.254      0:0:c:7:ac:21     UHLW     3     0   rl0   433
127.0.0.1          127.0.0.1         UH       0     3   lo0
192.168            link#2            UC       0     0   dc0
192.168.0.150      link#2            UHLW     3   417   dc0
202.11.96.16/28    10.16.128.10      UGSc     0     0   rl0
(途中までを表示しています。実際には、IPv6 のルーティングテーブルも 表示されます。Internet6: から始まる表です。)

ここで、Destination の欄は、宛て先のネットワークまたはホストをあらわして います。 例えば、最後の行の 202.11.96.16/28 は、28bit のマスク値を持つサブネットワークを表しており、 そのネットワークに行くには10.16.128.10のゲートウェイ(Gateway)を通る事が 次のFlagsの欄の G フラグが立っていることから分かります。

Flags の意味    
U Up 使用可能
H Host 一つのホストのみに到達可能
G Gateway 別のネットワークに行くために Gateway を通過する
D Dynamic ICMP redirect によって経路が時動的に変更された
S Static 手動で経路が追加された

(その他、FreeBSDには多くのフラグがありますが、詳しくは man route を参照 してください。) 一方、default は、上記以外のネットワークまたはホストへ行く場合は、 10.16.128.254 に転送する事を示しています。 10.16.128 は 24bit のマスク値を持っており、更にrl0でlink が生成されて いるので、自分のインターフェース(rl0)を使って直接到達出来る事が分かります。

ちなみに、FreeBSDでは同一ネットにホストを検知すると(ARPで調べた場合)、 それも netstat で表示されます。その際に、Gateway欄にはMACアドレスが 表示されるようになっています。

最後に、127.0.0.1 はループバックアドレスで、常に自分自身を意味しています。

自分のマシンに実装されているインターフェースとインターフェース名との対応は、 そのインターフェースに振られたIPアドレスを介して、/etc/hostsによって 関係づけられています。インターフェースの設定状態は ifconfig コマンドで 見ることが出来ます。

fxp0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::290:27ff:fe51:c128%fxp0 prefixlen 64 scopeid 0x1
        inet 10.16.128.16 netmask 0xffffff00 broadcast 10.16.128.255
        ether 00:90:27:51:c1:28
        media: autoselect (100baseTX <full-duplex>) status: active
        supported media: autoselect 100baseTX <full-duplex> 100baseTX
                                   10baseT/UTP <full-duplex> 10baseT/UTP
sk0:  flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::290:27ff:fe61:cb05%fxp0 prefixlen 64 scopeid 0x1
        inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
        ether 00:90:27:61:cb:05
        media: autoselect (100baseTX <full-duplex>) status: active
        supported media: autoselect 100baseTX <full-duplex> 100baseTX
                                   10baseT/UTP <full-duplex> 10baseT/UTP
lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
gif1: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
gif2: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
gif3: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x7
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
sl0: flags=c010<POINTOPOINT,LINK2,MULTICAST> mtu 552
faith0: flags=8000<MULTICAST> mtu 1500

これを見ると、fxp0 のインターフェースのIPアドレスは10.16.128.16で、 ネットマスクが 0xffffff00(255.255.255.0)であり、ブロードキャストアドレス は10.16.128.255 であることが分かります。更に、sk0があり、それらの アドレスなども分かるでしょう。その他のインターフェースについては今の場合 関係ありません(fwe0 は FireWire つまり、IEEE1394です)。

外部に到達するための出入り口が1箇所しかないような単一のネットワークならば、 その出入り口を default gateway に指定しておけばいいでしょう。一方、出入り口 へ到達するために、幾つかの内部のネットワークを経由する必要がある場合には、 そのセグメントの出入り口を gateway に指定しなければなりません。そして、 出入り口に指定されたマシンまたはルーター上でも、必要な経路情報を指定する 必要があります。 (動的な経路選択には本講義の最後で取り扱います。効率の点から言うと 全てを動的に行うよりも、静的なルーティングと組み合わせるのが一般的です。)

ホストが静的に一つのgatewayをdefaultとして記憶している場合でも、 そのdefault router に新しいルーティング・テーブルを設定すれば、その default router がクライアントホストに新しいgatewayをICMP redirect を 使って指示してくれます。つまり、少し効率は悪いですが、通常のホストに static に default router を覚えさせても(例えばDHCPで配っても)、一時的な ルーティング変更には耐えることが出来るわけです。

FreeBSDで、静的な経路情報の設定を行うには、/usr/sbin/route コマンドを使います。 例えば、10.0.0.0 のネットワークに行くために、10.16.128.101 の gateway に 投げる場合には、次のように設定します。

route add -net 10.0.0.0 10.16.128.101

(但し、この例はクラスフルルーティングとして解釈されるので、意図した通り には動作しません。)

一般の書式は次の通りです。

route add -net destination gateway

静的なルーティングで、他の router を経由して、サブネットに行く場合で、 サブネット毎に router が違うような場合は destination にサブネット であることを明示するために -netmask オプションをつける必要が あります。

route add -net 202.11.96.16 -netmask 255.255.255.240 10.16.128.101

上の例では、202.11.96.16/28 のサブネットに行くために、10.16.128.101 を 通っていく事を示しています。このサブネットの指定を忘れると、 netstat -rn コマンドで見た時に、 マスク値がDestinationに表示されないので直に分かります。

なお、FreeBSDでは netmask オプションでの設定(多くのUnixで共通です)以外に、 / を用いたマスク長による指定方法があるので、少し楽が出来ます。

route add -net 202.11.96.16/28 10.16.128.101

これらのルーティングがブート時に反映されるためには、/etc/rc.conf に以下の ような記述が必要です。

static_routes="0 1"
route_0="-net default 10.16.128.254"
route_1="-net 202.11.96.16/28 10.16.128.101"

すぐに分かるように route_0, route_1 の内容が直接 route コマンド に渡されているだけです。

デフォルトルータだけの設定の場合には、defaultrouterに記述しておけば、自動的に 設定されます。

defaultrouter="10.16.128.254"      # Set to default gateway (or NO)

defaultrouter は慣例的な名前で、実際には常に一致する宛先の意味で、それは 具体的には 0.0.0.0/0 の意味です。ちなみに、ルーティングの経路選択に おいては、最長一致で比較されます。つまり、宛先のマスク長が長いものから マッチするというルールになっています。最も長いマスク長は32bitですから、 例えば 10.16.128.20/32 という宛先は 10.16.128.20 に同一で あるときにマッチします。従って、192.168.1.0/24という表記と、 192.168.0.0/16 があり、パケットのデスティネーションが 192.168.1.1 であったならば、192.168.1.0/24 がマッチする訳です。 こうして、マスク長が長いものから検査され、最終的に全てのディスティネーション がマッチするのが、マスク長0の defaultrouter になるという訳です。

これらの設定は起動時に /etc/rc.d/routing スクリプトで処理されています (なお、/etc/default/rc.conf では defaultrouter は "NO"に設定されています。)

route コマンドでは、ネットワークへの経路だけではなく、特定のホストへの ルーティングを指定することも出来ます(実際には /32 というネットマスクの 指定と同じです)。

route add -host destination gateway

この場合、このホストへ行くときだけは、指定された経路を通るように出来ます。 設定した経路情報を削除する場合は、add の代わりに delete を使います。




next up previous contents
Next: 3.3.1 IP forwarding Up: 3. ルーティング Previous: 3.2 ルーティングとネットマスク
Noriyo Kanayama