今回は、インターネットルーティングとトラフィックエンジニアリングについて簡単にお話したいと思います。
今日、インターネットルーティングは、BGP(ボーダーゲートウェイプロトコル)として知られているルーティングプロトコルを使用することによって処理されます。 インターネット上での個々のネットワークは、自律システム(AS)として表現されます。 自律システムはまた、ネットワークにIPアドレスの割り当てを扱う地域インターネットレジストリ(RIR)によって割り当てられているグローバルにユニークな自律システム番号(ASN)があります。
個々のASは、BGPルーティング情報を交換するために他のASにピアリングセッションが確立されます。BGPピアリングセッションはAS間で確立されたルータ間のTCPセッションです。 このBGPピアリングセッションは、10ギガビットイーサネットのインターフェースで結ばれたリンクの上に乗るなどします。ルーティング情報は、IPアドレスプレフィックスとサブネットマスクが含まれ、IPアドレスが(オリジン)ASNに関連付けられ、ルーティング情報は個々のネットワークが定義したポリシーに基づいて、これらのAS間で伝播します。
様々な要因がルーティングがインターネット上で処理される方法に影響を与えるところが、興味深いところです。 今日のAS間の関係には2つの主な種類があります。それが、トランジットとピアリングです。
トランジットは、ASが上流ネットワーク(トランジットプロバイダーとして知られています)に対してお金を払ってトラフィックを更に先に転送するところです。それらが、彼らのルーティング情報が自分の隣接に伝播している(この関係において顧客である)ASの購入のために使われます。トランジットは、上流のトランジットプロバイダーネットワークへの顧客ネットワークからの直接接続を取得することを含みます。それらの接続は、例えばお互いのルータ間にある複数の10Gイーサネットリンクを使います。トランジットの価格は、支配的なトラフィック方向の利用量の95パーセンタイルに基づきます。請求書で使用される単位は、bpsで測定され、Mbpsのあたりの価格です(例えば Mbpsあたり2ドル)。
ピアリングは、彼らが持っている自律システムを別の自律システムに接続し、相互にトラフィックとルーティング情報を交換する場所で、独自のネットワークのときも、すべてのお客さま(トランジット顧客)を含むこともあります。ピアリング2つの方法があります。
ひとつは複数の10ギガビットイーサネットまたは100ギガビットイーサネットリンクを持つ個々のネットワークルータ間で確立された場所で行う場合です。この接続方法は、「プライベートピアリング」またはPNI(プライベート·ネットワーク·インターコネクト)として知られています。この種の接続は、両方向(インバウンドとアウトバウンド)におけるトラフィックのインターフェイスの使用率に明確な可視性を両当事者に提供しています。
もう一つのピアリングの別の形態は、インターネットエクスチェンジ、またはIXといわれる事業者のスイッチ上で行われます。インターネットエクスチェンジでは、複数のネットワークは、イーサネットスイッチのセットに直接接続をします。 個々のネットワークは、他の参加者と、このインターネットエクスチェンジでBGPセッションを確立することができます。 インターネットエクスチェンジの利点は、複数のネットワークが共通の位置に接続し、一対多の接続のためにそれを使用することを可能にすることです。 マイナス面は、任意のネットワークが他の参加者のネットワーク使用率の明確な可視性を持っていないということです。
ほとんどのネットワークはコロケーション施設に配置されたルータや、高密度波長分割多重装置(DWDM)によって相互に直接接続を確立します。これはインターネットエクスチェンジを使う場合であれ、直接の光接続をラック間で行う場合であれ、同様です。
ルーティングポリシー
ネットワークは、様々なアイテムに基づいて他のネットワークへのルーティング行うために、ルーティングポリシーを定義します。 ルータ·オペレーティング·システムにおけるBGPベストパス決定プロセスは、BGPパスを優先度を塗り替えて決まります。ネットワークオペレータは、性能に加えて、宛先ネットワークへのトラフィックを配信するためのコストなどの要因に基づいて、そのBGPの最良パスの決定プロセスに影響を与えるそれらのポリシーを記述します。
ほとんどのネットワーク内の代表的なルーティングポリシーは、内部(自分自身)と、自分の顧客からの学習されたルートは、他のすべてのパスに優先されるべきであることを指示します。その後、ピアリングは、一般的に無料であるため、ほとんどのネットワークはピアリングを優先することで、目的地に到達するための短い/最適パスを提供することができます。最後に、有料のトランジットリンクを使います。トランジットパスにおいては、コストとパフォーマンスの両方が宛先ネットワークに到達する方法を決定する際に、一般的な要因となります。
ルーティングポリシー自体は、ルータのオペレーティングシステムに固有のもので、単純なテキストベースのポリシー言語でルータに定義されています。それらはルーティングのマッチングと、そのマッチのためのアクションという二種類の機能を含みます。BGPは(コミュニティ、次のホップ、など)の属性のマッチングは、ASパスまたは他のタイプの実際のIPプレフィックスとサブネットの長さ、ASNオリジンのリストを含めることができます。アクションは、BGPは、ローカルプリファレンス、MEDおよび様々な他の値(コミュニティ、オリジンなど)などの属性を含めることができます。以下は、トランジットプロバイダから学習したルート上のルーティングポリシーの簡単な例です。複数の用語を使って、プロバイダを経由して転送すべきか、トラフィックを制御するために、さまざまなローカルプリファレンス値を設定するかを定義しています。さらに、ネットワーク内の他のルータによって作用することができるようにルートを分類するに関連したBGP属性を設定するための追加のアクションがあります。
policy-statement TRANSIT-1-IN {
term PREFER-OVER-PEERING {
from as-path-group TRANSIT-1-OVERRIDE;
then {
metric 1000;
local-preference 2010;
community set TRANSIT;
community add LOCATION;
accept;
}
}
term PREFER-OVER-OTHER-TRANSIT {
from as-path-group TRANSIT-1-HIGH-PREF;
then {
metric 1000;
local-preference 1010;
community set TRANSIT;
community add LOCATION;
accept;
}
}
term DEPREF-OTHER-TRANSIT {
from as-path-group TRANSIT-1-LOW-PREF;
then {
metric 1000;
local-preference 990;
community set TRANSIT;
community add LOCATION;
accept;
}
}
term DEFAULT-TERM {
then {
metric 1000;
local-preference 1000;
community set TRANSIT;
community add LOCATION;
accept;
}
}
}
ネットワーク管理者は、ルーティングポリシーを、隣接するASからどのようにトラフィックを受信し送信するのかを決定するために、チューニングします。これは、一般的にBGPトラフィックエンジニアリングとして知られています。外向けのトラフィックの変更は簡単に行えます。ポリシーの変更の前後に、オペレータはどのような影響があるかどうか注意しなければなりません。
流入するトラフィックのエンジニアリングは比較的難しい問題です。他のASに対してあなたにルーティングする際の好ましい方法を主張しなければならないためです。隣接したASでなければ影響を与えることは少なめではありますが、影響を与えることに注意しなければなりません。このテクニックは、トランジットプロバイダがBGPを通じて付与できる機能を許可していなければなりません。BGPでは、コミュニティ属性というものがあり、BGPセッションを超えてルーティング渡すことができます。
ほとんどのネットワークは、顧客対ピア対トランジットとしてルートを分類するためにコミュニティを使用しています。トランジット対顧客関係では通常、隣接へのルートの更なる伝播を制御するために、顧客に特定の機能を提供します。これは、直接に接続されていないネットワークへのさらに上流のトラフィックエンジニアリングする能力を持つネットワークを付与します。
トラフィックエンジニアリングは様々な理由で使われます。第一の理由は特定のパスを優先させることで帯域幅コストを削減するためです。次の理由は混雑やレイテンシを考慮した パフォーマンス上の理由です。オペレータは問題を特定するために様々なメトリクスを観察し、ポリシーの変更を行ないます。もちろんインターネットでは、秒単位でトラフィックスケールは変化します。別のパスにトラフィックを数Gbpsのを移動すると、パフォーマンスが向上する場合がありますが、数十Gbpsを移動させると、新たに選択したパスに輻輳が発生することがあります。今日、ネットワーク間のリンクは観測された利用率に基づいて容量を求めています。接続のためのトランジットプロバイダに払っていたとしても、これは外部ネットワークへのすべてのリンクはあなたがプッシュしたいトラフィックの量のためにスケーリングされるという意味ではありません。トラフィックが成長するにつれて、リンクは、個々のネットワークの間に追加されます。インターネット上で利用が変化すれば、経験していなかったようなトラフィックの増加と輻輳発生が引き起こされます。結果として、すべてのトラフィックが移動する影響を評価するために、増分だけでなく他のネットワークとの通信のトラフィック移動についても、ネットワークオペレータは注意を払わなければなりません。
上で述べたトラフィックエンジニアリングを複雑にしている理由は、特定の宛先へのトラフィックのプッシュをしようとしているのは一人だけではないためです。他のネットワークも彼らのトラフィックエンジニアリングを試みようとしています。いくつかの理由によって他のネットワークとのピアリングを拒否することもあります。たとえば、いくつかのネットワークではトラフィック比でのインとアウトの不均衡が理由となるときがあります。この場合、これらの宛先に到達する唯一の方法はトランジットプロバイダを介して行われます。幾つかの場合において、これらのネットワークは直接接続するために"paid peering"(支払いを伴うピアリング)を提供することができます。paid peeringはトランジットに比べれば低い価格付けがされていたり、空いているパスがオファーされているかもしれません。トランジットのパスを持っていたとしても、ピーク時間があるように、いつでも空いているパスであることは意味しません。
ネットワーク間ホップを排除する一つの方法は、直接接続です。AWSでは、AWS Direct Connectとして、それを提供しています。AWS Direct Connectにより、お客様は、AWSのネットワークインフラストラクチャに直接接続することができます。これは、直接物理的な接続を介してインターネットをバイパス可能にし、潜在的なインターネットルーティングや容量の問題を解決します。
Traceroute
トラフィックパスを決定するために、tracerouteのようなツールは有用です。tracerouteは与えられた送信先ネットワークに送信するパケットを送信することによって動作し、それは1つ目のIPに TTL値1を設定します。上流のデバイスがソースへのICMP TTL超過メッセージを生成することで、最初のホップを明らかにします。後続のパケットは、送信元から送信される際に、各ホップを表示するためにIP TTL値をインクリメントします。これにより、送信元から目的地へのホップを明らかにします。ここで、インターネットでの経路はたいてい非対称のパスを含むことは覚えておかなければなりません。
ルーティングの問題を診断するためにtracerouteを使う際は、両方向で実行しましょう。ネットワークオペレーションセンター(NOC)またはサポートグループがこの結果を扱う場合には、通信に関わる送信元アドレスと宛先アドレスのパブリックIPを公開することが重要です。これらは問題の再現に使用できる情報となります。例えば、HTTP(TCP / 80)またはHTTPS(TCP / 443)であった場合など、通信を取り巻くすべての具体的な詳細を含めることが有効です。一部のtracerouteアプリケーションは、特定のポートへのICMPエコー要求(PING)、UDPまたはTCPパケットなどのさまざまなプロトコルを使用して、そのプローブを生成する機能をユーザに提供します。
デフォルトでは、いくつかのtracerouteプログラムは、ICMPエコー要求または(特定のwell-definedポートの範囲を宛先とした)UDPパケットを使用します。インターネット上のさまざまなネットワークは、多くのパケット種類をフィルタリングすることができるため、それはあなたが実際に使用するパケットのタイプを使って、宛先ネットワークにに対してtracerouteを使用することをお勧めします。例えば、ファイアウォールまたは他のパケットフィルタリングされたネットワークでは、TCP / 80またはTCP / 443でtracerouteを使用すると、より良い結果をもたらすことができるでしょう。
UDPベースのwell-definedポートレンジあてのtracerouteの例です。ここでは、宛先までの複数の経路において、TTL Exceededパケット生成が許可されています。
[ec2-user@ip-10-254-10-179 ~]$ traceroute -q 1 www.amazon.com
traceroute to www.amazon.com (72.21.215.232), 30 hops max, 60 byte packets
1 ip-10-6-6-1.us-west-2.compute.internal (10.6.6.1) 0.736 ms
2 100.70.41.1 (100.70.41.1) 0.691 ms
3 100.70.41.34 (100.70.41.34) 0.458 ms
4 ip-10-177-64-9.us-west-2.compute.internal (10.177.64.9) 0.336 ms
5 100.64.12.64 (100.64.12.64) 0.484 ms
6 100.64.13.1 (100.64.13.1) 6.067 ms
7 ec2-50-112-0-20.us-west-2.compute.amazonaws.com (50.112.0.20) 1.521 ms
8 100.64.1.65 (100.64.1.65) 1.408 ms
9 100.64.0.84 (100.64.0.84) 0.903 ms
10 100.64.16.89 (100.64.16.89) 18.491 ms
11 54.239.48.192 (54.239.48.192) 1.379 ms
12 205.251.232.196 (205.251.232.196) 1.274 ms
13 54.239.41.26 (54.239.41.26) 58.497 ms
14 205.251.244.101 (205.251.244.101) 58.998 ms
15 72.21.222.157 (72.21.222.157) 68.459 ms
16 72.21.222.85 (72.21.222.85) 79.995 ms
17 *
18 *
19 *
上のポート宛のUDPパケットが許可されていないため、最終ホップが返答されていないことに注意してください。
同じtracerouteをTCP/443(HTTPS)宛におこなってみましょう。このとき、複数のルータが返答しないものの、宛先ホストはTCP/443をlistenしているため返答を返しています。
TCP Traceroute to port 443 (HTTPS):
[root@ip-10-254-10-179 ~]# tcptraceroute -q 1 -w 1 www.amazon.com 443
Selected device eth0, address 10.254.10.179, port 39691 for outgoing packets
Tracing the path to www.amazon.com (72.21.215.232) on TCP port 443 (https), 30 hops max
1 10.6.6.1 0.790 ms
2 100.70.41.1 0.516 ms
3 100.70.41.36 0.440 ms
4 10.177.48.9 0.346 ms
5 100.64.12.76 0.519 ms
6 *
7 *
8 *
9 *
10 100.64.16.75 21.096 ms
11 54.239.48.194 2.077 ms
12 205.251.232.214 1.470 ms
13 54.239.41.28 58.619 ms
14 205.251.244.101 59.913 ms
15 72.21.222.87 61.425 ms
16 *
17 *
18 *
19 100.64.19.27 66.006 ms
20 72.21.215.232 [open] 59.023 ms
tracerouteによって明らかになったホップは、パケットが通過しているネットワークデバイスに幾つかの洞察をもたらします。多くのネットワーク事業者は、PTRレコードを逆DNSに説明情報を追加します。通常、DNSエントリは、ルータ名、地理的コードのいくつかの並べ替え、トラフィックが通過した物理的または論理的なルータインターフェイスを示します。それぞれのネットワークは異なる名前付けを持っていますが、外部や顧客へのインターフェースを持っていないcoreルータや、外部へのインターフェースを持つedgeルータなどがしばしば使われます。もちろん、これはかっちりと決められたルールではなくネットワーク上の多機能なデバイスを見つけるためによく使われるものというていどのものです。地理識別子は特定のネットワーク内部でユニークなものです。例えば、IATA空港コード、テレコムCLLIコード、またはそれらのバリエーションで、もちろん内部的に生成されることもあります。結果、短縮された住所や都市名が表れます。インターフェースの速度や種別が表記されることもあります。これらのネットワークオペレータが更新する情報が正確であると信じるならばですが、DNSエントリーを最新に保つために使うことができます。
tracerouteにおいて一つ重要なところは、そのデータはある程度懐疑的にとらえなければならないということです。tracerouteは経路上のホップ個々のラウンドトリップタイム(RTT)を表示します。この値はこれらのホップの待ち時間を示唆しますが、実際の値は様々な要因から影響を受けます。いまどきのルータは、本来ルータが行うべき機能であるパケット転送や経路交換に比べて、優先度が低く設定され、しばしばTTLで指定された時間を超えてしまい、処理が行われないことがあります。しばしば、traceroute内の中間ホップに高いRTTがあらわれるのはそのためです。これは、ネットワークの問題であること、エンドユーザによるpingやアプリケーションのテストを、常に行うべきであることを示すわけでもありません。RTTが特定のホップで高い値となり、それが増えているような状況では、ネットワーク内の特定の場所での待ち時間が全体的に増えている指標となりえるでしょう。tracerouteにおいて頻繁に見られる "*" は応答しないホップを示します。TTL期限が切れたか、ICMP TTL Exceededメッセージを許可していない場合のどちらかです。
いまどきのルータはコントロールプレーンにおけるパケットの処理方法を制御するために、Control-Plane Policing (CoPP)が実装されています。また、ASICs (Application-Specific Integrated Circuit) を使ってパケットを拾って転送する速度を向上させています。ASICはTTL=1のパケットを受信すると、ICMP TTL Exceededを発生させるための別の場所にそのパケットを渡します。ほとんどのルータでは、ICMP TTL Exceededの発生処理は、ラインカード、ルーティングエンジンまたは、メインCPUで実行されます。それらは転送テーブルのプログラミングおよびルーティングプロトコルの実行のためにビジーであるため、TTL Exceededパケットの処理レートを制限しています。オペレータはCoPPをつかって、たとえば100パケット毎秒の処理に制限できます。さらにルータ自体は多くのICMP TTL Eceededメッセージを作るレートの制限を行っていることがあります。この状況では、tracerouteのホップがCoPPにより、全く返事しないことがあります。個々のホップへのpingを実行する際のCoPPがパケットをドロップしているので、パケット損失として表示される理由でもあります。
tracerouteを説明するよいプレゼンテーションがありますのでご参考ください:https://www.nanog.org/meetings/nanog45/presentations/Sunday/RAS_traceroute_N45.pdf
インターネット上でのトラブルシューティングの問題は容易ではありません、それが発生して何ができるかについての結論を出すための情報(トレースルート、BGPルーティングテーブル)の複数の組み合わせを調べる必要があります。Internet Looking Glassやroute serversはトラブルシュートの際にちがった視点を得るために有益です。Looking Glassのwikipediaのページでは、pingやtracerouteさらにBGP経路を調べるために使えるサイトへのいくつものリンクがあります。
ネットワークに手を入れたり、インターネットルーティングの問題に関して助けを得るためにフォーラムポストするときには、トラブルシュートのために有益な情報を提供してください。ソースIPアドレス(パブリックIPアドレス。プライベートやNATされたものでは意味がない)、宛先アドレス(繰り返しですが、パブリックIPアドレスです)、プロトコルとポート番号(たとえば、TCP/80)、問題が起きていた日時などが含まれます。双方向のtracerouteの結果は、インターネットのパスが非対称であることから、とても有益です。
--araki