netcat
veth(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
ルーティングテーブルを見ると、ip
vethペアのルールが自動的に生成されるようです。
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ペアを使用するには、ネットワークネームスペースを作成してください。