Linuxで2つのデフォルトルートを設定する方法(2つのインターフェースに対応)、両方のインターフェースからの着信トラフィックが受け入れられるようにします。
2つのNIC eth0
とeth1
を持つホストがあります。 2つのネットワークに接続されている、たとえば:
開発:eth0
、IP:1.1.1.4
、ネットマスク:255.255.255.0
、ゲートウェイ:1.1.1.1
開発:eth1
、IP:2.2.2.4
、ネットマスク:255.255.255.0
、ゲートウェイ:2.2.2.1
(どちらのネットワークもインターネットに接続されています。)
ルートは(ip route show
)です。
default via 1.1.1.1 dev eth0 metric 1
default via 2.2.2.1 dev eth1 metric 2
1.1.1.0/24 dev eth0 src 1.1.1.4
2.2.2.0/24 dev eth1 src 2.2.2.4
(メトリックが低いほど優先度が高くなります。)
これで、誰かが外部ホストから2.2.2.4
にpingした場合(4.4.4.4
など)、応答がありません。
私のホストでのtcpdump -i eth1
の出力は次のとおりです。
22:41:27.431539 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 4, length 64
22:41:28.439492 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 5, length 64
22:41:29.447666 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 6, length 64
22:41:30.455528 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 7, length 64
調査の結果、Linuxネットワークスタックが4.4.4.4
からパケットを受信すると、ルーティングテーブルをチェックして、4.4.4.4
(eth0
inルーティングテーブル)。さて、パケットはeth1
インターフェースから来たので、linuxは単にそれを破棄します(このポリシーはおそらくIPスプーフィングを防ぐためです)。
私が欲しいのは:
発信トラフィック(ローカル発信)は、デフォルトでeth0
インターフェースを使用する必要があります。
着信トラフィックは、両方のインターフェイスから受け入れられる必要があります。 (つまり、4.4.4.4
は1.1.1.4
と2.2.2.4
の両方にpingできるはずです)
Iproute2を使用すると、次のようなことができます。
echo "1 admin" >> /etc/iproute2/rt_tables
echo "2 users" >> /etc/iproute2/rt_tables
ip rule add from 192.168.122.40/32 dev eth0 table admin
ip rule add from 192.168.123.41/32 dev eth1 table users
ip route add default via 192.168.122.1 dev eth0 table admin
ip route add default via 192.168.123.1 dev eth1 table users
これで、2つのゲートウェイを持つ2つのルーティングテーブルが作成されます。
この現象は、Linuxでは標準ですがリバースパスフィルターとしてユニキャストrpf(リバースパス転送)と呼ばれます。重要な悪影響なしにこれを無効にすることができます(isp ..とルーターでない限り)。
echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
その後、あなたの例はあなたが望むように機能するはずです。
アプリケーションが0.0.0.0
にバインドする場合は、次のようなルールも追加する必要があります。
ip rule add from 0.0.0.0/32 to 192.168.122.0/24 dev eth0 table admin
ip rule add from 0.0.0.0/32 to 192.168.123.0/24 dev eth1 table users