Docker 教程

Linux 虚拟网络设备

在 Linux 中,虚拟网络设备为网络配置和管理提供了很大的灵活性。其中,veth pair(虚拟以太网对)是一种常用的虚拟网络设备类型。

veth pair 的概念

veth pair 是一对虚拟以太网接口,就像一根虚拟的网线,将两个网络命名空间或网络设备连接起来。当数据从一个 veth 接口发送出去时,它会立即出现在另一个 veth 接口上,实现了两个网络端点之间的通信。如下图:

cb8781f23d248bb71271cd66df6febc7_1726041463958-31f30383-767e-4051-a142-847cc6354a20_x-oss-process=image%2Fformat%2Cwebp.png

上图中,veth0 和 veth1 是一对虚拟以太网接口,实现两个网络命名空间通信。

创建和使用 veth pair

先使用 ip netns list 查看本机上面是否存在网络命名空间,如下:

hx@hxvm:~$ sudo ip netns list
ns1 (id: 0)

如果没有,请使用 ip netns add ns1 命令创建名为 ns1 的网络命名空间。

创建 veth pair

可以使用 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 的虚拟以太网接口。

将 veth pair 分配到不同的网络命名空间

可以使用 ip link set 命令将 veth pair 的一端分配到一个网络命名空间中。例如:

hx@hxvm:~$ sudo ip link set veth9 netns ns1

这将把 veth9 接口移动到名为 ns1 的网络命名空间中。

配置 veth pair 的 IP 地址

在每个网络命名空间中,可以使用 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的网络接口设备上。

启用 veth pair

使用 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,并将它们连接到不同的网络设备或命名空间,以模拟不同的网络场景。

总结

veth pair 是 Linux 中一种非常有用的虚拟网络设备,可以用于实现网络命名空间之间的通信、容器网络以及网络模拟和测试等场景。通过灵活地使用 veth pair,可以更好地管理和配置 Linux 系统中的网络。

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号