veth pair

veth pair 全称是 Virtual Ethernet Pair,是一个成对的端口,所有从这对端口一 端进入的数据包都将从另一端出来,反之也是一样。

引入 veth pair 是为了在不同的 Network Namespace 直接进行通信,利用它可以直接将两个 Network Namespace 连接起来。

 

用户可以使用ip link命令增加veth pair设备,下面的范例中该veth pair设备的两个网卡为veth20和veth21:

ip link add veth20 type veth peer name veth21

创建出来的网卡设备位于当前系统空间中,查看:

[root@worker2 ~]# ifconfig  -a

veth20: flags=4098<BROADCAST,MULTICAST>  mtu 1500

        ether d2:a0:a1:fd:2a:7e  txqueuelen 1000  (Ethernet)

        ...

veth21: flags=4098<BROADCAST,MULTICAST>  mtu 1500

        ether 36:4c:d6:8e:2e:10  txqueuelen 1000  (Ethernet)

bridge

veth pair 打破了 Network Namespace 的限制,实现了不同 Network Namespace 之间的通信。但 veth pair 有一个明显的缺陷,就是只能实现两个网络接口之间的通信。

如果我们想实现多个网络接口之间的通信,就可以使用下面介绍的网桥(Bridge)技术。

简单来说,网桥就是把一台机器上的若干个网络接口 “连接” 起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。

 

bridge的工作原理

网桥对报文的转发基于 MAC 地址。网桥能够解析收发的报文,读取目标 MAC 地址的信息,和自己记录的 MAC 表结合,来决策报文的转发目标网口。

为了实现这些功能,网桥会学习源 MAC 地址,在转发报文时,网桥只需要向特定的网口进行转发,从而避免不必要的网络交互。

如果它遇到一个自己从未学习到的地址,就无法知道这个报文应该向哪个网口转发,就将报文广播给所有的网口(报文来源的网口除外)。

 

bridge的实现

Linux 内核是通过一个虚拟的网桥设备(Net Device)来实现桥接的。这个虚拟设备可以绑定若干个以太网接口设备,从而将它们桥接起来。如下图所示:

 

如上图所示,网桥设备 br0 绑定了 eth0 和 eth1。

对于网络协议栈的上层来说,只看得到 br0,上层协议栈需要发送的报文被送到 br0,网桥设备的处理代码判断报文该被转发到 eth0 还是 eth1,或者两者皆转发;反过来,从 eth0 或 eth1 接收到的报文被提交给网桥的处理代码,在这里会判断报文应该被转发、丢弃还是提交到协议栈上层。

而有时 eth0、eth1 也可能会作为报文的源地址或目的地址,直接参与报文的发送与接收,从而绕过网桥。

brctl

我们看下网桥的创建和使用,linux下提供了brctl命令管理网桥,和网桥有关的操作可以使用命令 brctl。

实验目标:创建网桥br0,并分配IP地址172.16.0.1作为连接本网桥设备的网关地址。

操作过程:

Step1:创建网桥:

[root@worker2 ~]# brctl addbr br0
[root@worker2 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no

Step2:分配IP地址,并启用此网桥:

[root@worker2 ~]# ip addr add 172.16.0.1/24 dev br0
[root@worker2 ~]# ifconfig br0 up
[root@worker2 ~]# ifconfig br0
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.0.1  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::145a:1cff:fe94:fe47  prefixlen 64  scopeid 0x20<link>
        ether 16:5a:1c:94:fe:47  txqueuelen 1000  (Ethernet)

到此,我们就可以把这个网桥当做系统中的一个交换机设备使用了,该交换机同时提供了网关功能。

连接bridge和veth pair

接下来我们来验证namespace与bridge的联通,最终网络图如下:

操作过程:

Step1:创建两个namespace,nns1和nns2:

[root@worker2 ~]# ip netns add nns1

[root@worker2 ~]# ip netns add nns2

[root@worker2 ~]# ip netns list

nns2

nns1

Step2:创建veth pair设备:

[root@worker2 ~]# ip link add veth10 type veth peer name veth11

[root@worker2 ~]# ip link add veth20 type veth peer name veth21

Step3:将veth11放到nns1空间中,将veth21放到nns2空间中:

[root@worker2 ~]# ip link set veth11 netns nns1

[root@worker2 ~]# ip link set veth21 netns nns2

Step4:设置nns1空间中的网卡地址为172.16.0.11/24,设置nns2空间中的网卡地址为172.16.0.21/24,然后使能网卡:

[root@worker2 ~]# ip netns exec nns1 ip addr add 172.16.0.11/24 dev veth11

[root@worker2 ~]# ip netns exec nns1 ifconfig veth11 up

[root@worker2 ~]# ip netns exec nns2 ip addr add 172.16.0.21/24 dev veth21

[root@worker2 ~]# ip netns exec nns2 ifconfig veth21 up

Step5:将系统空间中的veth10和veth20添加到网桥中:

[root@worker2 ~]# brctl addif br0 veth10

[root@worker2 ~]# brctl addif br0 veth20

[root@worker2 ~]# brctl show

bridge name     bridge id               STP enabled     interfaces

br0             8000.4a6812e35d87       no              veth10

                                                                             veth20

Step6:测试网络联通性:

[root@worker2 ~]# ping 172.16.0.11

PING 172.16.0.11 (172.16.0.11) 56(84) bytes of data.

64 bytes from 172.16.0.11: icmp_seq=1 ttl=64 time=0.114 ms

...

[root@worker2 ~]# ping 172.16.0.21

PING 172.16.0.21 (172.16.0.21) 56(84) bytes of data.

64 bytes from 172.16.0.21: icmp_seq=1 ttl=64 time=0.585 ms

...

检查连通性

通过ip link命令,我们可以看到系统空间与网络命名空间之间的连接性

我们先在系统空间执行此命令:

[root@worker2 ~]# ip link

5: veth10@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP mode DEFAULT group default qlen 1000

    link/ether 4a:68:12:e3:5d:87 brd ff:ff:ff:ff:ff:ff link-netnsid 0

8: veth20@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP mode DEFAULT group default qlen 1000

    link/ether d2:a0:a1:fd:2a:7e brd ff:ff:ff:ff:ff:ff link-netnsid 1

稍微解释一下5: veth10@if4的含义:

第一个冒号前的5表示当前网卡设备编号,全系统唯一;第一个冒号后,@符号前,这段字符串为当前网络设备名,也就是veth10;@后面的字符表示与本设备连接的另外一端设备编号;

由于4号设备并不在系统空间内,所以系统中看不到这个网卡信息。

接下来我们进入到nns1空间中看下ip link信息:

[root@worker2 ~]# ip netns exec nns1 ip link

4: veth11@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000

    link/ether 2e:3e:ce:b8:ca:78 brd ff:ff:ff:ff:ff:ff link-netnsid 0

这里可以看到4号设备出现了,名字为veth11,对端设备为5号设备。

至此我们也能看到veth pair设备的连接关系了。

Logo

更多推荐