1 つのアダプタで複数のイーサネット ルーターに接続する

1 つのアダプタで複数のイーサネット ルーターに接続する

重複の可能性あり:
2つの異なるインターネット接続をブリッジする方法

1 つのイーサネット アダプタのみを使用して複数のルータに接続するための最適なアプローチとその副作用を探しています。
イーサネット ポートが 1 つある Linux PC が 1 台あり、スイッチに接続されています。 このスイッチは、異なるネットワーク (例: 192.168.1.1、192.168.2.1、192.168.3.1) を持つ複数のルータに接続されています。 次に、ソケットを特定の「デバイス」にバインドできるようにして、その接続に適切なルータを使用します。
各ルータに仮想 eth インターフェイスを作成し、それぞれに適切な ip/subnet/gw を設定することで、これを実現できると思います。
質問は、それが正しいかどうか、どのように行うか、奇妙な副作用を疑う必要があるかどうかです。
* すべてのルータを合わせた合計ネットワーク速度は 10M にも達しません。

答え1

ここでは仮想インターフェースは必要ありません。必要なのは、同じデバイスに複数の IP アドレスがあり、どのルーティング テーブルを使用するかを選択するためのポリシー ルーティングを備えた適切なルーティング テーブルです。次に、構成部分について説明します。IP アドレスを /32 で構成して、オンリンク ルートを自分で作成できるようにします。

ip addr flush dev eth0
ip addr add 192.168.1.yourhost/32 dev eth0
ip addr add 192.168.2.yourhost/32 dev eth0
ip addr add 192.168.3.yourhost/32 dev eth0

次にルーティング テーブルについて説明します。最初のルーティング テーブルは、LAN に送信されるパケットと一致します。

ip route add 192.168.1.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.2.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.3.0/24 dev eth0 src 192.168.1.yourhost table 2

table 2使用するルーティング テーブルを指定します。2 は任意の番号です。番号は、/etc/iproute2/rt_tables を編集することで名前にマッピングできます。そのファイルに追加してみましょう。2 lanこれで、 を簡単に使用できるようになりますtable lan

ここで、そのルーティング テーブルをデフォルトで使用してみましょう。

ip rule add table lan

ここで、 の出力を見るとip rule、次のようになります。

0:      from all lookup local 
99:     from all lookup lan
32766:  from all lookup main 
32767:  from all lookup default

localは、カーネルが IP アドレスが自身の IP アドレスであるかどうかを確認するために使用される予約済みのテーブルです。lanは、私たちが使用しているテーブルです。mainは、皆さんがご存知の通常のルーティング テーブルです。は、defaultルーティングできないパケット用の特別なテーブルです。基本的に、カーネルは、最初からこれらのルールを試し、そのテーブルでルートが見つからない場合は、次のルールに進みます。

そこで、LAN へのルートを配置する別のルーティング テーブルを追加しました。これはmainテーブルの前に試されます。次に、main にデフォルト ルートを追加しましょう。ソケットを IP アドレスにバインドしない場合は、このデフォルト ルートのみが使用されます。192.168.1.1 を選択しましょう。

ip route add default via 192.168.1.1 src 192.168.1.yourhost

ここで、ソケットを 192.168.2.yourhost にバインドする場合、そのデフォルト ルートではなく別のルートを使用する必要があります。このデフォルト ルートを別のルーティング テーブルに追加してみましょう。

ip route add default via 192.168.2.1 src 192.168.2.yourhost dev eth0 table 3
# and while we are at it, let's do this for 192.168.3.1 as well
ip route add default via 192.168.3.1 src 192.168.3.yourhost dev eth0 table 4

ここで、これらのルーティング テーブルを使用しますが、これはソケットがこれらの他の IP アドレスにバインドされている場合のみです。

ip rule add from 192.168.2.yourhost iif lo table 3
ip rule add from 192.168.3.yourhost iif lo table 4

from 192.168.2.yourhostパケット内の IP 送信元アドレスが 192.168.2.yourhost の場合のみ、カーネルがテーブルを試行するようにします。は、トラフィックがローカルで生成されたことを意味するiif特別な例外を除き、パケットが受信されたインターフェイスを指定できます (これはトラフィックを転送するときに便利です) iif lo

ip route getこれで、ルーティング テーブルをテストするコマンドを使用して、それが機能するかどうかを確認できます。

$ ip route get 192.168.2.5
192.168.2.5 dev eth0  src 192.168.2.yourhost 
    cache
$ ip route get 64.34.119.12
64.34.119.12 via 192.168.1.1 dev eth0 src 192.168.1.yourhost 
    cache
$ ip route get 64.34.119.12 from 192.168.2.yourhost
64.34.119.12 via 192.168.2.1 dev eth0 src 192.168.2.yourhost 
    cache

関連情報