ゲートウェイとルート

原作: &a.gryphon;.6 October 1995.

訳: &a.yuki;.6 September 1996. ある計算機が他の計算機をみつけることができるようにするには, ある 計算機から他の計算機へ, どのようにたどり着くかを適切に記述するた めの仕組みが必要です. この仕組みをルーティングと呼びます. 「ルー ト(経路)」は destination (目的地) gateway (ゲー トウェイ) の 2つのアドレスの組で定義します. あなたが destination へアクセスしようとした場合, gateway を通って送られることをこのペアは示しています. destination には個々のホスト, サブネット, 「デフォルト」の 3つの タイプがあります. 「デフォルトルート」は他への経路が適用できない 場合に使われます. のちほどデフォルトルートについて少し述べること するとして, ここでは, 個々のホスト, インタフェース (「リンク」と も呼ばれます), イーサネットハードウェアアドレスという 3つのタイ プのゲートウェイについて説明します.

以下に示す netstat -r の出力の例を使って, ルーティン グがいろいろと異なっている様子を説明することにします. Destination Gateway Flags Refs Use Netif Expire default outside-gw UGSc 37 418 ppp0 localhost localhost UH 0 181 lo0 test0 0:e0:b5:36:cf:4f UHLW 5 63288 ed0 77 10.20.30.255 link#1 UHLW 1 2421 foobar.com link#1 UC 0 0 host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0 host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 => host2.foobar.com link#1 UC 0 0 224 link#1 UC 0 0 最初の2行はデフォルトルート(次の節で詳しく説明します)と, localhostへの経路を示しています. localhostのためのインタフェース (Netifの欄) はlo0で, これはループバックデバイスとして知られています. 結局のところ戻るだけなので, この destinationへのすべてのトラフィ ックが内部的に処理されるのであって, LAN を経由して送られるのでは ありません. 次の行では``0:e0:...''というアドレスに注目しましょう. これはイーサネットハードウェアアドレスです. FreeBSDは自動的に ローカルなイーサネット上の任意のホスト (この例ではtest0) を見つけ, イーサネットインタフェースed0の所にそのホスト への経路を直接つけ加えます. タイムアウト時間 (Expireの 欄) も経路のタイプと結びついており, 指定された時間が経過しても応 答がないときに使用します. この場合, 経路情報は自動的に削除されま す. これらのホストは, RIP(Routing Information Protocol) という, 最短パスの判定に基づいてローカルホストへの経路を決定する仕組みを 利用することで認識されます. 更に, FreeBSDではローカルサブネット (10.20.30.25510.20.30というサブネットに対するブロードキャストアドレスで, foobar.comはこのサブネットに結びつけられているドメイン名) への経路情報も加えることができます. link#1というの は, この計算機の最初のイーサネットカードのことをさします. これら については, 何も追加インタフェースが指定されていないことに気づく でしょう. これらの2つのグループ(ローカルネットワークホストとローカルサブネット) の両方とも, routedと呼ばれるデーモンによって自動的に 経路が設定されます. routedを動かさなければ, 静的に定義した (つまり具体的に 設定した) 経路のみ存在することになります. host1 の行は私たちのホストのことで, イーサネットアドレスで示されています. 送信側のホストの場合, FreeBSDはイーサネットインタフェースへ 送るのではなく, ループバックインタフェース (lo0)を使います. 2つあるhost2の行は, ifconfigのエイリアス (このようなこと をする理由については ethernetの章を参照してください) を使ったとき にどのようになるかを示す例です. lo0の後にある=> は, インタフェースが (このアドレスがローカルなホストを参照しているので) ループバックを使っているというだけでなく, エイリアスになっていることも 示しています. このような経路はエイリアスをサポートしている ホストにのみ現れます. ローカルネットワーク上の他のすべてのホストでは 単にlink#1となります. 最後の行(destinationが224のサブネット)はマルチキャスト で扱うものですが, これは他の章で説明します. 他の欄についてはFlagsについて説明する必要があります. それぞれの経路は欄に示されているように違った属性をもっています. 以下にいくつかのフラグとこれらが何を意味しているかを示します. デフォルトルート

