Docker 教程

Linux 网络命名空间

在 Linux 中,网络命名空间(Network Namespace)提供了一种虚拟化网络资源的方式,使得不同的命名空间可以拥有独立的网络协议栈、网络设备、IP 地址、路由表等网络资源。

网络命名空间可以通俗地理解为一种创建独立网络环境的 “容器”。想象一下,你有一个大的房间(整个 Linux 系统),里面有各种家具和设备(网络设备、协议栈等)。现在,你想在这个房间里再隔出几个小房间,每个小房间都有自己独立的一套家具和设备布局,并且相互之间不干扰,这就是网络命名空间的作用。

网络命名空间的作用

💥隔离网络环境

通过网络命名空间,可以为不同的应用程序或服务创建独立的网络环境,避免它们之间的网络冲突和干扰。

💥模拟复杂网络拓扑

可以使用网络命名空间来模拟复杂的网络拓扑结构,例如多层网络、虚拟专用网络(VPN)等。

💥进行网络测试和开发

网络命名空间为网络测试和开发提供了便利,可以在不影响实际网络环境的情况下进行各种网络实验和调试。

创建和管理网络命名空间

创建网络命名空间

可以使用 ip netns add 命令来创建一个新的网络命名空间。例如:

root@hxvm:~# ip netns add ns1

查看网络命名空间

使用 ip netns list 命令可以列出系统中所有的网络命名空间。例如:

root@hxvm:~# ip netns list
ns1

进入网络命名空间

可以使用 ip netns exec 命令进入一个特定的网络命名空间。例如:

root@hxvm:~# ip netns exec ns1 bash

删除网络命名空间

使用 ip netns delete 命令可以删除一个网络命名空间。例如:

root@hxvm:~# ip netns delete ns1
root@hxvm:~# ip netns list

注意:退出网络命名空间,使用 exit 命令,否则此时去删除该网络命名空间会抛出如下错误“Cannot remove namespace file "/run/netns/ns1": Device or resource busy”。

在网络命名空间中配置网络

配置网络接口

在网络命名空间中,可以使用 ip link 命令来创建、配置和管理网络接口。

示例一:

# 创建虚拟以太网设备对
hx@hxvm:~$ sudo ip link add veth0 type veth peer name veth1
[sudo] password for hx:

上面命令用来创建一对虚拟以太网(veth)设备,分别命名为 “veth0” 和 “veth1”。详细解释如下:

  • ip link add:用于添加网络接口设备。

  • veth0:指定创建的第一个虚拟以太网设备的名称。

  • type veth:表明要创建的设备类型是虚拟以太网设备。

  • peer name veth1:创建与 “veth0” 成对的另一个虚拟以太网设备,并命名为 “veth1”。

注意:上面创建的这对虚拟以太网设备可以用于在不同的网络命名空间之间建立连接,实现网络通信和隔离。例如,可以将 “veth0” 放置在一个网络命名空间中,将 “veth1” 放置在另一个网络命名空间中,然后通过配置使两个命名空间中的设备能够通过这对虚拟以太网设备进行通信。

示例二:

# 查看已有的网络命名空间
hx@hxvm:~$ sudo ip netns list
ns1

# 将 veth0 设备移动到 ns1 网络命名空间
hx@hxvm:~$ sudo ip link set veth0 netns ns1

上面命令将“veth0”网络接口设备移动到名为“ns1”的网络命名空间中。下面是命令详细解释:

  • ip link set:用于设置网络接口属性。

  • veth0:要进行操作的网络接口名称。虚拟以太网(veth)设备通常成对出现,用于在不同的网络命名空间之间建立连接。

  • netns ns1:表示将该网络接口移动到名为“ns1”的网络命名空间中。通过这种方式,可以在特定的命名空间中对该网络接口进行配置和管理,实现网络的隔离和独立控制。

配置 IP 地址

可以使用 ip addr 命令在网络命名空间中为网络接口配置 IP 地址。例如:

hx@hxvm:~$ sudo ip netns exec ns1 ip addr add 192.168.1.1/24 dev veth0

上面命令的作用是在名为“ns1”的网络命名空间中,为名为“veth0”的网络接口设备分配 IP 地址为 192.168.1.1/24。详细解释如下:

  • ip netns exec ns1:表示在名为 “ns1” 的网络命名空间中执行后续的命令。网络命名空间提供了一种网络隔离的环境,使得在不同的命名空间中的网络配置和行为相互独立。

  • ip addr add 192.168.1.1/24:这部分命令用于添加一个 IP 地址。在这里,指定的 IP 地址是 192.168.1.1,子网掩码长度为 24 位(即 255.255.255.0)。

  • dev veth0:表示将这个 IP 地址分配给名为 “veth0” 的网络接口设备。

配置路由表

可以使用 ip route 命令在网络命名空间中配置路由表。例如:

ip netns exec ns1 ip route add default via 192.168.1.254

上面命令是在名为“ns1”的网络命名空间中执行添加默认路由的操作。具体解释如下:

  • ip netns exec ns1:表示进入名为 “ns1” 的网络命名空间执行后续命令。

  • ip route add:用于添加路由规则。

  • default:指定这是一条默认路由。默认路由是当目标地址不在其他更具体的路由表项中时所使用的路由。

  • via 192.168.1.254:表示数据包的下一跳地址为 192.168.1.254。当网络命名空间中的设备要发送数据包到不在本地网络中的目的地时,将把数据包发送到这个指定的下一跳地址。

网络命名空间之间的通信

💥虚拟网络设备

可以使用虚拟网络设备(如 veth 对、macvlan 等)来实现不同网络命名空间之间的通信。

💥网络桥接

可以使用网络桥接(如 Linux 内核中的 bridge 模块)来连接多个网络命名空间,实现它们之间的通信。

总结

通过使用网络命名空间,可以在 Linux 系统中实现灵活的网络虚拟化和隔离,为不同的应用程序和服务提供独立的网络环境。这对于网络测试、开发和部署复杂的网络架构非常有用。

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