namespace 网络命名空间、使用网络命名空间实现虚拟路由
2024-07-28 本文已影响0人
河码匠
网络命名空间(Network Namespace)是 Linux 内核提供的一种功能,用于隔离和虚拟化网络堆栈,使每个命名空间拥有独立的网络设备、IP 地址、路由表和/或防火墙规则。
一、什么是网络命名空间
网络命名空间是 Linux 容器化技术的重要组成部分之一。它允许在同一台主机上创建多个相互隔离的网络环境,使得每个网络环境看起来像是运行在独立的机器上。每个网络命名空间都有自己独立的网络堆栈,这包括网络接口、IP 地址、路由表和防火墙规则。
二、网络命名空间的组成部分
-
网络设备:每个网络命名空间可以有自己的网络接口,比如虚拟以太网对(veth pair)、物理网络接口或虚拟网络设备(如桥接、隧道等)。
-
IP 地址:每个网络命名空间有自己的IP地址配置,可以与其他命名空间的IP配置完全不同。
-
路由表:每个网络命名空间有自己的路由表,决定数据包如何转发。
-
防火墙规则:每个网络命名空间可以有自己的 iptables 规则,用于控制流量。
三、网络命名空间的应用场景
-
容器:网络命名空间是 Docker、Kubernetes 等容器技术的基础,每个容器都有自己的网络命名空间。
-
多租户环境:在云计算平台上,通过网络命名空间实现租户之间的网络隔离。
-
网络测试与开发:开发和测试网络应用时,可以使用网络命名空间模拟复杂的网络拓扑。
四、创建和管理网络命名空间
1. 创建网络命名空间
使用 ip
命令可以创建网络命名空间:
ip netns add mynamespace
2. 列出网络命名空间
ip netns list
3. 删除网络命名空间
ip netns delete mynamespace
4. 进入网络命名空间
- 在特定的网络命名空间中运行命令:
ip netns exec mynamespace bash
- 或者运行其他命令,例如查看网络接口:
ip netns exec mynamespace ip link
5. 配置网络命名空间
- 创建虚拟以太网对
一对虚拟以太网接口(Virtual Ethernet Pair),简称 veth pair,是一种虚拟网络设备,它成对出现,两个接口之间形成一个虚拟的连接通道
创建一对虚拟以太网接口:
ip link add veth0 type veth peer name veth1
- 将接口移入命名空间
将其中一个接口移动到指定的命名空间:
ip link set veth1 netns mynamespace
- 配置接口和 IP 地址
在主命名空间中配置接口:
ip addr add 192.168.1.1/24 dev veth0
ip link set veth0 up
- 在
mynamespace
命名空间中配置接口:
ip netns exec mynamespace ip addr add 192.168.1.2/24 dev veth1
ip netns exec mynamespace ip link set veth1 up
6. 配置路由
在 mynamespace
命名空间中配置默认路由:
ip netns exec mynamespace ip route add default via 192.168.1.1
五、示例
使用网络命名空间实现虚拟路由。多虚拟机统一公网 ip 出网
环境
物理机 | 系统 | 网络命名空间 | 内网网桥 | 公网网桥 | 网卡 | 外网虚拟网卡对 | 内网虚拟网卡对 | 虚拟机 |
---|---|---|---|---|---|---|---|---|
物理机 A 虚拟路由 |
ubuntu 1804 | ns-a | br-pr | br-pu | eth0 eth1 |
veth15.0 veth15.1 |
veth17.0 veth17.1 |
vm-a |
物理机 B | ubuntu 1804 | --- | br-pr | --- | eth0 | --- | veth17.0 veth17.1 |
vm-b |
1. 物理机 A
默认网络命名空间操作
- 创建内网网桥
brctl addbr br-pr
brctl stp br-pr on
brctl setfd br-pr 10
ip link set br-pr up
- 创建外网网桥
brctl addbr br-pu
brctl stp br-pu on
brctl setfd br-pu 10
ip link set br-pu up
- 物理机外网网卡加入外网网桥
brctl addif br-pu eth1
- 创建网络命名空间
ip netns add ns1
- 创建公网虚拟以太网接口对
veth15.0
和veth15.1
ip link add veth15.0 type veth peer name veth15.1
- 将 veth15.1 添加到
ns1
网络命名空间
ip link set veth15.1 netns ns1
- 将 veth15.0 添加到
br-pu
公网网桥
brctl addif br-pr veth15.0
- 创建私有网络虚拟网卡对
veth17.0
和veth17.1
ip link add veth17.0 type veth peer name veth17.1
- 将 veth17.1 添加到
ns1
网络命名空间
ip link set veth17.1 netns ns1
- 将 veth17.0 添加到
br-pr
私网网桥
brctl addif br-pu veth17.0
- 创建 vxlan 为了实现跨物理机虚机互通
关于 vxlan 跨物理机互通示例查看 VXLAN 简介、实现虚拟机跨物理机通信和网络隔离
# ip link add vxlan1070 mtu 1500 numtxqueues 4 numrxqueues 4 type vxlan id 1070 group 239.0.4.46 ageing 600 dev eth0
# ip link set vxlan1070 up
# ifconfig vxlan1070 up
-
vxlan1070
加入br-pr
私网网桥
brctl addif br-pr vxlan1070
- 查看私网网桥
# brctl show br-pr
bridge name bridge id STP enabled interfaces
br-pr 8000.3271fd94d7b3 yes veth17.0
vxlan1070
- 查看公网网桥
# brctl show br-pu
bridge name bridge id STP enabled interfaces
br-pu 8000.3271fd94d7b3 yes eth1
veth15.0
- 查看本地虚拟网卡
# ip link show veth15.0
790: veth15.0@if789: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc cbq master bgp state UP mode DEFAULT group default qlen 1000
link/ether 2a:8c:53:c3:23:85 brd ff:ff:ff:ff:ff:ff link-netnsid 6
# ip link show veth17.0
796: veth17.0@if795: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master net-qnhjodrl state UP mode DEFAULT group default qlen 1000
link/ether 32:71:fd:94:d7:b3 brd ff:ff:ff:ff:ff:ff link-netnsid 6
- 查看命名空间虚拟网卡
# ip netns exec ns1 ip link show veth15.1
789: veth15.1@if790: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether c2:af:a8:36:61:7c brd ff:ff:ff:ff:ff:ff link-netnsid 0
# ip netns exec ns1 ip link show veth17.1
795: veth17.1@if796: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether e6:a0:14:6c:ae:7d brd ff:ff:ff:ff:ff:ff link-netnsid 0
2. ns1
命名空间操作
- 在命名空间 ns1 中添加 nat 跳转
# ip netns exec ns1 sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
# ip netns exec ns1 iptables -t nat -I POSTROUTING -o eth15.1 -j MASQUERADE
- 在命名空间中添加路由
# route add default gw 123.123.123.123 dev veth15.1
# route add 123.123.123.0/23 netmask 255.255.254.0 dev veth15.1
# route add 192.168.10.0/24 netmask 255.255.255.0 dev veth17.1
# ip netns exec ns1 route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 123.123.123.123 0.0.0.0 UG 0 0 0 veth15.1
123.123.123.0 0.0.0.0 255.255.254.0 U 0 0 0 veth15.1
192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 veth17.1
- 配置命名空间网卡 ip
ip netns exec ns1 ifconfig veth17.1 192.168.10.3 netmask 255.255.255.0 up
ip netns exec ns1 ifconfig veth15.1 123.123.123.123 netmask 255.255.254.0 up
3. 物理机 B
操作
- 创建私网网桥
brctl addbr br-pr
brctl stp br-pr on
brctl setfd br-pr 10
ip link set br-pr up
- 创建
vxlan1070
# ip link add vxlan1070 mtu 1500 numtxqueues 4 numrxqueues 4 type vxlan id 1070 group 239.0.4.46 ageing 600 dev eth0
# ip link set vxlan1070 up
# ifconfig vxlan1070 up
- 将
vxlan1070
加入私网网桥
brctl addif br-pr vxlan1070
- 将虚拟机虚拟网卡加入私网网桥
# virsh domiflist i-uwstgzco
Interface Type Source Model MAC
-------------------------------------------------------
vnet15 bridge br-pr virtio fa:52:00:08:e7:51
没有加入手动加入
# brctl addif br-pr vnet15
- 查看私网网桥
# brctl show br-pr
bridge name bridge id STP enabled interfaces
br-pr 8000.3271fd94d7b3 yes vnet15
vxlan1070
4. 虚拟机 ping
测试
- vm-a
root@vm-a:~# ping 192.168.10.20
PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data.
64 bytes from 192.168.10.20: icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from 192.168.10.20: icmp_seq=2 ttl=64 time=0.035 ms
root@vm-a:~# ping baidu.com
PING baidu.com (110.242.68.66): 56 data bytes
64 bytes from 110.242.68.66: icmp_seq=0 ttl=52 time=23.451 ms
64 bytes from 110.242.68.66: icmp_seq=1 ttl=52 time=39.049 ms
- vm-b
root@vm-b:~# ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.035 ms
root@vm-b:~# ping baidu.com
PING baidu.com (110.242.68.66): 56 data bytes
64 bytes from 110.242.68.66: icmp_seq=1 ttl=52 time=113.051 ms
64 bytes from 110.242.68.66: icmp_seq=2 ttl=52 time=71.855 ms
64 bytes from 110.242.68.66: icmp_seq=3 ttl=52 time=71.027 ms