美文网首页
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