vethデバイスペアを介して2つのnetcatインスタンスを接続する方法は?

vethデバイスペアを介して2つのnetcatインスタンスを接続する方法は?

netcatveth(4) デバイスペアを介してインスタンスに接続したいと思います。

だから、次のようにvethペアを作成しますip

ip link add eth0 type veth peer name eth1
ip addr add 10.0.0.1/24 dev eth0
ip addr add 10.0.0.2/24 dev eth1
ip addr show eth0
13: eth0@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000                                                           
    link/ether 8a:74:8f:e7:dd:cd brd ff:ff:ff:ff:ff:ff 
ip addr show eth1
14: eth1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000                                                              
    link/ether a2:7e:07:be:9a:e2 brd ff:ff:ff:ff:ff:ff 

上記では、netcat元のネットワークデバイスではなくIPアドレスのみを聞くので、vethデバイスにIPアドレスを割り当てる必要があります。

ただし、netcat端末の eth0 でリスナーを起動し、他の端末から接続しようとした後、最初の端末で接続が受信されません。

netcat -n -vvvv -l -s 10.0.0.1 -p 8080
netcat -n -vvv 10.0.0.1 8080 # timeout
netcat -n -vvv 10.0.0.2 8080 # timeout

ルーティングテーブルを見ると、ipvethペアのルールが自動的に生成されるようです。

ip route 
default via 10.211.55.1 dev enp0s5 proto static metric 100 
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1
10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.2
...

私は何が間違っていましたか?

答え1

異なるネットワークネームスペースに配置する必要があることがわかりましたが、両方のvethペアにIPアドレスが割り当てられたときに単一のネームスペースで機能しない理由を教えてください。

以下のすべてが間違っている可能性があります。

  • アドレスを受信するアプリケーションが処理します。どのパケットのソースに関係なく、このアドレスに着信するパケット。したがって、パケットは両端から出てくることも、まったく異なるネットワークインタフェース(たとえばeth0)から来ることもあります。
  • Linuxカーネルがローカル宛先アドレスを検出すると、それはローカルパケットとして処理されるため、絶対にベスペアを通過しません。
  • Linuxカーネルパケットが受信パケットのローカルソースアドレスがローカルではないことを検出すると(つまり、veth-pairを介して着信)、これをルーティングエラーと見なします。なぜなら、通常の状況では、これはネットワークに誰かがいることを意味するからです。どこかにルーティングループがあります。ネットワークのフラッディングを防ぐために、パケットは廃棄されます。

eth0コンピュータに2つのLANネットワークインターフェイス(AND)があり、それをLANケーブルで接続する場合もeth1同様です。

したがって、vethペアを使用するには、ネットワークネームスペースを作成してください。

関連情報