Computer Network 3 Document 10
通信ネットワーク実習3第10回補足資料

5.4 ICMP (Internet Control Message Protocol)

5.4.1 IPを補助するICMP

ICMP はネットワークのトラブルシューティングに使われる. 通信ができない場合その理由は多岐にわたるが, 原因究明に役立てるための情報をICMPで得ることができる.

具体的にはパケットが正しく送れなかった場合,ただ送れない, ということだけではなく,経路が見つからなかったのか, 経路は見つかったが転送先のホストが応答しないのか,などの 区別を知ることができる.

ICMPはTCP/IPの階層のネットワーク層(OSI参照モデルでは第3層)の プロトコルである.

ICMPでは送受信する情報はタイプコード とよばれる数値で符号化されている.タイプが上位概念で大まかな情報を 表し,コードはその下位概念で,そのタイプの内容を細分化した情報を 表す.コードは同じ番号でもタイプが別であれば無関係である.たとえば タイプ3「到達不能(Distination Unreachable)」のコード0 「ネットワーク到達不能(Network Unreachable)」と, タイプ11「時間超過(Time Exceeded)」のコード0 「生存時間超過(Time to Live exceeded in Transit)」には関係がない. タイプ0やタイプ8のようにコードを0しかもたないものもある.

タイプ,コードの一覧は Internet Assigned Numbers Authority ICMP Parameters で確認できる.

5.4.2 主なICMPメッセージ

タイプ3(ICMP到達不能メッセージ)はよく使われる. タイプ3は「相手ホストに届けることができない」という大きなくくりで, その中で理由を細分化してコードで知らせる.タイプ3の コードは教科書p.200表5.3のように多くの種類がある.

「届けることができない」ことを示すタイプ3の中でも よく使われるのはコード0「ネットワーク到達不能(Network Unreachable)」 とコード1「ホスト到達不能(Host Unreachable)」である.違いは, 届けることができない理由が相手ホストへの経路情報が無いために 送れない場合がネットワーク到達不能,ネットワークまでは わかっていてそこにパケットを流したがホストから応答が無い 場合がホスト到達不能である.届けられないと判断したホスト, ルータは該当するタイプとコードを送信元に返す.

タイプ5(ICMPリダイレクトメッセージ)は中継した ルーターが送信元が指定した経路よりも優れた経路を 知っている場合にその経路を送信元に教える機能である. トラブルの原因になることもあるために動作しないように 設定されている場合もある.

タイプ11(ICMP時間超過メッセージ)を理解するためには IPパケットに生存時間(TTL: Time To Live) が設定されている目的を理解する必要がある.

経路設定のミスでループする経路を作ってしまった場合, パケットがループを回り続けて悪影響を及ぼすことが考えられる. それを防ぐために,パケットがルータを超えることができる回数に上限 をもたせる.この値がTTLで,ルータを1つ通過するたびに1づつ減らされ, 0になった時点で上限に達したことがわかるのでそれ以上転送をすることなく 発信元にタイプ11コード0を返す.

traceroute (Windowsではtracert)コマンドはTTLの仕組みを別の ことにうまく利用したコマンドである.TTLを1に設定して宛先ホストへ パケットを送ると宛先ホストへ行くための最初のルータがタイプ11を返す. 次にTTLを2に設定して同じことを行うと2番目のルータがタイプ11を返す. このようにTTLを1づつ増やして通信を行うことで宛先ホストへの経路を 調べるようになっている.

タイプ0,タイプ8(ICMPエコーメッセージ)は宛先IPアドレスに IPパケットが到達するかどうかを調べるときに使われる. ネットワークが正しく設定されているか調べるときの最も 基本的な手段である.問い合わせがタイプ8で,宛先ホストがパケットを 正しく受け取ればタイプ0を応答として返す. この往復テストを行うコマンドがping(ピン,と読む)で,ネットワークの トラブルシューティングの最も基本的なツールである. ping コマンドを実行することを ping を「打つ」, ping の応答が正しく帰ってくることを pingが「通る」という.

他のネットワークのホストへpingを打って通らなければ OSI参照モデルの第3層の通信が確立していないことがわかる. この場合は同じネットワークのホストへpingを打ってみて 通ればルータから向こうの問題,通らなければこちらの ネットワークの問題,というように問題の切り分けが行える.

5.4.3 ICMPv6

