LoginSignup
3
4

More than 3 years have passed since last update.

複数NICを持つマシンでポリシーベースルーティング

Posted at

はじめに

私はデータベース、特にPostgreSQLが専門(?)なのですが、求められれば付け焼き刃で勉強しながらネットワークの設定もやったりします。
今回は、複数NICを持つLinuxマシンに対して、1つのNICのみを持つマシンから両方のNICに対して通信をすることになりました。

どういうことかというと

次の図を御覧ください。
001.png

青の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

このネットワーク構成でつまり、次の図のようなことがしたいわけです。

002.png

非対称ルーティング

実はこのネットワーク構成では、やりたいことが上手くできません。pingを飛ばしても返ってこないのです。
どうしてそうなるのか。マシンBからマシンAへの通信がどうなっているかを説明します。

まず、マシンBは同一セグメント上にない「192.168.10.2」というIPアドレスがどこにあるか自分ではわかりません。そういうときは、デフォルトゲートウェイに問い合わせに行きます。

0003.png

ゲートウェイはルーティング情報から、宛先のアドレスのネットワークに向けて中継します。

004.png

マシンAまで届くとマシンAは何を血迷ったか、受信したNIC1ではなく送信元のマシンBが接続している緑のセグメントと同セグメントのNIC0から返信しようとします。
005.png

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

これで、設定が上手くいっていれば、当初の目的が実行できているはずです!お疲れ様でした!

余談

次の図を御覧ください。

006.png

このような通信は、同一セグメント内であり、全く問題なく行えます。それなら別に、マシンAには到達できているわけだしわざわざ異なるネットワークセグメントから通信する必要あるのかどうか、疑問に思った方もいるかもしれません。

私だってそう思います。

でも、やれって言われたらやるしかないじゃん。

いったいどういう目的があってこんなことをやらされたのか、終わった今でも謎です。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4