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

相关推荐
plmm烟酒僧4 小时前
使用 Tmux 在断开SSH连接后,保持会话的生命周期
运维·ssh·tmux·分离会话
威视锐科技4 小时前
软件定义无线电36
网络·网络协议·算法·fpga开发·架构·信息与通信
二进制人工智能5 小时前
【QT5 网络编程示例】TCP 通信
网络·c++·qt·tcp/ip
opentrending6 小时前
Github 热点项目 awesome-mcp-servers MCP 服务器合集,3分钟实现AI模型自由操控万物!
服务器·人工智能·github
多多*6 小时前
Java设计模式 简单工厂模式 工厂方法模式 抽象工厂模式 模版工厂模式 模式对比
java·linux·运维·服务器·stm32·单片机·嵌入式硬件
落笔画忧愁e7 小时前
VRRP协议
网络·智能路由器
Guarding and trust7 小时前
python系统之综合案例:用python打造智能诗词生成助手
服务器·数据库·python
南鸳6108 小时前
Linux常见操作命令(2)
linux·运维·服务器
fengwuJ8 小时前
Linux安装Idea
linux·ubuntu·debian·intellij-idea
Kaede68 小时前
怎么安装JSON服务器?JSON服务器最新安装教程
运维·服务器·json