文章目录
- 步骤 1:创建网络命名空间和虚拟接口
- 步骤 2:将接口分配到命名空间
- 步骤 3:将接口连接到 OVS 桥并设置 VLAN 标签
- 步骤 4:启用主机端接口
- 步骤 5:配置命名空间中的接口
- 步骤 6:测试连通性
- 总结
在这篇文章中,我将继续探讨 Linux 网络命名空间(network namespace)和 Open vSwitch(OVS)的应用。本篇是“Linux Namespace 系列”的第三部分,建立在系列二的基础上,重点介绍如何通过 OVS 的 VLAN 标签功能实现网络隔离和通信。以下是实验步骤和结果,供大家参考。
+-----------------------------------------------------------+
| Host |
| |
| +--------------------------------+ |
| | OVS1 | |
| | (Open vSwitch Bridge) | |
| +--------------------------------+ |
| | Port: veth-n1 Port: veth-n2 | |
| | (VLAN 10) (VLAN 10) | |
| +--------------+ +-------------+ |
| | | |
| | | |
+-----------------------------------------------------------+| || |
+--------------------+ | | +--------------------+
| net1 Namespace | | | | net2 Namespace |
| | | | | |
| +------------+ | | | | +------------+ |
| | eth0-n1 | | | | | | eth0-n2 | |
| |192.168.21.1| | | | | |192.168.21.2| |
| +------------+ | | | | +------------+ |
+--------------------+ | | +--------------------+| |
步骤 1:创建网络命名空间和虚拟接口
首先,我创建了两个新的网络命名空间 net1 和 net2,并为它们分别创建了一对虚拟以太网(veth)接口:
ip netns add net1
ip netns add net2
ip link add eth0-n1 type veth peer name veth-n1
ip link add eth0-n2 type veth peer name veth-n2
eth0-n1 和 veth-n1 是一对,eth0-n2 和 veth-n2 是另一对。
步骤 2:将接口分配到命名空间
将 veth 接口的一端分配到对应的命名空间:
ip link set eth0-n1 netns net1
ip link set eth0-n2 netns net2
步骤 3:将接口连接到 OVS 桥并设置 VLAN 标签
我将主机端的 veth-n1 和 veth-n2 添加到已有的 OVS1 桥,并为它们设置相同的 VLAN 标签 10:
ovs-vsctl add-port OVS1 veth-n1
ovs-vsctl add-port OVS1 veth-n2
ovs-vsctl set port veth-n1 tag=10
ovs-vsctl set port veth-n2 tag=10
查看 OVS 配置:
b1223b21-2efa-4147-bea2-8faa93333652Bridge OVS1Port veth-n2tag: 10Interface veth-n2Port veth-gInterface veth-gPort veth-rInterface veth-rPort veth-n1tag: 10Interface veth-n1Port OVS1Interface OVS1type: internalovs_version: "3.3.0"
可以看到,veth-n1 和 veth-n2 被分配了 VLAN 标签 10,而之前的 veth-g 和 veth-r(来自系列二)没有设置 VLAN 标签。
步骤 4:启用主机端接口
在主机上启用 veth-n1 和 veth-n2:
ip link set dev veth-n1 up
ip link set dev veth-n2 up
这确保了接口处于活动状态,可以通过 OVS 桥进行通信。
步骤 5:配置命名空间中的接口
在 net1 命名空间中配置接口:
ip netns exec net1 bash
ip link set dev lo up
ip link set dev eth0-n1 up
ip link
输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
22: eth0-n1@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000link/ether 4a:a0:18:a9:fc:1a brd ff:ff:ff:ff:ff:ff link-netnsid 0
添加 IP 地址并查看路由:
ip address add 192.168.21.1/24 dev eth0-n1
ip route
192.168.21.0/24 dev eth0-n1 proto kernel scope link src 192.168.21.1
在 net2 命名空间中执行类似操作:
ip netns exec net2 bash
ip link set dev lo up
ip link set dev eth0-n2 up
ip link
输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
24: eth0-n2@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000link/ether a2:8f:5d:cc:c1:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0
添加 IP 地址并查看路由:
ip address add 192.168.21.2/24 dev eth0-n2
ip route
192.168.21.0/24 dev eth0-n2 proto kernel scope link src 192.168.21.2
步骤 6:测试连通性
在 net1 中 ping net2 的 IP 地址:
ip netns exec net1 ping 192.168.21.2
PING 192.168.21.2 (192.168.21.2) 56(84) bytes of data.
64 bytes from 192.168.21.2: icmp_seq=1 ttl=64 time=0.376 ms
64 bytes from 192.168.21.2: icmp_seq=2 ttl=64 time=0.062 ms
结果显示 net1 和 net2 之间可以成功通信,因为它们的接口通过 OVS1 桥连接,且都属于 VLAN 10。
总结
通过这个实验,我在系列二的基础上进一步扩展了网络配置,利用 OVS 的 VLAN 标签功能将 net1 和 net2 隔离在 VLAN 10 中,并验证了它们之间的通信。值得注意的是,未设置 VLAN 标签的接口(如系列二中的 veth-r 和 veth-g)与 VLAN 10 的接口无法直接通信,体现了 VLAN 的隔离效果。
这个实验展示了 Linux 网络命名空间和 OVS 在网络分段中的实际应用。下一篇文章可能会探讨更复杂的场景,例如跨 VLAN 通信或与容器网络的集成。希望这篇内容对学习网络隔离的朋友有所帮助!