IPv4 での ICMP は,ネットワークが正しく動いていれば必要ないものであったが, IPv6 では ICMP は必須のものになった.主な理由は通信相手のMACアドレスを知る ARP が ICMP の機能になったことで,ICMP が無いとOSI参照モデルの 第2層の通信の段階で通信が行えない.

IPv6ではIPアドレスからMACアドレスを知るプロトコルは ICMP近隣探索メッセージ(Neighbor Discovery) に変更された. MACアドレスを調べたいホストは自分のネットワークに マルチキャストで近隣要請メッセージを送る. 自分が探索のターゲットに指定されているホストは 近隣告知メッセージで問い合わせホストにMACアドレスを 通知する.

5.5 DHCP (Dynamic Host Configuration Protocol)

5.5.1 プラグ&プレイを可能にするDHCP

PCをネットワークに接続してインターネットを利用できるようにするには 自分のホストに

  1. IPアドレス
  2. サブネットマスク
  3. デフォルトルート(デフォルトゲートウェイ)
  4. DNSサーバー(優先DNSサーバー)

の情報を正しく設定する必要がある.ここではこれを 「ネットワーク設定4情報」とよぶことにする.設定すべき値はネットワーク 管理者が管理しており,それに従って間違えないように設定する 必要がある.重複したIPアドレスを設定すると不具合がおこる.

ネットワーク管理者はIPアドレスの重複が起きないように 使われているIPアドレスを間違いなく記録しておかなければ ならないし,ユーザーもノートPCなどでは移動して別のネットワークに 接続するたびに管理者に設定を聞いて設定しなおさなくてはならない.

DHCPは簡単にいうとネットワーク設定4情報を適切に自動設定する仕組み である.基本的にはネットワークごとにDHCPサーバーを起動させて ておくと考える.クライアントはPCを「DHCPを使う」という設定にしておけば ネットワークを移動してもそのネットワークのDHCPサーバーと 通信して適切な値を知り,自動的にネットワーク設定4情報が設定される.

5.5.2 DHCPの仕組み

まずDHCPサーバーには

  1. どの範囲のIPアドレスを クライアントに割り当てるか,
  2. クライアントが設定すべきサブネットマスク
  3. クライアントが設定すべきデフォルトルート
  4. クライアントが設定すべきDNSサーバー

を設定しておく.サーバーソフトウェアは 貸し出し中のIPアドレスを管理しておくことで ユーザーからの問い合わせに対して重複しない正しい ネットワーク設定4情報を通知することができる.

クライアントがネットワーク設定4情報を取得するときの手順の ポイントは教科書p.207図5.16のように2往復4回の通信で 完了するというところである.2往復なのはネットワーク内に 複数のDHCPサーバーがあったときのためである.

最初の往復はDHCP発見パケット(往),DHCP提供パケット(復) である.DHCP発見パケットはクライアントがDHCPサーバーを 探している,という意思表示である.この段階では クライアントにはネットワーク設定がされておらず.DHCP サーバーのIPアドレスも知らない状態であるから DHCP発見パケットはブロードキャスト で送られる.DHCP提供パケットはサーバーが自分が ネットワーク設定4情報を与える用意がある,という 意思表示で(提供できる設定値も知らせるが, クライアントは他のサーバーが提供した情報を採用 するかもしれない),相手がわかっていてそのクライアントだけに 送ればいいのでユニキャスト で送られる.

2往復めはDHCP要求パケット(往),DCHP確認応答パケット(復) である.DHCP要求パケットの必要性は複数のDHCPサーバーが 存在してそれぞれからDHCP提供パケットが返された状況を 考えるとよい.DHCP要求パケットはどのサーバーの提供する ネットワーク設定4情報を採用するかを宣言するための ものである.注意すべきなのは相手のサーバーの IPアドレスがわかっているにもかかわらず, これがブロードキャストで行われることである. これは使われなかったDHCPサーバーにもそのことを通知しないと 現在使われているIPアドレスの情報のメンテナンスができない からである.最終的に採用されたDHCPサーバーは DHCP確認応答パケットをクライアントにユニキャスト で送信してプロトコルは完了する.

DHCPサーバーがクライアントにネットワーク設定4情報を配付するとき, 使用制限時間も通知される.多くのクライアントは制限時間の 半分がすぎたらDHCPサーバーに延長の要請を行う実装になっている. こうすることでクライアントからの 使用終了の通知がなくとも制限時間までに延長要請が なかったIPアドレスは使用が終わったと判断し,再利用することができる.

