Webエンジニアなら知っておきたいルーティングの基本

インフラ担当の柴田です。 「Web エンジニアなら知っておきたい」ということで、今日はルーティングについて紹介したいと思います。

例えばAWSのEC2でサービスを立ち上げて、Security groupを設定したのにつながらない。Dockerで立ち上げたサービスにつながらないという経験はありませんか?

その原因はもしかするとルーティングにあるかもしれません。今日はルーティングの基礎の基礎をご紹介します。

ルーティングとは?

ルーティングはネットワーク間でデータを転送するための仕組みです。各デバイスがどのようにデータを異なるデバイスに転送するのかがプロトコルによって決まっており、それに従ってデータを転送することでコンピュータは通信ができています。

パケットを転送する立場になって考えよう

先人は「パケットの気持ちになれ」と言いますが、今回はパケットを転送する立場になって考えてみましょう。

表に従って転送する

パケットを転送するあなたの仕事は、ルーティングテーブルと呼ばれている表に従ってパケットを転送することです。 ルーティングテーブルには、Destination(宛先)、Gateway(転送先)、Netif(転送に使うネットワークインタフェース)などが記載されています。

作業としては以下の繰り返しです。

  1. 届いたパケットの宛先をルーティングテーブルと照らし合わせて転送先を確認します。
  2. 転送先が分かったら転送先に転送します。

ルーティングテーブルの読み方

ルーティングテーブルは、パケットの宛先にもっとも長く一致する行をDestinationの中から見つけその行を読みます。 もし一致する行が見つからない場合はdefault行を読みます。

以下はある日の私のMacBookのルーティングテーブルの一部です。 MacBookの場合ルーティングテーブルはnetstatコマンドで確認できます。今回はIPv4に絞って紹介するためにinetオプションを使っています。

% netstat -rnf inet
Routing tables

Internet:
Destination        Gateway            Flags               Netif Expire
default            192.168.0.1        UGScg                 en4
127                127.0.0.1          UCS                   lo0
127.0.0.1          127.0.0.1          UH                    lo0
192.168.0          link#16            UCS                   en4      !
192.168.0.1/32     link#16            UCS                   en4      !
192.168.0.1        8:10:86:a8:53:c8   UHLWIir               en4   1077
192.168.0.2        8:ba:5f:8f:70:14   UHLWI                 en4   1198
192.168.0.5        5c:ac:4c:97:60:57  UHLWI                 en4   1070

練習

いくつかのパケットで転送先を考えてみましょう。

  1. 192.168.0.5宛てのパケット: 192.168.0.5の行があるので5c:ac:4c:97:60:57en4のネットワークインタフェースを使って転送します。*1
  2. 192.168.0.100宛てのパケット: 192.168.0の行が最も長く宛先に一致するのでen4のネットワークインタフェースを使って転送します。*2
  3. 10.0.0.10宛てのパケット: 一致する行はないのでdefault行にもとづいて192.168.0.1en4のネットワークインタフェースを使って転送します。

まとめ

ルーティングをしっかりと理解するにはさらにプロトコルの学習などが必要だと思いますが、ルーティングによって少しずつパケットを宛先に届けているのだということを知っておくだけでも通信がつながらないときに役立つと思います。

*1:5c:ac:4c:97:60:57と見慣れない宛先ですがこれはMACアドレスです。同じネットワーク内にある宛先なのでEthernetを使って転送しています。

*2: Gatewayについて言及していませんが、同じネットワークなのでen4から宛先を問い合わせて見つかればMACアドレスを設定して転送します。link#16の数字はあまり意味がなく16番目のインタフェース(この場合en4になります)が宛先だと表しています