namespace 网络命名空间、使用网络命名空间实现虚拟路由

网络命名空间(Network Namespace)是 Linux 内核提供的一种功能,用于隔离和虚拟化网络堆栈,使每个命名空间拥有独立的网络设备、IP 地址、路由表和/或防火墙规则。

一、什么是网络命名空间

网络命名空间是 Linux 容器化技术的重要组成部分之一。它允许在同一台主机上创建多个相互隔离的网络环境,使得每个网络环境看起来像是运行在独立的机器上。每个网络命名空间都有自己独立的网络堆栈,这包括网络接口、IP 地址、路由表和防火墙规则。

二、网络命名空间的组成部分

  1. 网络设备:每个网络命名空间可以有自己的网络接口,比如虚拟以太网对(veth pair)、物理网络接口或虚拟网络设备(如桥接、隧道等)。

  2. IP 地址:每个网络命名空间有自己的IP地址配置,可以与其他命名空间的IP配置完全不同。

  3. 路由表:每个网络命名空间有自己的路由表,决定数据包如何转发。

  4. 防火墙规则:每个网络命名空间可以有自己的 iptables 规则,用于控制流量。

三、网络命名空间的应用场景

  1. 容器:网络命名空间是 Docker、Kubernetes 等容器技术的基础,每个容器都有自己的网络命名空间。

  2. 多租户环境:在云计算平台上,通过网络命名空间实现租户之间的网络隔离。

  3. 网络测试与开发:开发和测试网络应用时,可以使用网络命名空间模拟复杂的网络拓扑。

四、创建和管理网络命名空间

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 默认网络命名空间操作
  • 创建内网网桥
shell 复制代码
brctl addbr br-pr
brctl stp br-pr on
# 设置网桥的转发延迟
brctl setfd br-pr 10
ip link set br-pr up
  • 创建外网网桥
shell 复制代码
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 简介、实现虚拟机跨物理机通信和网络隔离

shell 复制代码
# 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

  • 查看本地虚拟网卡

shell 复制代码
# 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
  • 查看命名空间虚拟网卡
shell 复制代码
# 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 跳转
shell 复制代码
# 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
  • 在命名空间中添加路由
shell 复制代码
# 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

shell 复制代码
# 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

  • 将虚拟机虚拟网卡加入私网网桥

shell 复制代码
# 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
shell 复制代码
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
shell 复制代码
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
相关推荐
A小辣椒7 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒11 小时前
TShark:基础知识
linux
AlfredZhao13 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
网络研究院2 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展