1つのPCが複数枚のネットワークアダプタを持ち、いずれのアダプタからもアクセスが可能な場合、スタティックルーティングの設定だけではうまく通信できない場合があります。
このような構成をマルチホーム、マルチホーミングな環境と呼ぶようですが、このときポリシーベースルーティングというものの設定が必要になってきます。
説明
まずは例として以下のような構成を考えてみます。
具体的には Host は Windows 10 PC で、 Server は CentOS7 を入れたものとします。
まさに先日のセグメントを繋いだときにはこんな環境でした。上記の eth0, eth1 はそれぞれ別のアダプタ名として見えていましたのでその辺は読み替えが必要です。
Host から Server へ eth1 に向けて通信を行ったとき、デフォルトゲートウェイが Server での eth0 の先となっていた場合、返答経路が異なってしまい正常に通信が不可能です。
サーバーは受信したアダプタから返答を返したいところです。この設定をするのがポリシーベースルーティングとなります。
今回 eth0 のほうが 172.16.0.100 が割り当てられており、デフォルトゲートウェイはこちら側を使って出て行くという設定がされているものとします。
eth1 (172.16.1.101) のほうに着たリクエストについて、こちらから出て行くようにしたい、といったことを設定していきます。
経路テーブルIDの設定
/etc/iproute2/rt_tables ファイルを開きます。そして末尾に記述を追加します。
標準のものよりも優先されるように 202 あたりを設定しました。
#1 inr.ruhep 202 rule202
ルールファイルの作成
/etc/sysconfig/network-scripts/ ディレクトリにファイルを作成します。
rule-(インターフェース名) という名前でファイルを作成して、中身には以下のようにしておきます。
from 172.16.1.101 table rule202
↑これは受け付けた自身の IP アドレスを記載して、それに対してはどのルールを適用するかといったものになります。
ルーティングファイルの作成
/etc/sysconfig/network-scripts/ ディレクトリにファイルを作成します。
route-(インターフェース名) というファイル名で作成して、中身には以下のようにしておきます。
172.16.1.0/24 dev eno12345678 table rule202 default via 172.16.1.254 table rule202
これは、 「172.16.1.0を参照するのが eno12345678 だったら、 rule202 を使う」ということと、rule202 のデフォルトゲートウェイは 172.16.1.254 である、といった指示を記述したものになっています。
再起動
設定を反映させるために systemctl restart network.service を実行します。うまくいかないようだったら、OSごと再起動してしまった方がよいかもしれません。
確認
Host からサーバーのそれぞれの IP アドレスに対して、 ping を打ってみます。これで返答が返ってくれば無事にそれぞれのインターフェースから応答を返しているようになっています。
サーバー側で tcpdump を使って、応答を各インターフェースから出していることを見るのもよいかと思われます。
追記
直接設定ファイルを書き込む方法では無い方法はこちらが参考になりました。
http://takumicloud.jp/blog/2015/11/30/nw/
こちらの説明もわかりやすいですね。
コメント