之前创建了一个 veth pair
veth0 10.10.10.1
veth1 10.10.10.2
这里他们都在一个网段上,如果你使用 ping 命令直接 ping 它们都可以ping通
但是 ping -I veth0 10.10.10.2 使用 veth0 ping veth1 是 ping不通的
我们尝试使用 tcpdump 来看看发生了什么
可以看到 veth1 没有相应 ARP 包,所以没有ping通
下面是cloud_dev上的解释
使用 root 用户修改内核中关于 ARP 的配置
# Linux IP 路由实现中有个限制,即任何从非 loopback 网卡进来的任何数据包的源地址不能是本机地址。因此要先取消该限制 echo 1 > /proc/sys/net/ipv4/conf/veth1/accept_local echo 1 > /proc/sys/net/ipv4/conf/veth0/accept_local # 假设一台主机从接口 A 收到一个包,其源地址为 <srcip> , echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/veth0/rp_filter echo 0 > /proc/sys/net/ipv4/conf/veth1/rp_filter |
再试一次
可以看到 ARP 通过了,我们的 IP 10.10.10.2 成功转换成了 52:e8:fe:e7:8b:05 ,但是仍然不通,
只有 ICMP echo request , 没有 reply , 根据上面的解释,reply应该通过 localback 接口返回
监听一下 localback 接口得到
可以看到确实有 ICMP 的 reply 从 veth1 返回给 veth0 , 但是为什么还是没 ping 通呢
字段 |
说明 |
Destination |
目标网络或目标主机。Destination 为 default(0.0.0.0)时,表示这个是默认网关,所有数据都发到这个网关。 |
Gateway |
网关地址,0.0.0.0 表示当前记录对应的 Destination 跟本机在同一个网段,通信时不需要经过网关。如果没有就显示星号(*)。 |
Genmask |
Destination 字段的网络掩码,Destination 是主机时需要设为 255.255.255.255,是默认路由时会设置为 0.0.0.0 |
Flags |
标记 ● U 该路由可以使用。
● H 该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网络号与子网号的组合。
● G 该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地 是直接相连的。
● R 恢复动态路由产生的表项。
● D 该路由是由改变路由(redirect)报文创建的。
● M 该路由已被改变路由报文修改。
● ! 这个路由将不会被接受。 |
Metric |
路由距离,到达指定网络所需的中转数,是大型局域网和广域网设置所必需的。 |
Ref |
路由项引用次数 。 |
Use |
此路由项被路由软件查找的次数。 |
Iface |
网卡名字,例如 eth0。 |