
デュアル ポート イーサネット NIC があり、両方のポートをループで接続し、2 つのイーサネット インターフェイスに次の IP を割り当てたとします。
- eth2 -> 192.168.2.1
- eth3 -> 192.168.3.1
物理ネットワークを介して、ポートの 1 つから別のポートにトラフィックを送信したい (例:192.168.3.1
からping192.168.2.1
を送信する)。ただし、Linux カーネルの TCP/IP スタックは、これら 2 つのアドレスがローカルであることを認識し、代わりにトラフィックをループバック アダプターに送信するため、トラフィックは物理ネットワークに到達しません。
最も解決策に近いのはアナスタソフの自分宛て送信パッチ残念ながら、カーネル 3.6 以降は廃止されているため、Ubuntu 13.10 (カーネル 3.11) では動作しません。3.11 用のパッチを書き直してみましたが、Ubuntu ディストリビューションでこれらを見つけることができないようです。
- インクルード/linux/inetdevice.h
- ネット/ipv4/devinet.c
- ネット/ipv4/fib_frontend.c
- ネット/ipv4/route.c
- ドキュメント/ネットワーク/ip-sysctl.txt
自分宛て送信パッチを機能させる方法、または代替の解決策はありますか?
答え1
ネットワーク名前空間を作成し、インターフェースの 1 つをそこに移動します。
ip netns add test
ip link set eth1 netns test
新しい名前空間でシェルを起動します。
ip netns exec test bash
次に、2 台のマシンがあるかのように進めます。終了したら、シェルを終了し、名前空間を削除します。
ip netns del test
答え2
まだ試していませんが、回避策としてはいくつかの可能性があると思います。
仮想マシン
少なくとも 1 つの NIC をホストの IP スタックから分離して、IP スタックの問題を解決します。これを仮想マシンに割り当てます。ただし、パフォーマンス テストでは、これはあまり望ましくない場合があります。ただし、CPU パワーが十分であれば、追加のソフトウェア レイヤーがボトルネックにならない可能性があります (しかし、どのようにしてわかるのでしょうか)。
異なるターゲットアドレス
パケットをレイヤー 2 で転送するのは、NIC パフォーマンス テストのためだけだと思います。そのため、別の IP アドレス (ローカルではない IP アドレスで、パケットがいずれにしてもネットワーク経由で送信される) を持つ IP パケットを使用できます。次に、不正行為を行います。ip neigh
この偽の IP アドレスを他の NIC の MAC アドレスにマップする永続的な ARP エントリを作成するために を使用します。
この方法で IP 接続を行うこともできます。ただし、両方の NIC が 2 つの必要な偽の IP のいずれかと通信していると認識できるように、とiptables
を使用する必要があります。SNAT
DNAT
生のアクセス
多少の高度なプログラミングをしても構わないのであれば、raw ソケットを開いて Ethernet フレームを自分で作成することもできます。おそらくこれが最も速い解決策でしょう。