AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 511783
Accepted
JenyaKh
JenyaKh
Asked: 2019-04-11 15:19:58 +0800 CST2019-04-11 15:19:58 +0800 CST 2019-04-11 15:19:58 +0800 CST

对于 veth 对,ping 无法识别接口名称并且 tc qdisc netem 不起作用

  • 772

我有带有 hwe 内核 4.13.0-39-generic 的 Ubuntu 16.04 LTS。我在默认网络命名空间中配置 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,这怎么会是个问题?

我相信第二个问题是相关的。我将接口配置如下:

$ 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 不适用于我的接口。

所以总的来说,我看到我的配置在某种程度上被破坏了。

networking network-interface
  • 1 1 个回答
  • 1936 Views

1 个回答

  • Voted
  1. Best Answer
    JenyaKh
    2019-04-13T05:23:01+08:002019-04-13T05:23:01+08:00

    我在下面回答我自己的问题。

    最简单的规避(我的方法):将一对 veth 放到另一个网络命名空间。让我们称之为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上。

    如果请求的 IP 地址与另一个(禁用的)接口相关联并且主题启动器收到了一些解释,但问题仍未解决,则在此处提出了与 ARP 相关的问题。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 对的一端位于另一个网络命名空间中时,我们不会出现两个地址同时放置在本地路由表中的情况。所以,很可能,这就是为什么我们没有这样的问题。我试图从本地路由表中删除地址(仅其中一个或两者 - 以不同的组合),但没有帮助。总的来说,我并不完全理解这种情况,所以我只会坚持将 veth 对的末端设置到不同的网络命名空间中。更重要的是,据我所知,这就是 veth 对的主要使用方式。

    • 2

相关问题

  • 关于网络挂载文件的问题

  • IP地址可以以255结尾而不是广播IP地址吗?

  • 无法识别arp命令或ip命令哪个MAC地址输出正确

  • 通过静态 IP(NAT?)访问 VM

  • 奇怪的路由器与centos 6一起工作[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve