网络命名空间
大约 2 分钟
来个network namespace和veth pair的QuickStart
一、什么是 Network Namespace
- Network Namespace 是用于在Linux系统中创建虚拟网络的一种机制;
- 可将物理主机划分为多个逻辑上独立的网络空间(独立的网络设备、IP地址、路由表、防火墙等);
- 常用于虚拟机、容器等技术;
二、如何创建和使用 Network Namespace
# 对于每个 Network Namespace 来说,它会有自己独立的网卡、路由表、ARP 表、iptables 等和网络相关的资源
# 安装iproute
$ yum install -y iproute
# 查看当前网络命名空间
$ ip netns list
# 创建一个新的网络名称空间
$ ip netns add ns0
$ ls /var/run/netns/
# Network Namespace 中执行命令使用 `ip netns exec` 子命令
# 新创建的 Network Namespace 中会默认创建一个 lo 回环网卡,此时网卡处于关闭状态
$ ip netns exec ns0 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# 由于lo环回网卡关闭状态
$ ip netns exec ns0 ping 127.0.0.1
ping: connect: 网络不可达
# 启用lo环回网卡
$ ip netns exec ns0 ip link set lo up
# 启用后可以ping通
$ ip netns exec ns0 ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.039 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.038 ms
三、Veth Pair (Virtual Ethernet Pair)
利用 veth pair 实现两个不同的 Network Namespace 之间的通信
- 添加网络命名空间
$ ip netns add ns1
$ ip netns list
ns1
ns0
- 创建veth pair对
# 创建 veth pair
$ ip link add veth7 type veth peer name veth1-peer
# 新增了一对 veth pair,将 veth0 和 veth1 两个虚拟网卡
# 这对 veth pair 处于”未启用“状态
$ ip a
12: veth1-peer@veth7: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 3e:2d:37:f9:93:c2 brd ff:ff:ff:ff:ff:ff
13: veth7@veth1-peer: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether e6:8c:12:d8:53:57 brd ff:ff:ff:ff:ff:ff
# 将 veth0 加入到 ns0,将 veth1 加入到 ns1
$ ip link set veth1-peer netns ns1
$ ip link set veth7 netns ns0
# 查看各个网络命名空间的网络接口
$ ip netns exec ns0 ip a
$ ip netns exec ns1 ip a
# 网络命名空间ns0启用veth1-peer
# 配置上 ip 地址
$ ip netns exec ns0 ip link set veth7 up
$ ip netns exec ns0 ip a
$ ip netns exec ns0 ip addr add 192.0.0.1/24 dev veth7
# 网络命名空间ns1启用veth7
$ ip netns exec ns1 ip a
$ ip netns exec ns1 ip link set veth1-peer up
$ ip netns exec ns1 ip addr add 192.0.0.2/24 dev veth1-peer
# ns1 中访问 ns0 中的 ip 地址
$ ip netns exec ns1 ping 192.0.0.1
PING 192.0.0.1 (192.0.0.1) 56(84) bytes of data.
64 bytes from 192.0.0.1: icmp_seq=1 ttl=64 time=0.056 ms
64 bytes from 192.0.0.1: icmp_seq=2 ttl=64 time=0.041 ms