LANケーブルを1つのホストの2つのNISポートに直結するとpingは成功しますが実際には信号はケーブルを通して送受信されません。これはOSによってルーティングが解決され、ホスト内部で通信を行うためです。しかし、これではNICやケーブルの導通をテストしたい場合には不適です。一方でそのために対向機を用意するのもやや面倒です。
最近のLinuxではipコマンドのnetns機能を使ってネットワーク名前空間を使うとこの問題を解決できます。ip netnsにはついてはこの辺りを参照のこと。
以下ではeth0~eth4がある状況で、eth0→eth4にpingテストを実施することを考えてみます。
概要
eth0とeth4を接続してそれぞれにIPアドレス192.168.1.1/192.168.1.254を設定すると以下の様になります。この状態でping 192.168.1.254をしてもOSは自分自身に192.168.1.254が割り当てられていることを知っているため、内部通信(ローカルループバック)を行います。わざわざNICを動作させる様なことはしません。
ここでeth4をns-targetというネットワーク名前空間に分離してみます。するとeth4のIPアドレスはデフォルト名前空間のルーティングテーブルからは見えなくなるので、同一のネットワークアドレス(192.168.1.0/24)を持つeth0からICMPパケットを送出する様になります。
手順
まずeth4を設定します。名前空間を作成してeth4を移動、その名前空間の中でIPアドレスを設定して立ち上げます。
# ip netns add ns-target
# ip link set eth4 netns ns-target
# ip netns exec ns-target ip addr add dev eth4 192.168.1.254/24
# ip netns exec ns-target ip link set eth4 up
後は普通にeth0を192.168.1.0/24の範囲でIPアドレスを設定して、192.168.1.254宛てにpingするとちゃんとケーブルを介して信号が送受信されます。
# ip addr add dev eth0 192.168.1.1/24
# ip link set eth0 up
# ping 192.168.1.254
:
# ip link set eth0 down
pingテストが終わったら名前空間を削除するのを忘れずに。
# ip netns delete ns-target
おまけ
eth0も別の名前空間に設定する方法もあります。
コマンドが多くて手間ですが、名前空間を削除する時に設定したIPアドレスがリセットされるのが利点です。
既に使用中でIPアドレスが設定してある状態からテストする時に便利です。
# ip netns add ns0
# ip netns add ns4
# ip link set eth0 netns ns0
# ip link set eth4 netns ns4
# ip netns exec ns0 ip addr add dev eth0 192.168.1.1/24
# ip netns exec ns4 ip addr add dev eth4 192.168.1.254/24
# ip netns exec ns0 ip link set eth0 up
# ip netns exec ns4 ip link set eth4 up
# ip netns exec ns0 ping -c 10 192.168.1.254
# ip netns delete ns0
# ip netns delete ns4

