Linux Namespace(网络命名空间)系列三 --- 使用 Open vSwitch 和 VLAN 标签实现网络隔离

文章目录

  • [步骤 1:创建网络命名空间和虚拟接口](#步骤 1:创建网络命名空间和虚拟接口)
  • [步骤 2:将接口分配到命名空间](#步骤 2:将接口分配到命名空间)
  • [步骤 3:将接口连接到 OVS 桥并设置 VLAN 标签](#步骤 3:将接口连接到 OVS 桥并设置 VLAN 标签)
  • [步骤 4:启用主机端接口](#步骤 4:启用主机端接口)
  • [步骤 5:配置命名空间中的接口](#步骤 5:配置命名空间中的接口)
  • [步骤 6:测试连通性](#步骤 6:测试连通性)
  • 总结

在这篇文章中,我将继续探讨 Linux 网络命名空间(network namespace)和 Open vSwitch(OVS)的应用。本篇是"Linux Namespace 系列"的第三部分,建立在系列二的基础上,重点介绍如何通过 OVS 的 VLAN 标签功能实现网络隔离和通信。以下是实验步骤和结果,供大家参考。

bash 复制代码
+-----------------------------------------------------------+
|                          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)接口:

bash 复制代码
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 接口的一端分配到对应的命名空间:

bash 复制代码
ip link set eth0-n1 netns net1
ip link set eth0-n2 netns net2

步骤 3:将接口连接到 OVS 桥并设置 VLAN 标签

我将主机端的 veth-n1 和 veth-n2 添加到已有的 OVS1 桥,并为它们设置相同的 VLAN 标签 10:

bash 复制代码
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 配置:

bash 复制代码
b1223b21-2efa-4147-bea2-8faa93333652
    Bridge OVS1
        Port veth-n2
            tag: 10
            Interface veth-n2
        Port veth-g
            Interface veth-g
        Port veth-r
            Interface veth-r
        Port veth-n1
            tag: 10
            Interface veth-n1
        Port OVS1
            Interface OVS1
                type: internal
    ovs_version: "3.3.0"

可以看到,veth-n1 和 veth-n2 被分配了 VLAN 标签 10,而之前的 veth-g 和 veth-r(来自系列二)没有设置 VLAN 标签。

步骤 4:启用主机端接口

在主机上启用 veth-n1 和 veth-n2:

bash 复制代码
ip link set dev veth-n1 up
ip link set dev veth-n2 up

这确保了接口处于活动状态,可以通过 OVS 桥进行通信。

步骤 5:配置命名空间中的接口

在 net1 命名空间中配置接口:

bash 复制代码
ip netns exec net1 bash
ip link set dev lo up
ip link set dev eth0-n1 up
ip link

输出:

bash 复制代码
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
22: eth0-n1@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 4a:a0:18:a9:fc:1a brd ff:ff:ff:ff:ff:ff link-netnsid 0

添加 IP 地址并查看路由:

bash 复制代码
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 命名空间中执行类似操作:

bash 复制代码
ip netns exec net2 bash
ip link set dev lo up
ip link set dev eth0-n2 up
ip link

输出:

bash 复制代码
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
24: eth0-n2@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether a2:8f:5d:cc:c1:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0

添加 IP 地址并查看路由:

bash 复制代码
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 地址:

bash 复制代码
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 通信或与容器网络的集成。希望这篇内容对学习网络隔离的朋友有所帮助!

相关推荐
测试人社区—小叶子1 天前
低代码平台测试秘籍:OutSystems组件校验法则
运维·网络·人工智能·测试工具·低代码·自动化
路溪非溪1 天前
关于蓝牙技术的再补充
linux
华普微HOPERF1 天前
LoRaWAN网络,如何提升现代建筑的智慧服务能力?
网络·物联网·aiot·智慧建筑
翼龙云_cloud1 天前
阿里云渠道商:轻量应用服务器连接常见问题与解决指南
服务器·阿里云·云计算
互联网哪些事情1 天前
服务器防御 SQL 注入
运维·服务器·sql·sql注入主机
小尧嵌入式1 天前
QT软件开发知识点流程及记事本开发
服务器·开发语言·数据库·c++·qt
爱宇阳1 天前
Linux 安全加固:设置命令行无操作超时退出
linux·运维·安全
呆萌小新@渊洁1 天前
声纹模型全流程实践-开发(训练 - 微调 - 部署 - 调用)
linux·服务器·python·语音识别
RisunJan1 天前
Linux命令-getenforce命令(快速检查 Linux 系统中 SELinux 的当前运行模式)
linux·运维·服务器
SMF19191 天前
解决在 Linux 系统中,当你尝试以 root 用户登录时遇到 “Access denied“ 的错误
java·linux·服务器