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

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

作者: 河码匠 | 来源:发表于2024-07-28 08:38 被阅读0次

    网络命名空间(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
    image.png

    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.0veth15.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.0veth17.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
    

    相关文章

      网友评论

          本文标题:namespace 网络命名空间、使用网络命名空间实现虚拟路由

          本文链接:https://www.haomeiwen.com/subject/kyiuhjtx.html