Linux 不同network namespace 之间通信方式

在云平台中,网络实现网元与外界通信,而对于虚拟机或容器来说,其没有物理网卡,需要通过虚拟网卡与外界通过。在Linux环境中,network namespace实现了网络资源的隔离,它可以为网元提供网络设备(网卡)、ip配置等。下面我们来看看Linux环境下network namespace如何工作的。

network namespaces

network namespaces主要提供了关于网络资源的隔离,包括:网络设备、IPV4/IPV6协议栈、IP路由表、防火墙、/proc/net目录、/sys/class/net目录、套接字(socket)等

一个物理的网络设备最多存在于一个network namespace中,可通过veth-pair连接两个network namespace

默认情况下,物理网络设备都分配在最初的root namespace中

添加网络设备实践

下面与容器场景为例,我们创建两个container,两个container之间通过veth-pair(以太对)通信。对于虚拟机的场景也使用,只需要将container换成vm即可。

1. 如何为容器添加虚拟网卡(veth)

添加veth-pair到container

# 将容器的 network namespace 映射到主机中,从而我们可以直接在host上操作容器的 network namespace
# 其中 13816 为容器的 pid
mkdir /var/run/netns
ln -s /proc/13816/ns/net /var/run/netns/13816

# 将 veth0 放入容器中
ip link set veth0 netns 13816 up
ip netns exec 13816 ip a

2. 不同network namespace间通信:

2.1 利用简单的 veth-pair 实现通信

# 创建两个network namespace: ns1 和 ns2
ip netns add ns1
ip netns add ns2

# 创建一对以太对 tap1 <--> tap2
ip link add tap1 type veth peer name tap2

# 将 veth 放入 ns 中, 其中 tap1 放入 ns1 中, tap2 放入 ns2 中
ip link set tap1 netns ns1
ip link set tap2 netns ns2

# 使能 tap 口
ip netns exec ns1 ip link set dev tap1 up
ip netns exec ns2 ip link set dev tap2 up

# 为 tap 口配置 ip
ip netns exec ns1  ip addr add 10.0.0.1/24 dev tap1
ip netns exec ns2  ip addr add 10.0.0.2/24 dev tap2

2.2  利用Linux bridge实现多个veth pair互连


 

# 创建network namespace: ns1 、ns2
ip netns add ns1
ip netns add ns2

# 创建 linuxBridge
BRIDGE=br-test
brctl addbr $BRIDGE
brctl stp   $BRIDGE off
ip link set dev $BRIDGE up

##### PORT 1
# 创建第一对以太对,然后一端放入容器中,另一端挂在Linuxbridge上
ip link add tap1 type veth peer name br-tap1

# 一端挂在Linuxbridge上
brctl addif br-test br-tap1

# 一端放入容器中
ip link set tap1 netns ns1

# 使能 tap 口
ip netns exec ns1 ip link set dev tap1 up
ip link set dev br-tap1 up

##### PORT 2 与 PORT 1 操作一样
ip link add tap2 type veth peer name br-tap2
brctl addif br-test br-tap2
ip link set tap2 netns ns2
ip netns exec ns2 ip link set dev tap2 up
ip link set dev br-tap2 up

# 配置 ip
ip netns  exec  ns1  ip addr add 10.0.0.1/24 dev tap1
ip netns  exec  ns2  ip addr add 10.0.0.2/24 dev tap2

2.3. 采用ovs代替Linuxbridge,同样利用veth pair

# 创建network namespace: ns1 、ns2
ip netns add ns1
ip netns add ns2

# 创建 ovs 网桥
BRIDGE=ovs-test
ovs-vsctl add-br $BRIDGE

##### PORT 1
# 创建第一对以太对,然后一端放入容器中,另一端挂在 ovs 网桥上
ip link add tap1 type veth peer name ovs-tap1

# 一端挂在 ovs 网桥上
ovs-vsctl add-port $BRIDGE ovs-tap1

# 一端放入容器中
ip link set tap1 netns ns1

# 使能 tap 口
ip netns exec ns1 ip link set dev tap1 up
ip link set dev ovs-tap1 up

##### PORT 2 (与 PORT 1 一样)与
ip link add tap2 type veth peer name ovs-tap2
ovs-vsctl add-port $BRIDGE ovs-tap2
ip link set tap2 netns ns2
ip netns exec ns2 ip link set dev tap2 up
ip link set dev ovs-tap2 up

# 配置 ip
ip netns  exec  ns1  ip addr add 10.0.0.1/24 dev tap1
ip netns  exec  ns2  ip addr add 10.0.0.2/24 dev tap2

2.4. 利用ovs,但这次用ovs的 internal port,此时不需要veth pair

# 创建network namespace: ns1、 ns2
ip netns add ns1
ip netns add ns2

# 创建 ovs 网桥
BRIDGE=ovs-test
ovs-vsctl add-br $BRIDGE

##### PORT 1
# 创建 ovs internal 端口
ovs-vsctl add-port $BRIDGE tap1 -- set Interface tap1 type=internal

# 将端口放入容器 ns 中
ip link set tap1 netns ns1

# 使能端口
ip netns exec ns1 ip link set dev tap1 up

##### PORT 2 (与 PORT 1 一样)
ovs-vsctl add-port $BRIDGE tap2 -- set Interface tap2 type=internal
ip link set tap2 netns ns2
ip netns exec ns2 ip link set dev tap2 up

# 配置 ip
ip netns  exec  ns1  ip addr add 10.0.0.1/24 dev tap1
ip netns  exec  ns2  ip addr add 10.0.0.2/24 dev tap2


 

猜你喜欢

转载自blog.csdn.net/ksj367043706/article/details/89787485
今日推荐