ローカルシステムからリモートホストにコネクションを張る 必要がある場合, 既知のパスが存在するかどうかを確認するためにル ーティングテーブルをチェッ クします. 到達するためのパスを知っているサブネットの内部にリモ ートホストがある場合 (Cloned routes), システムはインタフェース から接続できるかどうかをチェックします. 知っているパスがすべて駄目だった場合でも, システムには 最後の切り札の デフォルトルートがあります. このルートは ゲートウェイルート (普通はシステムに 1つしかありません) の特別なものです. そして, フラグフィールドは必ず ``c'' がマークされています. このゲートウェイは, LAN 内のホストにとっ て, 外部 (PPPのリンクを経由する場合や, データラインに接続するハー ドウェアデバイスなど) へ直接接続するマシンすべてのためのものです. 外部に対するゲートウェイとして機能するマシンでデフォルトルート を設定する場合, デフォルトルートは インターネットサービスプロバイダ(ISP)のサイトのゲートウェ イマシンになるでしょう. それではデフォルトルートの一例を見てみましょう. 一般的な構成を示します. [Local2] <--ether--> [Local1] <--PPP--> [ISP-Serv] <--ether--> [T1-GW] ホストLocal1とホストLocal2をPPPでISPのターミナルサー バと接続されているあなたのサイトだとします. ISPはサイト内にロー カルなネットワークを持っていて, そこにはまざまなものがあり, あな たの接続するサーバやISPのインターネットへの接続点であるハード ウェアデバイス(T1-GW)などがあります. あなたのマシンのデフォルトルートはそれぞれ次のようになります. host default gateway interface ---- --------------- --------- Local2 Local1 ethernet Local1 T1-GW PPP 「なぜ (あるいは、どうやって) Local1 の デフォルトゲートウェイをISPのサーバでなく T1-GWにセットするのか」という質問がよくあります. コネクションのローカルの側については, PPPのインタフェースは ISPのローカルネットワーク上のアドレスを用いているため, ISPのローカルネットワーク上のすべてのマシンへの経路は 自動的に生成されています. つまり, あなたのマシンは, どのようにT1-GW まで届くかという経路を既に知っていることになりますから, ISPサーバに媒介的なトラフィックをかける必要はありません. 最後になりましたが, 一般的にローカルネットワークでは ``...1' というアドレスをゲートウェイアドレスとして使います. ですから (同じ例を用います), あなたのclass-Cのアドレス空間が 10.20.30で ISPが10.9.9を用いている場合, デフォルトルートは次のようになります. Local2 (10.20.30.2) --> Local1 (10.20.30.1) Local1 (10.20.30.1, 10.9.9.30) --> T1-GW (10.9.9.1) マルチホームホスト

ここで扱うべき他のタイプの設定があります. それは2つの異なるネットワー クにまたがるホストです. 技術的にはゲートウェイとして機能するマシン (上 の例では PPPコネクションを用いています) はマルチホームホストで す. しかし実際にはこの言葉は, 2つのローカルエリアネットワーク上のサ イトであるマシンを指す言葉としてのみ使われます. 2枚のイーサネットカードを持つマシンが, 別のサブネット 上にそれぞれアドレスを持っている場合があります. あるいは, イーサネットカードを1枚持っているマシンで, ifconfigのエイリアスを使っているかもしれません. 物理的に分かれている2つのイーサネットのネットワークが使われて いるならば前者が用いられます. 後者は, 物理的には1つのネットワ ークセグメントで, 論理的には分かれている 2つのサブネットとする 場合に用いられます. どちらにしても, このマシンがお互いのサブネットへのゲートウェイ (inbound route) として定義されていることが分かるように, おのお ののサブネットでルーティングテーブルを設定します. このマシンが 2 つのサブネットの間のブリッジとして動作するという構成は, パケ ットのフィルタリングを実装する必要がある場合や, 一方向または双 方向のファイアウォールを利用したセキュリティを構築する場合によ く用いられます. ルーティングの伝播

すでに外部との経路をどのように定義したらよいかは説明しました. しかし外部から私たちのマシンをどのようにして見 つけるのかについては説明していません. ある特定のアドレス空間 (この例では class-C のサブネット) にお けるすべてのトラフィックが, 到着したパケットを内部で転送するネ ットワーク上の特定のホストに送られるようにルーティングテーブル を設定することができるのは分かっています. あなたのサイトにアドレス空間を割り当てる場合, あなたのサブネッ トへのすべてのトラフィックがすべて PPPリンクを通じてサイトに送 ってくるようにサービスプロバイダはルーティングテーブルを設定し ます. しかし, 国境の向こう側のサイトはどのようにしてあなたの ISPへ送ることを知るのでしょうか? 割り当てられているすべてのアドレス空間の経路を維持する (分散し ている DNS 情報とよく似た) システムがあり, そのインターネット バックボーンへの接続点を定義しています. 「バックボーン」 とは国を越え, 世界中のインターネットのトラフィックを運ぶ主要 な信用できる幹線のことです. どのバックボーンマシンも, あるネット ワークから特定のバックボーンのマシンへ向かうトラフィックと, そのバックボーンのマシンからあなたのネットワークに届くサービス プロバイダまでのチェーンのマスタテーブルのコピーを持っていま す. あなたのサイトが接続(プロバイダからみて内側にある ことになります) したということを, プロバイダからバックボー ンサイトへ通知することはプロバイダの仕事です. これが経 路の伝搬です. トラブルシューティング

ルーティングの伝搬に問題が生じて, いくつかのサイトが 接続をおこなうことができなくなることがあります. ルーティングがどこでおかしくなっているかを明らかにするのに 最も有効なコマンドはおそらくtraceroute(8)コマンドでしょ う. このコマンドは, あなたがリモートマシンに対して接続をおこなう ことができない(例えばping(8)に失敗するような場合) 場合も, 同じように有効です. traceroute(8)コマンドは, 接続を試みているリモートホスト を引数にして実行します. 試みているパスの経由する ゲートウェイホストを表示し, 最終的には目的のホストに たどり着くか, コネクションの欠如によって終ってしまうかのどちら かになります. より詳しい情報は, tracrouteのマニュアルページをみてください.