難しいケースがあります:
+---+ +----+
|D1 +->eth0---------<-eth0-+D2 |
| | | |
| +->eth1---------<-eth1-+ |
+---+ +----+
D2 と にはeth0
同じeth1
サブネットからの IP アドレスがあります: eth0
10.1.1.1/24
、eth1
10.1.1.2/24
。D1 のインターフェースにはアドレスが割り当てられておらず、スイッチのように動作します。
10.1.1.2
ここで、D2 が経由でトラフィックを送信できるようにしたいeth0
ので、パケット パスは D2(eth0)--D1(eth0)--D1(eth1)--D2(eth1) である必要があります。
現時点では、10.1.1.2
D2 から ping するとパケットがローカルに送信されるので、D1 はパケットを受信しません。目的の動作を実現するには、D2 で何を変更すればよいでしょうか?
ありがとう。
答え1
あなたが望むことは Linux では不可能です。少なくともルーティング層内では不可能です。ターゲット アドレスがローカル インターフェイスに属している場合、パケットは常にループバック インターフェイスを通過し、そこから (RfC によって) 外部にルーティングすることはできません。
ターゲットをサブネット内の未使用のアドレスに変更し、他の NIC の 1 つに MAC アドレスを静的に設定するために を使用することは可能かもしれないと考えましたがiptables
、ローカル アドレスへのパケットに対してルールが一致しません。DNAT
ip neigh
DNAT
10.1.1.1
仮想マシンまたはネットワーク名前空間を使用すると、カーネルが を認識しないようにすることが可能ですeth0
。ただし、着信パケットを物理インターフェイスから仮想インターフェイスに移動するには、プロキシ ARP と DNAT が必要になります。
その努力に価値があるかどうか?
答え2
ネットワーク名前空間はオプションになる場合があります。ネットワーク名前空間は本質的にネットワーク スタックの独立したインスタンスであるため、少なくとも理論上は 2 つのインターフェイスを分離できるはずです。
前回、試してみたのですが、うまく動作しませんでした。