IPアドレスの重複を避けるためにDHCPサーバーはIPアドレスの配付前に ICMPエコー要求パケットをそのIPアドレス宛に送信し,使われていない ことを確認する.

DHCPクライアントも配られたIPアドレスにARPを行って 使用されていないことを確認してから使う.

5.5.3 DHCPリレーエージェント

いままで説明したようにネットワークごとにDHCPサーバーがあると 考えたほうがわかりやすいが,それではDHCPサーバーが 多くなりすぎる場合がある.複数のネットワークを 1 台のDHCPサーバーが 管理し,個々のネットワークのルータに管理DHCPサーバーの処理を リレーするエージェントを動作させることで個々のネットワークからでも 管理DHCPサーバーのサービスを受けられるようにできる.

DHCPリレーエージェントは管理DHCPサーバーのIPアドレスを 知っているのでクライアントからのDHCPサーバー宛の ブロードキャストパケットも,DHCPリレーエージェントから 管理DHCPサーバへの通信はユニキャストで行う.

5.6 NAT (Network Address Translator)

5.6.1 NATとは

背景としてIPv4で使用できるIPアドレスの種類が 絶望的に足りない,ということをまず理解する. IPv4のアドレスは32ビットなので$2^{32}$, すなわち約43億個が上限である. TCP/IP が作られたころのネットワークの規模を念頭に決められたが 現在全世界の人口が約77億人(2019年)であることを考えると インターネットが全世界に普及し,人間が使う場所意外にも IPアドレスが多数必要になってきた考えると明らかに不足している.

IPv6はこの問題への根本的解決として設計されている. IPv6のアドレスは128ビットなので上限は$3.4\times 10^{38}$, 約340澗(かん)個になる(1澗は1兆の1兆倍の1兆倍).

NAT(NAPT)はIPv4のままで,複数の内部ホストからの外部ホストへの 通信を1台の対外的代表ホストがまとめて行うことでIPアドレスの 枯渇に対応するために考えられた技術である.

NATはIPアドレス枯渇の問題に十分対応できている.また, 外部ホストからは代表ホストとのみ通信しているようにみえるために 内部ホストにアクセスできないというセキュリティ上の メリットもあるのでIPv6が登場してからも広く利用されている.

5.6.2 NATの仕組み

IPアドレスが不足しているため,具体的にどんな状況になるか,というと 例えば研究室に10台のPCがあり,インターネットに接続したいが 組織から割り当てられたグローバルIPアドレスは1個しかない,という 状況が考えられる.

この場合,研究室内のPCには部署内で自由に使えるプライベートIPアドレス (教科書p.159,4.3.8節参照)を割り当ててネットワークを構築する. このプライベートネットワークとインターネットそれぞれに ネットワークインターフェースを接続したNATルーターを 設置する(教科書p.210図5.18,5.19).NATルーターは プライベートネットワーク内から インターネットへ向けての通信を自分発の 通信として肩代わりして行う.この場合,ルーターの インターネット側のネットワークインターフェースにだけ グローバルIPアドレスを与えればよい.

NAT の理解のためには プライベートIPアドレスのネットワークとグローバルIPアドレスの ネットワークをしっかり区別することがポイントである. 教科書図5.18,5.19のNAT ルーターの 左側がプライベートIPアドレスのネットワーク,右側が グローバルIPアドレスのネットワークである.

狭義のNAT と NAPT の違いを説明する.教科書図5.18が 狭義のNAT,5.19がNAPTの例である.大きな違いは 狭義のNATでは同時にインターネットに接続できる プライベートIPアドレスのホストは1台だけ,つまり 切り替えはできるが同時に使用できるIPアドレスの数が 増えないのに対し,NAPTではプライベートIPアドレスの ホストはどれも同時にインターネットにアクセスできる点 である.

もともの「1個のグローバルIPアドレスで多数のPCをインターネットに 接続したい」という動機からすると狭義のNATはあまり意味がなく, 一般的にはNAPTのほうが使われる.このため単にNATというと NAPTをさすことがほとんどである. IPマスカレードも同じ意味で,Linuxなどで使われる.以下, NAPT について説明する.

この節では教科書図5.19の中にある吹き出しの形の中に 書いてある,

宛先163.221.120.9:80
送信元10.0.0.10:1025

などの内容がどのように変わっていくかを理解することである. これが理解できたら 教科書図5.19の変換テーブルが理解できる.

ここにはそれぞれの区間を流れるパケットにヘッダとして付加されている

