インターネット上のネットワーク障害の検知方法

はじめまして。 ネットワークGrpのhoshihayaです。

この記事では、インターネット上のネットワーク障害に気づく方法についてご紹介します。
OSI参照モデルでいうところのレイヤー3(ネットワーク層)の話で、レイヤーの低い話になります。

通常、インターネット上の障害は自ネットワークとは関係ないところで発生しているので、インターネット上のネットワーク障害に気づくことで問題発生時の原因切り分けの手助けとなることがこの記事の狙いです。


 

■インターネットの仕組み

まず、インターネットの仕組み(一般的な話)について紹介します。

インターネットは、AS(Autonomous System)同士がBGP(Border Gateway Protocol)というルーティングプロトコルで互いに経路情報を交換し、接続することによって形成されています。

 

■ASとは

ASとは「同じ経路制御ポリシーを持つネットワーク群」のことで、インターネットはたくさんのASを相互に接続した巨大なネットワークのことです。ASにはインターネット上でユニークな番号(AS番号)が、「インターネットレジストリ」という団体によって割り当てられています。

以下は、JPNICという「国別インターネットレジストリ」が公開しているAS番号情報です。

実際に様々な組織がAS名とAS番号を取得していることがわかります。

 

■BGPとは

BGPについて簡単に紹介します。BGPは、パスベクタ型と呼ばれるルーティングプロトコルです。ルータとルータでTCPのセッションを張り、1対1で経路情報をやりとりするため、安定している・信頼性が高いルーティングプロトコルであると言われています。

BGPで伝搬してくる経路情報の中には、通過してきた各ASの情報「AS-Path」が含まれており、BGPではその情報を基本として「Path Attribute」と呼ばれる付加情報と合わせて最適な接続先を決定しています。また、BGPにはAS内部で使用する「iBGP」とAS間で使用する「eBGP」がありますが、AS同士がやりとりするのはAS間のルーティングなので使用されるのは「eBGP」になります。

なお、現在のBGPフルルート数(インターネット上のすべての経路情報数)は56万程度あると言われております。

 

■つまり…!

つまりインターネットでは、BGPによって「最適な接続先」と定められたいくつかのASを通過していくことで、インターネット上の特定の宛先まで到達することができるようになっています。


 

■どのASに所属しているのか調べる

試しに、自分(のIP Address)がどのASに所属しているのかを調べてみましょう。

まず自分のOutboundのGlobal IP Addressを調べます。調べ方がわからない場合は、

# コマンド例
$ curl ifconfig.me

などで外部サイトにアクセスすることで自分のOutboundのGlobal IP Addressを知ることが出来ます。

 

そして、調べたGlobal IP Addressに対してwhoisコマンドを使用することで、そのIP Addressが所属するネットワークの「管理者連絡窓口(admin-c)」や「AS番号」を調べることが出来ます。

# コマンド
$ whois -h <whois Server> <Global IP Address>

# コマンド例
$ whois -h whois.nic.ad.jp `curl -Ss ifconfig.me`

「管理者連絡窓口(admin-c)」がわかると、さらにwhoisコマンドを使用したり、インターネットレジストリの情報を参照することでAS番号を知ることができます。

# コマンド
$ whois -h whois.nic.ad.jp ^<管理者連絡窓口(admin-c)> | grep AS

 

■手元からネットワーク障害を確認する方法

さて、実際に上記のようなインターネット上のどこか(のAS)でネットワーク障害が発生した場合、どのように調べれば良いでしょうか。

mtrコマンドを使用することで、経路上のどこでPacket Lossが発生しているかを調べることができます。mtrはtracerouteと似たコマンドですが、tracerouteと違い、どこでLoss率が高くなっているかを計測することができます。

 

■インストール方法

インストールは簡単で、それぞれのOS・ディストリビューションに合わせてお馴染みのコマンドでインストールすることができます。

  • Linux Ubunts等
    • $ apt-get install mtr
  • Linux CentOS等
    • $ yum install mtr
  • Mac OSX(Homebrewの場合)
    • $ brew install mtr

 

■使い方

例えば、example.com までの経路上の情報を調べたい場合、root権限で

# mtr example.com

と打ちます。もちろん宛先はIPアドレスを直接指定しても問題ありません。経路の途中でLoss率が高くなっている箇所があれば、そのAS上のなんらかの障害の影響を受ける可能性があることがわかります。

mtr実行時の様子

mtr実行時の様子


 

■DeNAで行なっているインターネット上のネットワーク障害検知

DeNAでは以下のようなプロセスで、インターネット上で発生するネットワーク障害に対応できるよう備えています。

  1. whoisにて、注視したいFQDNとAS番号を紐付ける。

  2. 各ASのサンプルページにリーチャビリティがあるかどうかを定期的に確認する。

  3. 結果を宛先ASごと・DeNAの使用回線ごとに集計し、失敗率を算出する。

  4. 失敗率が予め定めた閾値を超えた場合に、失敗率が高いASに対してmtrを実行する。

  5. 障害の原因となった場所を特定する。

  6. 可能であれば迂回等の対策を行う。


 

■最後に

今回はインターネット上でネットワーク障害が発生した際の検知方法について書いてみました。

外部ASのネットワーク障害は自分で制御することができません。そのため、何かあったときに事象に気づき、インターネットの仕組みを利用してできる限りの対応を素早く行うことが重要になります。

 

最後までお付き合い頂きありがとうございました!