点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。
在 Linux 中,虚拟网络设备为网络配置和管理提供了很大的灵活性。其中,veth pair(虚拟以太网对)是一种常用的虚拟网络设备类型。
veth pair 是一对虚拟以太网接口,就像一根虚拟的网线,将两个网络命名空间或网络设备连接起来。当数据从一个 veth 接口发送出去时,它会立即出现在另一个 veth 接口上,实现了两个网络端点之间的通信。如下图:

上图中,veth0 和 veth1 是一对虚拟以太网接口,实现两个网络命名空间通信。
先使用 ip netns list 查看本机上面是否存在网络命名空间,如下:
hx@hxvm:~$ sudo ip netns list
ns1 (id: 0)如果没有,请使用 ip netns add ns1 命令创建名为 ns1 的网络命名空间。
可以使用 ip link add 命令创建一个 veth pair。例如:
hx@hxvm:~$ sudo ip link add veth8 type veth peer name veth9
hx@hxvm:~$ sudo ip link show | grep veth
7: veth1@if8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
9: veth9@veth8: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
10: veth8@veth9: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000这将创建一对名为 veth8 和 veth9 的虚拟以太网接口。
可以使用 ip link set 命令将 veth pair 的一端分配到一个网络命名空间中。例如:
hx@hxvm:~$ sudo ip link set veth9 netns ns1这将把 veth9 接口移动到名为 ns1 的网络命名空间中。
在每个网络命名空间中,可以使用 ip addr add 命令为 veth 接口配置 IP 地址。例如:
(1)配置 veth8 虚拟设备的 IP 地址:
# 设置IP地址
hx@hxvm:~$ sudo ip addr add 192.168.1.1/24 dev veth8
# 查看设备 IP 地址
hx@hxvm:~$ ifconfig veth8
veth8: flags=4098<BROADCAST,MULTICAST> mtu 1500
inet 192.168.1.1 netmask 255.255.255.0 broadcast 0.0.0.0
ether 92:23:b1:e6:53:a3 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0(2)配置 veth9 虚拟设备的 IP 地址:
# 设置设备IP地址
hx@hxvm:~$ sudo ip netns exec ns1 ip addr add 192.168.1.2/24 dev veth9
# 进入 ns1 网络命名空间
hx@hxvm:~$ sudo ip netns exec ns1 bash
# 查看 veth9 虚拟设备IP地址
root@hxvm:/home/hx# sudo ifconfig veth9
sudo: unable to resolve host hxvm: Temporary failure in name resolution
veth9: flags=4098<BROADCAST,MULTICAST> mtu 1500
inet 192.168.1.2 netmask 255.255.255.0 broadcast 0.0.0.0
ether 0a:35:2b:26:8a:b6 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 退出 ns1 网络命名空间
root@hxvm:/home/hx# exit
exit命令详细解释:
ip netns exec ns1: 这部分命令表示在名为ns1 的网络命名空间(network namespace)中执行后续的操作。
ip addr add 192.168.1.2/24 dev veth9:ip addr add 是用于给网络接口添加 IP 地址的命令。192.168.1.2/24 是要添加的 IP 地址和子网掩码。其中 192.168.1.2 是 IP 地址,/24 表示子网掩码的长度,对应的子网掩码是 255.255.255.0。
dev veth9:表示将这个 IP 地址添加到名为veth9的网络接口设备上。
使用 ip link set 命令启用 veth 接口。例如:
hx@hxvm:~$ sudo ip link set veth8 up
[sudo] password for hx:
hx@hxvm:~$ sudo ip netns exec ns1 ip link set veth9 up查看 veth8 和 veth9 虚拟网卡的 IP 地址:
hx@hxvm:~$ ifconfig veth8
veth8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::9023:b1ff:fee6:53a3 prefixlen 64 scopeid 0x20<link>
ether 92:23:b1:e6:53:a3 txqueuelen 1000 (Ethernet)
RX packets 11 bytes 866 (866.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 45 bytes 5010 (5.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
hx@hxvm:~$ sudo ip netns exec ns1 ifconfig
veth9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.2 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::835:2bff:fe26:8ab6 prefixlen 64 scopeid 0x20<link>
ether 0a:35:2b:26:8a:b6 txqueuelen 1000 (Ethernet)
RX packets 45 bytes 5010 (5.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12 bytes 936 (936.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0网络命名空间之间的通信:如前所述,veth pair 可以用于连接不同的网络命名空间,实现它们之间的通信。
容器网络:在容器化环境中,veth pair 常用于为容器提供网络连接。容器引擎可以使用 veth pair 将容器连接到主机网络或其他网络命名空间。
网络模拟和测试:veth pair 可以用于构建复杂的网络拓扑,进行网络模拟和测试。可以创建多个 veth pair,并将它们连接到不同的网络设备或命名空间,以模拟不同的网络场景。
veth pair 是 Linux 中一种非常有用的虚拟网络设备,可以用于实现网络命名空间之间的通信、容器网络以及网络模拟和测试等场景。通过灵活地使用 veth pair,可以更好地管理和配置 Linux 系统中的网络。
点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。