web-dev-qa-db-ja.com

2つのインターフェース、2つのアドレス、2つのゲートウェイ?

私は異なるIPアドレスを持つ2つのネットワークインターフェイスを備えたシステムを持っています。どちらもパブリックアドレスの範囲にあります(ただし、最初の場合はNATを介して))。両方とも異なります。ゲートウェイ(長い話ですが、テスト用です)

問題は、現在、2番目のインターフェイスのアドレスにpingを実行しようとすると、デフォルトルートが最初のインターフェイスを経由してポイントし、正しく到達しないことです。

応答が常に同じネットワークインターフェイス(および同じソースIP)に送信されるようにすることは可能ですか?もしそうなら、どうやって?

15
Shadur

あなたは問題を誤解しています。すべてのパケットが応答であるとは限らず、すべてのパケットが他のパケットと一致しているわけではないため、「同じネットワークインターフェイスが入ってくる」ことが理にかなっています。あなたがしたいことは、ソースIPアドレスに基づいてパケットのゲートウェイを選択することです。

これは、送信元ベースのルーティングまたはポリシールーティングと呼ばれます。 simple iptables rule を使用してこれを行うことができますが、最善の方法は、パブリックソースアドレスごとに1つずつ、2つのルーティングテーブルを設定することです。

まず、2つのテーブルを作成します(<NAME1>と<NAME2>を、IP1、DEV1などと同じ2つのプロバイダーの適切な名前に置き換えます)。

echo 200 <NAME1> >> /etc/iproute2/rt_tables
echo 201 <NAME2> >> /etc/iproute2/rt_tables

各ルーティングテーブルにゲートウェイを追加します(必要な場合)。

ip route add <NET1> dev <DEV1> src <SRC1> table <NAME1>
ip route add <NET2> dev <DEV2> src <SRC2> table <NAME2>

次に、デフォルトルート:

ip route add default via <IP1> table <NAME1>
ip route add default via <IP2> table <NAME2>

次に、送信元アドレスに基づいてルートテーブルを選択するルール:

ip rule add from <IP1> table <NAME1>
ip rule add from <IP2> table <NAME2>

詳細は 複数のアップリンク/プロバイダーのルーティング を参照してください。

18
David Schwartz

デビッド・シュワルツの答えは素晴らしいですが、追加のテーブルを1つだけ用意し、もう一方にデフォルトルートを使用することで、ルーティングルールを少し簡略化できます。 2つのNATゲートウェイの背後にあるサーバーがあり、最近、一連のVM間でそのシナリオを再作成するプロセスを実行しました。私の/etc/network/interfacesは次のようになります:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.13.13
    netmask 255.255.255.0
    up ip route add table optus default via 192.168.13.10
    up ip rule add from 192.168.13.213 table optus
    up ip route add default via 192.168.13.11

auto eth0:0
iface eth0:0 inet static
    address 192.168.13.213
    netmask 255.255.255.0

(これは、2つのISPがOptusとiiNetであるため、テーブル名が「optus」である設定用です)

これに加えて、テーブルを作成する/etc/iproute2/rt_tablesの行が必要なだけです。 2つのIPアドレスがあります。 192.168.13.13からのトラフィックは192.168.13.11経由で送信され、192.168.13.213からのトラフィックは192.168.13.10経由で送信されます。これらの2つのゲートウェイがポート転送を適切に行うように構成し(192.168.13.11は192.168.13.13に転送し、192.168.13.10は192.168.13.213に転送する)、残りは自分で処理する必要があります。

パブリックIPを直接使用しているため、状況に応じて少し調整する必要があるかもしれませんが、このようなものはまだ機能するはずです。また、これらのことを/etc/network/interfacesで実行し、そのファイルをgit-manageする方が、2年後にシステムを再起動する必要があるときに、設定方法を覚えるよりもはるかに簡単です。

6
rosuav

デュアルネットワークの例

この例は、追加のeth110.130.0.2ネットマスク255.255.255.255およびゲートウェイ10.130.0.1を、ping -I eth1 8.8.8.8のようにバインドするサービスで利用できるようにする方法を示しています。

技術的には次のとおりです。

  • より大きなメトリックを持つ他のゲートウェイを追加する
  • テーブル100の追加/使用と設定
  • Eth1との間でトラフィックをルーティングするルールを追加する
ip addr add 10.130.0.2/32 broadcast 10.130.0.2 dev eth1
ip link set eth1 up
ip route add 10.130.0.1 src 10.130.0.2 dev eth1
ip route add 10.130.0.1 src 10.130.0.2 dev eth1 table 100
ip route add default via 10.130.0.1 dev eth1 metric 10
ip route add default via 10.130.0.1 dev eth1 table 100
ip rule add from 10.130.0.2/32 table 100
ip rule add to 10.130.0.2/32 table 100
curl --interface eth1 ifconfig.co
curl --interface eth0 ifconfig.co
ping -I eth1 8.8.8.8
1
intika