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

相关推荐
志栋智能8 小时前
超自动化运维如何支持合规审计?
运维·自动化
小诗懂技术8 小时前
【网络通信UDP】基础 进程间不同主机的通信
运维·服务器·网络
weixin_440730508 小时前
selenium实战记录-从登陆-首页-进入应用流程用例三种参数化+日志+报告
服务器·selenium·测试工具
名字还没想好☜8 小时前
Docker 容器安全加固实战:非 root、只读根文件系统、drop capabilities 与最小攻击面
运维·安全·docker·容器·kubernetes
琥珀色糖8 小时前
Linux守护进程
linux·终端·守护进程·会话·进程组
鹤落晴春8 小时前
有状态应用 vs 无状态应用
运维·云原生·k8s
Hstar_chen8 小时前
开源一款 HarmonyOS 服务器监控客户端:星辰云巡 1.0.3
服务器·华为·harmonyos
DM今天肝到几点?10 小时前
AI 安全进入「攻防同频」:Gemini 3.8 Flash Cyber 上线、Astra 触及关键级、HiddenLayer 融资 1 亿美元
网络·人工智能·深度学习·安全·语言模型·开源·知识图谱
幼儿园蛋小黑10 小时前
TCP 并发:从原理到高并发实践
网络·网络协议·tcp/ip
starzy199010 小时前
虚拟化解决方案全景:软件虚拟化、硬件虚拟化与 Docker 的位置
运维·docker·容器