インフラ担当の柴田です。 「Web エンジニアなら知っておきたい」ということで、今日はルーティングについて紹介したいと思います。
例えばAWSのEC2でサービスを立ち上げて、Security groupを設定したのにつながらない。Dockerで立ち上げたサービスにつながらないという経験はありませんか?
その原因はもしかするとルーティングにあるかもしれません。今日はルーティングの基礎の基礎をご紹介します。
ルーティングとは?
ルーティングはネットワーク間でデータを転送するための仕組みです。各デバイスがどのようにデータを異なるデバイスに転送するのかがプロトコルによって決まっており、それに従ってデータを転送することでコンピュータは通信ができています。
パケットを転送する立場になって考えよう
先人は「パケットの気持ちになれ」と言いますが、今回はパケットを転送する立場になって考えてみましょう。
表に従って転送する
パケットを転送するあなたの仕事は、ルーティングテーブルと呼ばれている表に従ってパケットを転送することです。 ルーティングテーブルには、Destination(宛先)、Gateway(転送先)、Netif(転送に使うネットワークインタフェース)などが記載されています。
作業としては以下の繰り返しです。
- 届いたパケットの宛先をルーティングテーブルと照らし合わせて転送先を確認します。
- 転送先が分かったら転送先に転送します。
ルーティングテーブルの読み方
ルーティングテーブルは、パケットの宛先にもっとも長く一致する行を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
練習
いくつかのパケットで転送先を考えてみましょう。
192.168.0.5
宛てのパケット:192.168.0.5
の行があるので5c:ac:4c:97:60:57
にen4
のネットワークインタフェースを使って転送します。*1192.168.0.100
宛てのパケット:192.168.0
の行が最も長く宛先に一致するのでen4
のネットワークインタフェースを使って転送します。*210.0.0.10
宛てのパケット: 一致する行はないのでdefault
行にもとづいて192.168.0.1
にen4
のネットワークインタフェースを使って転送します。
まとめ
ルーティングをしっかりと理解するにはさらにプロトコルの学習などが必要だと思いますが、ルーティングによって少しずつパケットを宛先に届けているのだということを知っておくだけでも通信がつながらないときに役立つと思います。