当前位置: 首页 > article >正文

案例:使用网络命名空间模拟多主机并通过网桥访问外部网络

在这里插入图片描述


案例目标
  1. 隔离性:在同一台物理机上创建两个独立的网络命名空间(模拟两台主机),确保其网络配置完全隔离。
  2. 内部通信:允许两个命名空间通过虚拟设备直接通信。
  3. 外部访问:通过宿主机的网桥和 NAT 规则,使两个命名空间能够访问外部互联网。

核心要求
  • 使用 ip netnsveth pair 实现网络隔离。
  • 通过网桥(Bridge)连接命名空间与宿主机物理网络。
  • 配置 NAT 实现外网访问。
  • 验证隔离性、内部通信及外部连通性。

实现步骤


步骤 1:清理旧配置(如有)
# 删除可能存在的旧命名空间和网桥
sudo ip netns delete ns1 2>/dev/null
sudo ip netns delete ns2 2>/dev/null
sudo ip link delete br0 2>/dev/null
sudo ip link delete veth1-host 2>/dev/null
sudo ip link delete veth2-host 2>/dev/null

步骤 2:创建网络命名空间
# 创建两个命名空间 ns1 和 ns2
sudo ip netns add ns1   # 模拟主机 A
sudo ip netns add ns2   # 模拟主机 B

步骤 3:创建网桥并连接物理网络
# 1. 创建网桥 br0
sudo ip link add br0 type bridge
sudo ip link set br0 up

# 2. 将物理网卡 eth0 绑定到网桥(假设 eth0 是宿主机的外网接口)
sudo ip link set eth0 master br0
sudo dhclient br0   # 自动获取 IP(或手动分配:sudo ip addr add 192.168.1.100/24 dev br0)

步骤 4:为每个命名空间创建 veth pair 并连接网桥
# 为 ns1 创建 veth pair(宿主机端:veth1-host,命名空间端:veth1-ns)
sudo ip link add veth1-host type veth peer name veth1-ns
sudo ip link set veth1-host master br0   # 宿主机端加入网桥
sudo ip link set veth1-host up

# 为 ns2 创建 veth pair(宿主机端:veth2-host,命名空间端:veth2-ns)
sudo ip link add veth2-host type veth peer name veth2-ns
sudo ip link set veth2-host master br0   # 宿主机端加入网桥
sudo ip link set veth2-host up

# 将 veth 的另一端分配到命名空间
sudo ip link set veth1-ns netns ns1
sudo ip link set veth2-ns netns ns2

步骤 5:配置命名空间的网络
# 配置 ns1 的网络
sudo ip netns exec ns1 ip addr add 192.168.1.101/24 dev veth1-ns
sudo ip netns exec ns1 ip link set veth1-ns up
sudo ip netns exec ns1 ip route add default via 192.168.1.1  # 假设网关为 192.168.1.1

# 配置 ns2 的网络
sudo ip netns exec ns2 ip addr add 192.168.1.102/24 dev veth2-ns
sudo ip netns exec ns2 ip link set veth2-ns up
sudo ip netns exec ns2 ip route add default via 192.168.1.1

步骤 6:配置 NAT 允许外网访问
# 1. 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1

# 2. 添加 iptables NAT 规则(假设外网接口为 eth0)
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i br0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT

步骤 7:验证网络功能
# 1. 验证 ns1 和 ns2 的互通性
sudo ip netns exec ns1 ping -c 3 192.168.1.102   # ns1 -> ns2
sudo ip netns exec ns2 ping -c 3 192.168.1.101   # ns2 -> ns1

# 2. 验证外网访问能力
sudo ip netns exec ns1 ping -c 3 8.8.8.8        # ns1 访问谷歌 DNS
sudo ip netns exec ns2 ping -c 3 8.8.8.8        # ns2 访问谷歌 DNS

# 3. 验证宿主机无法直接访问命名空间 IP
ping -c 3 192.168.1.101   # 应失败(隔离性验证)

最终网络拓扑

宿主机网桥 br0 (IP: 自动获取或手动配置)
│
├─ eth0 (物理网卡,通过 DHCP/NAT 访问外网)
├─ veth1-host (连接到 ns1 的 veth1-ns, IP: 192.168.1.101)
└─ veth2-host (连接到 ns2 的 veth2-ns, IP: 192.168.1.102)

总结

实现目标回顾
  1. 隔离性:通过 ip netns 创建独立命名空间,确保 ns1 和 ns2 的网络配置互不影响。
  2. 内部通信:通过 veth pair 和网桥,两个命名空间可直接通信(同一子网)。
  3. 外部访问:通过网桥绑定物理网卡并配置 NAT,命名空间可访问外网。
关键技术点
  • 网络命名空间:隔离网络协议栈(IP、路由表、设备)。
  • veth pair:跨命名空间通信的虚拟“网线”。
  • 网桥:连接多个网络接口,模拟物理交换机。
  • NAT:通过 iptables 实现地址转换,允许内网访问外网。
应用场景
  • 容器网络:Docker/Kubernetes 使用类似机制为容器提供网络。
  • 多租户测试:为不同租户分配独立网络环境。
  • 安全实验:隔离测试环境,防止实验影响宿主机网络。

http://www.kler.cn/a/600222.html

相关文章:

  • c# 2025-3-22 周六
  • 再读强化学习24March
  • ESP32 BLE 初步学习笔记
  • API架构风格
  • 【机器学习】什么是逻辑回归?
  • Unity 游戏开发:从新手到大师的进阶之路
  • 网络安全威胁与防护措施(下)
  • vue 点击放大,图片预览效果
  • Azure Delta Lake、Databricks和Event Hubs实现实时欺诈检测
  • trino查询mysql报Unknown or incorrect time zone: ‘Asia/Shanghai‘
  • spring +kotlin 配置redis 和redis的常用方法
  • AI大模型全攻略:原理 · 部署 · Prompt · 场景应用
  • 大数据E10:基于Spark和Scala编程解决一些基本的数据处理和统计分析,去重、排序等
  • 【Vue3入门1】01-Vue3的基础 + ref reactive
  • Golang 老题,生产者和消费者模型,先后关闭通道的问题
  • STM32 ADC和DAC详解
  • [React 进阶系列] 组合组件 复合组件
  • 矩阵指数的定义和基本性质
  • [实操]Mysql8 InnoDB引擎主从配置三节点操作流程
  • LeetCode热题100_最长连续序列