案例:使用网络命名空间模拟多主机并通过网桥访问外部网络
案例目标
- 隔离性:在同一台物理机上创建两个独立的网络命名空间(模拟两台主机),确保其网络配置完全隔离。
- 内部通信:允许两个命名空间通过虚拟设备直接通信。
- 外部访问:通过宿主机的网桥和 NAT 规则,使两个命名空间能够访问外部互联网。
核心要求
- 使用
ip netns
和veth 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)
总结
实现目标回顾
- 隔离性:通过
ip netns
创建独立命名空间,确保 ns1 和 ns2 的网络配置互不影响。 - 内部通信:通过 veth pair 和网桥,两个命名空间可直接通信(同一子网)。
- 外部访问:通过网桥绑定物理网卡并配置 NAT,命名空间可访问外网。
关键技术点
- 网络命名空间:隔离网络协议栈(IP、路由表、设备)。
- veth pair:跨命名空间通信的虚拟“网线”。
- 网桥:连接多个网络接口,模拟物理交换机。
- NAT:通过 iptables 实现地址转换,允许内网访问外网。
应用场景
- 容器网络:Docker/Kubernetes 使用类似机制为容器提供网络。
- 多租户测试:为不同租户分配独立网络环境。
- 安全实验:隔离测试环境,防止实验影响宿主机网络。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/88207.html
如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!