
Ubuntu 16.04 LTSとhweカーネル4.13.0-39-genericがあります。次のように、デフォルトのネットワーク名前空間に veth ペアを設定します。
$ sudo ip link add h1-eth0 type veth peer name h2-eth0
$ sudo ip link set dev h1-eth0 up
$ sudo ip link set dev h2-eth0 up
$ sudo ip addr add 10.0.0.1/24 dev h1-eth0
$ sudo ip addr add 10.0.0.2/24 dev h2-eth0
上記の構成後に取得した設定は次のとおりです。
$ ifconfig
...
h1-eth0 Link encap:Ethernet HWaddr ea:ee:1e:bb:66:55
inet addr:10.0.0.1 Bcast:0.0.0.0 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
...
h2-eth0 Link encap:Ethernet HWaddr ba:aa:99:77:ff:78
inet addr:10.0.0.2 Bcast:0.0.0.0 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
...
$ ip route show
10.0.0.0/24 dev h1-eth0 proto kernel scope link src 10.0.0.1
10.0.0.0/24 dev h2-eth0 proto kernel scope link src 10.0.0.2
...
これで、あるインターフェイスから別のインターフェイスにpingを送信できます。
$ ping -I 10.0.0.1 -c1 10.0.0.2
PING 10.0.0.2 (10.0.0.2) from 10.0.0.1 : 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.046 ms
--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.046/0.046/0.046/0.000 ms
しかし、最初の問題は、IPアドレスの代わりにインターフェイス名を使用してpingを試みるとpingが失敗することです。
$ ping -I h1-eth0 -c1 10.0.0.2
PING 10.0.0.2 (10.0.0.2) from 10.0.0.1 h1-eth0: 56(84) bytes of data.
From 10.0.0.1 icmp_seq=1 Destination Host Unreachable
--- 10.0.0.2 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
h1-eth0のIPアドレスが10.0.0.1の場合、これはどのように問題になりますか?
2番目の質問も関連していると思います。インターフェイスを次のように設定しました。
$ sudo tc qdisc add dev h1-eth0 root netem delay 60ms
$ sudo tc qdisc add dev h2-eth0 root netem delay 60ms
$ tc qdisc show
qdisc netem 8006: dev h2-eth0 root refcnt 2 limit 1000 delay 60.0ms
qdisc netem 8005: dev h1-eth0 root refcnt 2 limit 1000 delay 60.0ms
これで、遅延状態に戻ってpingを送信します。
$ ping -I 10.0.0.1 -c4 10.0.0.2
PING 10.0.0.2 (10.0.0.2) from 10.0.0.1 : 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.059 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.027 ms
--- 10.0.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3063ms
rtt min/avg/max/mdev = 0.027/0.038/0.059/0.013 ms
そしてrttが予想される60ms*2=120msではないことがわかります。だから私はtc qdisc netemが私のインターフェースで動作しないようです。
全体的に私の構成が何らかの方法で破損していることがわかりました。
答え1
私は以下に私自身の質問に答えます。
最も簡単な回避策(私の方法):vethペアの1つを別のネットワーク名前空間に入れます。ただそう呼んでくださいtest
。
$ sudo ip netns add test
$ sudo ip link add h1-eth0 type veth peer name h2-eth0 netns test
$ sudo ip link set dev h1-eth0 up
$ sudo ip netns exec test ip link set dev h2-eth0 up
$ sudo ip addr add 10.0.0.1/24 dev h1-eth0
$ sudo ip netns exec test ip addr add 10.0.0.2/24 dev h2-eth0
$ sudo tc qdisc add dev h1-eth0 root netem delay 60ms
$ sudo ip netns exec test tc qdisc add dev h2-eth0 root netem delay 60ms
次に、次のことを確認します。
$ ping -I h1-eth0 -c1 10.0.0.2
PING 10.0.0.2 (10.0.0.2) from 10.0.0.1 h1-eth0: 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=120 ms
--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 120.056/120.056/120.056/0.000 ms
$ sudo ip netns exec test ping -I h2-eth0 -c1 10.0.0.1
PING 10.0.0.1 (10.0.0.1) from 10.0.0.2 h2-eth0: 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=120 ms
--- 10.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 120.146/120.146/120.146/0.000 ms
他の方法
私の質問が要求されましたが、まだ答えられていないことを確認しました。https://serverfault.com/questions/585246/network-level-of-veth-doesnt-respond-to-arp。そこから問題がARPにあることがわかります。
ARPの問題に関する質問はこちらをご覧ください。要求されたIPアドレスが他の(無効になった)インターフェイスに関連付けられている場合、LinuxはARP要求メッセージに応答しません。スレッドイニシエータの説明がありますが、問題は未解決のままです。
問題は、アドレス10.0.0.1と10.0.0.2がメインルーティングテーブルだけでなくローカルルーティングテーブルにも現れ、ローカルルーティングテーブルがメインルーティングテーブルよりも優先順位が高いことです。私の質問の初期設定テーブルは次のとおりです。つまり、vethペアの一方の端を別のネットワークネームスペースに入れないことですtest
。
$ ip route show table local
broadcast 10.0.0.0 dev h1-eth0 proto kernel scope link src 10.0.0.1
broadcast 10.0.0.0 dev h2-eth0 proto kernel scope link src 10.0.0.2
local 10.0.0.1 dev h1-eth0 proto kernel scope host src 10.0.0.1
local 10.0.0.2 dev h2-eth0 proto kernel scope host src 10.0.0.2
broadcast 10.0.0.255 dev h1-eth0 proto kernel scope link src 10.0.0.1
broadcast 10.0.0.255 dev h2-eth0 proto kernel scope link src 10.0.0.2
...
$ ip route show table main
10.0.0.0/24 dev h1-eth0 proto kernel scope link src 10.0.0.1
10.0.0.0/24 dev h2-eth0 proto kernel scope link src 10.0.0.2
...
vethペアの一方の端が別のネットワーク名前空間にある場合、両方のアドレスを同時にローカルルーティングテーブルに配置することはできません。それでおそらく私たちにはそのような問題がないようです。ローカルルーティングテーブルからアドレスを削除しようとしましたが(1つまたは両方 - 他の組み合わせで)、役に立ちませんでした。全体的に状況を完全に理解していないので、vethペアの終わりを別のネットワーク名前空間に設定する方法に固執します。さらに、私が知っている限り、これはvethペアが使用される主な方法です。