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

2024-07-28  本文已影响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 addr add 192.168.1.1/24 dev veth0
ip link set veth0 up
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
ip link add veth15.0 type veth peer name veth15.1
ip link set veth15.1 netns ns1
brctl addif br-pr veth15.0
ip link add veth17.0 type veth peer name veth17.1
ip link set veth17.1 netns ns1
brctl addif br-pu veth17.0

关于 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
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 命名空间操作

# 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 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
# 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
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 测试
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
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
上一篇下一篇

猜你喜欢

热点阅读