の4つの情報がかかれている.ポート番号はIPアドレスの後,コロンの 後に書く.

教科書にはプライベートIPアドレスのネットワークから インターネットにあるウェブサーバーへ通信する手順しか 書かれていないが,サーバーから応答が返ってきたときに どのように処理されるかを理解することがNAPTの理解において重要である. ここで前提となっているのが「サーバーは問い合わせられた通信の 送信元のポート番号に向かって応答を返す」ということである.

教科書図5.19において,プライベートIPアドレスのネットワーク内 のクライアントAがインターネット上のウェブサーバー(163.221.120.9) へアクセスし,応答が返ってくるまでの上に書いた4情報の変化を 説明する.

パケットの往路A

まず,クライアントA(10.0.0.10)はウェブサーバー(163.221.120.9)の80番ポート (教科書p236,ウェブサーバーは80番と決まっている)へ 情報を送る.パケットヘッダには宛先のIPアドレスとポート番号, 自分のIPアドレスとポート番号を記入するが,自分のポート番号は 教科書p.235から始まる予約済みのポート番号でなければクライアントA のウェブブラウザが自由に決めることができる.ここでは1025番 とする.この場合クライアントAは1025番あてのパケットを ブラウザへのパケットとして処理する. 最初の区画,クライアントAから出発する時点でのパケットヘッダの4情報は

宛先163.221.120.9:80
送信元10.0.0.10:1025

となる.プライベートIPアドレスのネットワーク内ではこのヘッダのままである. インターネットに向かうために,経路制御によりこのパケットは NAPTルーターの10.0.0.1のインターフェースに到着する. 送信元の10.0.0.10というIPアドレスはプライベートIPアドレスなので このままグローバルIPアドレスの世界(インターネット)に 送ることはできない.NAPTルーターは送信元のIPアドレスを 自分の二つあるインターフェースのうちインターネット側の インターフェースのグローバルIPアドレス 202.244.174.37に書き換える. ポート番号はルータが決めるが,ここでは同じ1025番を選んだとする. 宛先のIPアドレス,ポート番号はそのままで送る.このパケットへの ウェブサーバーからの応答はルーターの1025番宛に 送られることになる. ここで書き換えられた後のヘッダの4情報は

宛先163.221.120.9:80
送信元202.244.174.37:1025

となる.ここでサーバーからの1025番ポートへの応答をクライアントAに返すために 変換テーブルを作成する. ヘッダの4情報は最終目的地のウェブサーバまで この内容で到達する.

変換テーブル
プライベートグローバル
内側:10.0.0.10:1025
外側:163.221.120.9:80
内側:202.244.174.37:1025
外側:163.221.120.9:80

パケットの復路A

ウェブサーバにパケットが到達するとウェブサーバーは 自分が受け取ったパケットの送信元(ルーターの グローバルIPアドレスのネットワーク側)の IPアドレス,ポート番号へ応答を返す.すなわち右のグローバルIP アドレスのネットワークでウェブサーバーから出た応答のパケットの ヘッダの4情報は以下のようになる.

宛先202.244.174.37:1025
送信元163.221.120.9:80

このパケットは宛先がルータのグローバルIPアドレス側の インターフェースなのでルータに到達する.ここでルータは 変換テーブルを確認し,グローバルの外側が「202.244.174.37:1025」 である通信はプライベートの「内側:10.0.0.10:1025, 外側:163.221.120.9:80」の通信に書き換えることを知る.今回は 外側から内側への通信なのでルータからプライベートIPアドレスの ネットワークに出されるパケットのヘッダの4情報は以下のものになる.

宛先10.0.0.10:1025
送信元163.221.120.9:80

このヘッダ4情報によりパケットは正しくクライアントAの1025番ポートへ ウェブサーバから送られた応答として届く.

次に教科書図5.19のクライアントBが同じウェブサーバーに アクセスしたときに正しくクライアントBに応答が返される過程を 説明する.

パケットの往路B

まず,クライアントB(10.0.0.11)はウェブサーバー へ情報を送る.自分のポート番号はクライアントB のウェブブラウザが決めるがクライアントAと同じ 1025番を選ぶかもしれない.ここでは1025番を選んだ とする.この場合クライアントBは1025番あてのパケットを ブラウザへのパケットとして処理する. 最初の区画,クライアントBから出発する時点でのパケットヘッダの4情報は

宛先163.221.120.9:80
送信元10.0.0.11:1025

