Linux虚拟网络设备(bridge & veth pair)
veth pairveth pair 全称是 Virtual Ethernet Pair,是一个成对的端口,所有从这对端口一 端进入的数据包都将从另一端出来,反之也是一样。引入 veth pair 是为了在不同的 Network Namespace 直接进行通信,利用它可以直接将两个 Network Namespace 连接起来。用户可以使用ip link命令增加veth pair设备,下面的范例
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设备的连接关系了。
更多推荐
所有评论(0)