理解linux虚拟网络设备veth

上一章介绍了linux network namespace,接着来讨论一下如何让一个独立的网络命名空间的和主机的网络相互通信,这里我们需要用到linux虚拟网络设备veth。

veth设备

veth设备总是成对出现,通常就是用来连接不同网络命名空间(下面开始简称NS),一端连着NS1的内核协议栈,另一端连着NS2的内核协议栈,一端发送的数据会被另一端接收。

理解linux虚拟网络设备veth

我们接下来试一下创建一个新的NS,然后跟主机的NS连接起来

通过下面的命令可以创建一对VETH设备

ip link add veth0 type veth peer name veth1

然后创建一个新NS

ip netns add ns1

然后把刚创建的VETH网卡的其中一端转到NS1,这就好像一端插到NS1上,另一端插在主机的NS上

ip link set veth0 netns ns1

给两端都设置个IP,设置veth0时,要用ip netns exec ns1,因为veth0此时在ns1中,

ip netns exec ns1 ip addr add 192.168.10.10/24 dev veth0
ip addr add 192.168.10.11/24 dev veth1

把两张网卡都启动起来

ip netns exec ns1 ip link set veth0 up
ip link set veth1 up 

此时的状态如下:

理解linux虚拟网络设备veth

然后,就可以相互PING通了

[root@worker2 ~]# ping 192.168.10.10 -c 5
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.060 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.090 ms
64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.071 ms
64 bytes from 192.168.10.10: icmp_seq=5 ttl=64 time=0.064 ms

[root@worker2 ~]# ip netns exec ns1 ping 192.168.10.11 -c 5
PING 192.168.10.11 (192.168.10.11) 56(84) bytes of data.
64 bytes from 192.168.10.11: icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from 192.168.10.11: icmp_seq=2 ttl=64 time=0.052 ms
64 bytes from 192.168.10.11: icmp_seq=3 ttl=64 time=0.073 ms
64 bytes from 192.168.10.11: icmp_seq=4 ttl=64 time=0.059 ms
64 bytes from 192.168.10.11: icmp_seq=5 ttl=64 time=0.075 ms

此时我们进ns1中去ping主机是ping不通的,因为现在ns1中只有一个系统自动生成的路由,没有默认路由,这个后面再讨论。

如果我们进到ns1中发现PING本地地址不通的话,有可能只是因为lo网卡没有启动起来

ip netns exec ns1 ip link set lo up

当然,在实际场景中,很少会这样用,因为每新建一个NS,就会需要两个IP地址,比较浪费IP不说,还不好管理,当我们给veth1设置ip的时候,主机会悄悄为我们生成一条路由:

192.168.10.0/24 dev veth5 proto kernel scope link src 192.168.10.11

这条路由指示以后凡是往192.168.10.0/24这个网段的地址都给veth1,这显然不是我们想要的结果,因为其它的ns并没有连在veth1上,虽然我们现在只是在讨论VETH设备,但最终我们的目的还是要为容器网络服务的,相同主机的pod通常会在同一个cidr上,前面那条路由就相当于把这个主机的全部pod的通信都引到了veth1上,这就有问题了。

容器连接主机

其实,我们是可以不在veth1上配置IP的,上面的示例只是为了让大家可以对veth连接的效果有个认识,因为veth1连的是主机的内核协议栈,主机上已经有很多个IP了,只是因为当前ns1中没有默认路由,去主机的IP的话是不通的(当然如果你的主机的网段本来就是192.168.10.0/24网段,那又是能通的),只要加上默认路由就可以了,下面我们演示一个更实用的场景。

直接上命令,在这就不一句句解释了:

ip link add veth2 type veth peer name veth3
ip netns add ns2
ip link set veth2 netns ns2
ip netns exec ns2 ip addr add 192.168.10.12/24 dev veth2
ip netns exec ns2 ip link set veth2 up
ip link set veth3 up 

打开主机这一端veth3的arp代答,然后给ns2加上默认路由,并且也告诉主机去往ns2应该走veth3:

echo 1 > /proc/sys/net/ipv4/conf/veth3/proxy_arp
ip netns exec ns2 ip route add 0.0.0.0/0 via 169.2.2.2 dev veth2 onlink
ip route add 192.168.10.12 dev veth3 scope link

为什么ns2的默认路由是个这么奇怪的IP?后面会解释

此时整个状态如下图:

理解linux虚拟网络设备veth

已经可以ping通了:

[root@worker2 ~]# ping 192.168.10.12 -c 5
PING 192.168.10.12 (192.168.10.12) 56(84) bytes of data.
64 bytes from 192.168.10.12: icmp_seq=1 ttl=64 time=0.188 ms
64 bytes from 192.168.10.12: icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from 192.168.10.12: icmp_seq=3 ttl=64 time=0.077 ms
64 bytes from 192.168.10.12: icmp_seq=4 ttl=64 time=0.080 ms
64 bytes from 192.168.10.12: icmp_seq=5 ttl=64 time=0.079 ms

--- 192.168.10.12 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.068/0.098/0.188/0.045 ms

那ns1和ns2能不能相互ping通呢?行的,不过要先打开veth1的arp代答,并给ns1配个默认网关

echo 1 > /proc/sys/net/ipv4/conf/veth1/proxy_arp
ip netns exec ns1 ip route add 0.0.0.0/0 via 192.168.10.11 dev veth0 onlink

如无意外,在ns1上ping ns2应该是通了,当然记得要打开主机的路由转发功能:

echo 1 > /proc/sys/net/ipv4/ip_forward

ns1 PING ns2的情况:

[root@worker2 ~]# ip netns exec ns1 ping 192.168.10.12 -c 5
PING 192.168.10.12 (192.168.10.12) 56(84) bytes of data.
64 bytes from 192.168.10.12: icmp_seq=1 ttl=63 time=0.450 ms
64 bytes from 192.168.10.12: icmp_seq=2 ttl=63 time=0.105 ms
64 bytes from 192.168.10.12: icmp_seq=3 ttl=63 time=0.089 ms
64 bytes from 192.168.10.12: icmp_seq=4 ttl=63 time=0.094 ms
64 bytes from 192.168.10.12: icmp_seq=5 ttl=63 time=0.112 ms

--- 192.168.10.12 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.089/0.170/0.450/0.140 ms
上一篇:[win10] 开始-设置 / 右键-显示设置 / 右键个性化 等都不好使了。。 ms-settings:display


下一篇:2021-07-12