はじめに
私はデータベース、特にPostgreSQLが専門(?)なのですが、求められれば付け焼き刃で勉強しながらネットワークの設定もやったりします。
今回は、複数NICを持つLinuxマシンに対して、1つのNICのみを持つマシンから両方のNICに対して通信をすることになりました。
どういうことかというと
青のLANは192.168.10.0/24のセグメントであり、緑のLANは192.168.20.0/24のセグメントです。
マシンAにNICが2つあり、それぞれのNICが青と緑に接続しています。
- NIC0
- IP:192.168.10.2
- GW:192.168.10.254
- NIC1
- IP:192.168.20.2
- GWは設定していません。
マシンBはNICが1つのみであり、緑のLANにしか接続していません。
- NIC0
- IP:192.168.20.201
- GW:192.168.20.254
このネットワーク構成でつまり、次の図のようなことがしたいわけです。
非対称ルーティング
実はこのネットワーク構成では、やりたいことが上手くできません。pingを飛ばしても返ってこないのです。
どうしてそうなるのか。マシンBからマシンAへの通信がどうなっているかを説明します。
まず、マシンBは同一セグメント上にない「192.168.10.2」というIPアドレスがどこにあるか自分ではわかりません。そういうときは、デフォルトゲートウェイに問い合わせに行きます。
ゲートウェイはルーティング情報から、宛先のアドレスのネットワークに向けて中継します。
マシンAまで届くとマシンAは何を血迷ったか、受信したNIC1ではなく送信元のマシンBが接続している緑のセグメントと同セグメントのNIC0から返信しようとします。
NIC0から返信してしまうと、受信した経路と送信した経路が異なる非対称ルーティングとなります。そして、Linuxではデフォルトではこれを禁止しており、マシンBまで返信は返りません。
2つの対策
対策としては2つ考えられます。
非対称ルーティングを許可
1つは非対称ルーティングを許可してあげること。しかし、非対称ルーティングはマシンのなりすましなどの可能性があるため、ホイホイ許可するのは考えものです。本記事ではやり方には触れませんが、許可したい場合はrp_filterで検索してみてください。
静的ルーティングを設定
本記事の本命はこちら。要するにマシンAの振る舞いの何が悪いのかというと、NIC1で受信したのにNIC0から返信しようとしているところです。だったら、NIC1で受信したならNIC1から返すように、無理矢理にでも設定してあげればいいわけです。その設定方法が、静的ルーティングです。
静的ルーティング設定手順
ポリシーベースルーティングというものの設定をしてみたいと思います。
ルーティングテーブルファイルに追加
/etc/iproute2/rt_tablesに次の2行を追加します。
100 rule01
101 rule02
ルールファイルを作成
/etc/sysconfig/network-scriptsディレクトリの下に、NIC0とNIC1のインタフェースそれぞれに適用させるルールファイルを作成します。
# vi rule-nic0
from 192.168.20.2/32 table rule02 priority 200
# vi rule-nic1
from 192.168.10.2/32 table rule01 priority 100
ルーティングファイルを作成
同じく/etc/sysconfig/network-scriptsディレクトリの下に、NIC0とNIC1のインタフェースそれぞれに適用させるルーティングファイルを作成します。
# vi route-nic0
192.168.20.0/24 dev nic0 table rule02
default via 192.168.20.254 dev nic0 table rule02
# vi route-nic1
192.168.10.0/24 dev nic1 table rule01
default via 192.168.10.254 dev nic1 table rule01
ネットワークを再起動
# systemctl restart network
これで、設定が上手くいっていれば、当初の目的が実行できているはずです!お疲れ様でした!
余談
次の図を御覧ください。
このような通信は、同一セグメント内であり、全く問題なく行えます。それなら別に、マシンAには到達できているわけだしわざわざ異なるネットワークセグメントから通信する必要あるのかどうか、疑問に思った方もいるかもしれません。
私だってそう思います。
でも、やれって言われたらやるしかないじゃん。
いったいどういう目的があってこんなことをやらされたのか、終わった今でも謎です。