となる.インターネットに向かうために,経路制御によりこのパケットは NAPTルーターの10.0.0.1のインターフェースに到着する. NAPTルーターは送信元のIPアドレスを グローバルIPアドレスである自分のグローバルIPアドレスのネットワーク 側のインターフェースのIPアドレス202.244.174.37に書き換える. ポート番号はルータが決めるが,変換テーブルを確認して 前の通信で使用した1025番とは異なる番号を割り当てる. ここでは1026番を選んだとする. 宛先のIPアドレス,ポート番号はそのままで送る.このパケットへの ウェブサーバーからの応答はルータの1026番宛に 送られることになる. ここで書き換えられた後のヘッダの4情報は

宛先163.221.120.9:80
送信元202.244.174.37:1026

となる.ここでサーバーからの1026番ポートへの応答をクライアントBに返すために 変換テーブルにエントリを追加する. ヘッダの4情報は最終目的地のウェブサーバまで この内容で到達する.

変換テーブル
プライベートグローバル
内側:10.0.0.10:1025
外側:163.221.120.9:80
内側:202.244.174.37:1025
外側:163.221.120.9:80
内側:10.0.0.11:1025
外側:163.221.120.9:80
内側:202.244.174.37:1026
外側:163.221.120.9:80

パケットの復路B

ウェブサーバにパケットが到達するとウェブサーバーは 自分が受け取ったパケットの送信元(ルーターの グローバルIPアドレスのネットワーク側)の IPアドレス(202.244.174.37),ポート番号(1026番)へ応答を返す.すなわち右のグローバルIP アドレスのネットワークでウェブサーバーから出た応答のパケットの ヘッダの4情報は以下のようになる.

宛先202.244.174.37:1026
送信元163.221.120.9:80

このパケットがルータに到達する.ここでルータは 変換テーブルを確認し,グローバルの外側が「202.244.174.37:1026」 である通信はプライベートの「内側:10.0.0.11:1025, 外側:163.221.120.9:80」の通信に書き換えることを知る. 外側から内側への通信なのでルータからプライベートIPアドレスの ネットワークに出されるパケットのヘッダの4情報は以下のものになる.

宛先10.0.0.11:1025
送信元163.221.120.9:80

このヘッダ4情報によりパケットは正しくクライアントBの1025番ポートへ ウェブサーバから送られた応答として届く.

こように,使用が許されたグローバルIPアドレスが 1個だけであってもプライベートIPアドレスの ネットワーク内の複数のホストからの通信を異なるボート番号を 割り当てることで区別する. 変換テーブルを利用して対応するホストに応答を返すことができる.

5.6.3 NAT64/DNS64

IPv6のクライアントがIPv4のサーバーにアクセスするときに 使われる.まず途中にあるNAT64/DNS64装置が IPv6クライアントのDNS問い合わせに対して NAT64/DNS64サービスを使える形でIPアドレスを返す.

IPv6クライアントがこのIPアドレスに対して通信を 行えばNAT64/DNS64装置がそこから先のIPv4プロトコルでの 通信を肩代わりして行う(教科書p.212図5.20)

5.6.4 CGN (Carrier Grade NAT)

CGNはプロバイダ規模で行われる大規模なNATである. CGNが使われていると,プロバイダから各家庭に 割り当てられるのはグローバルIPドレスではなく プライベートIPアドレスになる.

家庭の入り口のルータで行われるNATでは プライベートIPアドレスのネットワークと別のプライベートIPアドレス の間でNATを行うことになる.家庭内の端末からみると NATが2段階で行われる.

5.6.5 NATの問題点

NATがあると,グローバルIPアドレスのネットワーク側のホストからは すべての通信がNATルーターのグローバル側のIPアドレスとの通信になる. ことためNATの内側のプライベートIPアドレスのネットワーク上の ホストと通信することはそのままではできない.しかし, セキュリティの面ではメリットなので,IPv4 + NATが今も 広く使われている理由の一つになっている.

5.6.6 NATの問題点の解決とNAT越え

IPv6を使うのが根本的な解決だが,IPv4 + NAT は今も需要があって 広く使われる.このためアプリケーション側で工夫して IPv4 でNATの内側と通信する技術がいくつか使われている.

NATの外側から内側へはコネクションを張ることができないが, アプリケーションの処理で一旦ダミーで内側から外側にコネクション を貼って,それを外から内への通信に使う手法などが利用されている.


Updated in July 16, 2020, Yamamoto Hirosh