文章目录
- overview
- 目标:
- 实践操作:
- 结论:
overview
Linux 网络命名空间(Network Namespace)是一种在主机内部定义的虚拟空间,用于隔离网络环境。这是一种 Linux 内核功能,允许用户创建独立于系统其余部分的网络接口和路由表,这些接口和路由表彼此隔离,并可以独立运行。
网络命名空间是Docker和Kubernetes容器技术的基础。
目标:
在一个主机命名空间内创建两个命名空间,并通过虚拟以太网(Virtual Ethernet)进行互相通信。
实践操作:
首先使用以下命令查看所有网络接口
obadmin@obsrv01:~$ ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:aa:ab:98 brd ff:ff:ff:ff:ff:ff
接下来使用 netns 工具创建两个命名空间:mydb 和 myweb。
obadmin@obsrv01:~$ sudo ip netns add mydb
查看所有现有网络命名空间,可以使用以下命令:
obadmin@obsrv01:~$ ip netns list
my_db
my_web
现在我们将使用以下命令创建虚拟以太网(Virtual Ethernet):
该命令用于在命名空间之间建立虚拟网络连接。
obadmin@obsrv01:~$ sudo ip link add veth_mydb type veth peer name veth_myweb
在上述命令中,veth_mydb 和 veth_myweb 是虚拟以太网(veth)对的两端,分别分配给 mydb命名空间和myweb 命名空间,用于建立这两个命名空间之间的网络连接。
现在让我们再次查看所有网络接口(Network Interface),以验证虚拟以太网对是否成功创建。
obadmin@obsrv01:~$ ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:aa:ab:98 brd ff:ff:ff:ff:ff:ff
3: veth_myweb@veth_mydb: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 06:e6:c1:00:25:a1 brd ff:ff:ff:ff:ff:ff
4: veth_mydb@veth_myweb: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether e6:38:a8:59:82:44 brd ff:ff:ff:ff:ff:ff
现在我们使用以下命令将虚拟以太网(Virtual Ethernet)连接到各自的命名空间:
这些命令用于将虚拟以太网对的每一端绑定到指定的命名空间,从而实现网络隔离和独立通信。
obadmin@obsrv01:~$ sudo ip link set veth_mydb netns mydb
obadmin@obsrv01:~$ sudo ip link set veth_myweb netns myweb
如果使用 ip link list检查,将不再看到 veth_mydb和 veth_myweb,因为它们已经不在主机命名空间中。
这说明虚拟以太网对的两端已成功分配到各自的命名空间,实现了网络接口的隔离。
要查看所创建的虚拟以太网(Virtual Ethernet)两端,可以在各自的命名空间中运行 ip link list 命令(这将显示分配到每个命名空间内的虚拟接口,验证连接是否正确):
obadmin@obsrv01:~$ sudo ip netns exec mydb ip link list
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: veth_mydb@if3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether e6:38:a8:59:82:44 brd ff:ff:ff:ff:ff:ff link-netns myweb
obadmin@obsrv01:~$ sudo ip netns exec myweb ip link list
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: veth_myweb@if4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 06:e6:c1:00:25:a1 brd ff:ff:ff:ff:ff:ff link-netns mydb
现在,我们需要在 mydb 命名空间中为虚拟以太网(veth)分配 IP 并将其激活,使用以下命令(这样可以完成 mydb命名空间的网络配置,并使其与 myweb命名空间建立通信):
sudo ip netns exec mydb ip address add 10.11.0.3/32 dev veth_mydb
sudo ip netns exec mydb ip link set veth_mydb up
现在我们使用以下命令
obadmin@obsrv01:~$ sudo ip netns exec mydb \
> ip link list
1: lo: <LOOPBACK> mtu 65536 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: veth_mydb@if3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether e6:38:a8:59:82:44 brd ff:ff:ff:ff:ff:ff link-netns myweb
在这里我们可以看到,veth_mydb的状态为 down,这是因为 veth_myweb 一端尚未配置IP,无法进行通信。
现在,我们在 my_app 命名空间中为虚拟以太网(veth)分配 IP 并将其激活,使用以下命令:
obadmin@obsrv01:~$sudo ip netns exec myweb ip address add 10.11.0.4/32 dev veth_myweb
obadmin@obsrv01:~$ sudo ip netns exec myweb ip link set lo up
obadmin@obsrv01:~$ sudo ip netns exec myweb ip link set veth_myweb up
使用如下命令确认
obadmin@obsrv01:~$ sudo ip netns exec myweb ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: veth_myweb@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 06:e6:c1:00:25:a1 brd ff:ff:ff:ff:ff:ff link-netns mydb
```
在这里我们可以看到,veth_myweb 的状态为 UP,这是因为 veth_mydb 一端已通过 IP 设置完成通信配置。
现在,让我们使用以下命令从 myweb 命名空间尝试连接到 mydb命名空间(通过此操作可以验证命名空间间的通信是否成功):
```bash
obadmin@obsrv01:~$ sudo ip netns exec myweb ping 10.11.0.3
ping: connect: Network is unreachable
结果显示“ping: connect: Network is unreachable”(网络无法访问)。为了解决这个问题,我们需要为 veth 的每个端点添加默认网关;也就是说,我们需要将 IP 添加到每个命名空间的路由表中。使用以下命令
obadmin@obsrv01:~$ sudo ip netns exec myweb ip route add default via 10.11.0.4 dev veth_myweb
obadmin@obsrv01:~$ sudo ip netns exec mydb ip route add default via 10.11.0.3 dev veth_mydb
检查路由表
obadmin@obsrv01:~$ sudo ip netns exec myweb ip route
default via 10.11.0.4 dev veth_myweb
obadmin@obsrv01:~$ sudo ip netns exec mydb ip route
default via 10.11.0.3 dev veth_mydb
再次使用ping命令
obadmin@obsrv01:~$ sudo ip netns exec myweb ping 10.11.0.3
PING 10.11.0.3 (10.11.0.3) 56(84) bytes of data.
64 bytes from 10.11.0.3: icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from 10.11.0.3: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 10.11.0.3: icmp_seq=3 ttl=64 time=0.049 ms
结论:
我们成功地从零开始创建了两个命名空间(容器)和一个虚拟网络!通过这个过程,我们对容器和 Linux 网络的概念、工具以及命令有了更直观和深入的理解。