では、今日も授業を始める。今日のテーマはルーティングだ
例えば、Linuxサーバに複数のI/F(インターフェース)があって、
それぞれにIPアドレスが設定されていたとする。
1台のLinuxサーバで、3つのLANケーブルを接続できるNIC(ニック=ネットワークインターフェースカード)があって、
それぞれのNICにIPアドレスを設定しているから、1台のLinuxサーバで3つのIPアドレスを持っているということね。
LinuxサーバのそれぞれのNICから、LANケーブルがスイッチにつながっているとする。
1台のLinuxサーバから3本のLANケーブルがでていて、3本ともスイッチにつながっているってことね。
このように複数のNIC(I/F)があっても、Linuxサーバの
デフォルトゲートウェイ(デフォルトGW)は1個しか設定できない。
デフォルトゲートウェイはデフォゲって略すんだよね。
例えば、以下の3つのIPアドレスがあったとする。
192.168.1.1(1個目のI/F)
192.168.2.1(2個目のI/F)
10.10.1.1 (3個目のI/F)←デフォゲを持つように設定
※NIC(ネットワークインターフェース)は3つある。
※デフォルトGWが10.10.1.254で
3個目のI/Fからつながっている先に
10.10.1.254(ルータ)があると仮定
デフォルトゲートウェイは、Linuxサーバの場合、1つのI/Fにしか設定できない。
Windowsサーバの場合は、各I/Fごとに異なるデフォルトゲートウェイを設定することができるが、
Linuxは複数I/F(複数のNIC)があっても、デフォルトゲートウェイは1つだ。
Linuxは1つのデフォゲしか設定できない仕様になっている。Windowsは複数のデフォゲを持つことができて、I/Fごとにデフォゲを設定できるのね。
この場合、Linuxから宛先IPアドレス「A」に対して、
通信しようとする場合、Linuxのルーティングテーブルに「A」のルーティングがかかれていれば、
それに従って、設定されているI/Fからパケットを出す(通信する)。
つまり、ルーティングテーブルに、「A」へ通信するときは、
このI/Fから通信するというルーティング設定があれば、そのI/Fからパケットが出ていくことになるってことね。
もし、ルーティングテーブルに書かれていない宛先IPアドレスの場合は、
どこのI/Fから通信すればいいか分からないため、デフォルトゲートウェイのIPアドレスへパケットを送ることになるのね。
うむ。デフォルトゲートウェイのIPアドレスへ通信する時に
LinuxのどのI/Fからパケットを出すかは、デフォルトゲートウェイを設定した時点で設定されている。
ざっくりいうと、Linuxが宛先IPアドレス「A」へ通信しようとする場合、
ルーティングテーブルをみて、ルーティングテーブルに書かれている宛先はそれに従い、
書かれていない場合は、デフォルトウェートウェイへ通信する。
ルーティングテーブルに書かれているということは、スタティックルートを設定しているか、
LinuxサーバのI/Fのネットワークに所属している場合のどちらかの場合である。
例えば、192.168.1.1(1個目のI/F)のサブネットマスクが/24の場合、
192.168.1.xxxへの通信は、1個目のI/Fからパケットが送信される。
つまり、192.168.1.xxxへのルーティングテーブルは、手動でスタティックルートを設定しなくても、
自動で設定される。
Linuxサーバ自身が所属するネットワークへの経路については、
OSが自動的に登録してくれるってことね。
所属するネットワーク以外へ送信したいときは、
自分でどのI/Fから送信するかをスタティックルート(静的経路)で設定すると、その設定したI/Fから送信されるってことね。
宛先IPアドレスが、Linuxサーバ自身が所属するネットワークへの経路でもなく、
自分が設定したスタティックルートにも該当しない場合は、デフォゲに送信されるのね。
うむ。例えば、192.168.1.1(1個目のI/F)が、LANケーブルでスイッチにつながっていて、
そのスイッチに、別のサーバ(192.168.1.2)からもLANケーブルがつながっているとする。
192.168.1.1も192.168.1.2もサブネットマスクが/24とすると、
Linuxサーバの192.168.1.1も、
別サーバの192.168.1.2も同じネットワークということになる。
Linuxサーバから、192.168.1.2への通信は、スタティックルートを設定していなくても、
192.168.1.1(1個目のI/F)からパケットが送信される。
あと、Linuxサーバに複数のNICがある場合に、通信の行きと帰りが異経路になると通信できないことがある。
パケットの行きと帰りが別経路となる通信のことを、非対称通信とか、非対称ルーティングといっている。
Linuxサーバから宛先IPアドレス宛にパケットを送信したときに、
行きに通った各NW機器の経路と、宛先IPアドレスの機器からLinuxサーバへの戻りのパケットが、
行きとは異なる経路でLinuxサーバへパケットが返るようなケースを非対称ルーティングというのね。
例えば、サーバX(IPアドレス:X)から、Linuxサーバの192.168.1.1(1個目のI/F)へパケットが届いた場合、
LinuxサーバがIPアドレス「X」へパケットを返すときに、
ルーティングテーブルを見る。
ルーティングテーブルに、IPアドレス「X」への経路が書かれていない場合、
デフォルトゲートウェイからパケットを返すことになる。
今回の例だと、10.10.1.1(3個目のI/F)にデフォゲを設定しているので、
10.10.1.1(3個目のI/F)から10.10.1.254(デフォゲ)へパケットを返すことになる。
この場合、行きと帰りが同じI/Fになっていないので、異経路という。
Linuxの192.168.1.1(1個目のI/F)へ届いたパケットが、10.10.1.1(3個目のI/F)から返ろうとしているってことね。
このように異経路の場合は、LinuxのOSの種類や、OSのバージョンによって、どのように動作するかが多少変わってくる。
例えば、CentOS7の場合、デフォルトの設定(=OSをインストールしてから特別な設定をしていない場合)では、CentOS7にパケットが入ってきたI/Fと、
CentOS7からの戻りのパケットのI/Fが異なる場合は、パケットを送らないという設定になっている。
つまり、CentOS7の場合、行きと帰りの通信が異なる場合は、パケットを返さない。
もし、行きと帰りが異なってもパケットを返すようにしたい場合は、/etc/sysctl.confファイルに以下の設定を入れる必要がある。
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
上記を設定して、CentOS7からパケットが返るようにしても、
途中のファイアウォールで、非対称通信(パケットの行きと帰りが別経路となる通信)のために
遮断されることもある。
ファイアウォールのステートフルインスペクションという機能が有効になっていると、
TCPやUDPの行きと帰りの通信状態をチェックしているため、
非対称通信の場合に、通信が失敗する。
つまり、非対称通信にならないようにした方が確実ってこと?
うむ。例えば、サーバX(IPアドレス:X)から、Linuxサーバの192.168.1.1(1個目のI/F)へパケットが届いた場合、
LinuxサーバにIPアドレス「X」のスタティックルートをあらかじめ設定しておけば
(192.168.1.1(1個目のI/F)からIPアドレス「X」へ通信するようにスタティックに設定)、
サーバX(IPアドレス:X)から、Linuxサーバへ通信の戻りは、同じI/F(1個目のI/F)になる。
よって、異経路にはならない。
もし、サーバX(IPアドレス:X)から、このLinuxサーバの
192.168.2.1(2個目のI/F)にも、10.10.1.1(3個目のI/F)にも通信したい場合はどうなるの?
今日は頭の回転が速いな。
サーバX(IPアドレス:X)が用途によって、
192.168.2.1(2個目のI/F)へ通信したり、
10.10.1.1 (3個目のI/F)へ通信したりというようなケースでは、
さっきのスタティックルート設定に従うと、
両方とも戻りの通信は、192.168.1.1(1個目のI/F)からIPアドレス「X」へ通信する。
サーバX(IPアドレス:X)からLinuxサーバの
10.10.1.1(3個目のI/F)へ通信したときの戻りの通信が異経路になっちゃう!
ってことは、ステートフルインスペクションのF/W(ファイアウォール)があったら、途中でパケット破棄されちゃう。
ってか、どうしたらいいの?
LinuxサーバにPBR(ポリシーベースルーティング)という設定をすれば解決する。
PBR(ピービーアール)って何?
今日はここまでで、PBRの説明は次回にしよう
は~い。
1.デフォルトゲートウェイ=デフォゲ
2.Linuxは1つのデフォゲしか設定できない
3.Windowsは複数のデフォゲを設定できる
4.非対称ルーティングはパケットの行きと帰りが別経路となる通信
5.非対称ルーティングはF/Wのステートフルインスペクションで遮断される
6.PBRはポリシーベースルーティングのこと