# 同主机不同 vlan 的容器通信

上次的图：

![](https://2865871795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M5vy-1hCf-joDzM5tqK%2F-M8T7JdXGwmKMnyyPdPF%2F-M8TJ1Vgbshd9JNiRffe%2Fimage.png?alt=media\&token=fa275600-2253-4da2-a9ce-d23bbdf64f77)



这次的目的不仅仅是 vlan100 内的通信，还要打通 vlan100 和 vlan101 的通信。所以网络拓扑图变成下面的：

![](https://2865871795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M5vy-1hCf-joDzM5tqK%2F-M8ThTT8gJxfl5CCz5sD%2F-M8ThgJHA2U_rR5nCgu-%2Fsame-home-different-vlan.jpg?alt=media\&token=41bb2283-31cf-4d19-93b0-6a134df776e8)



```
# 创建并设置网桥
ovs-vsctl add-br br0
ip link set br0 promisc on

# 设置 ns0 和 veth pair (10,11), 处于 vlan100
ip link add name veth10 type veth peer name veth11
ip netns add ns0
ip link set veth11 netns ns0
ip netns exec ns0 ip link set veth11 up
ip netns exec ns0 ip addr add 192.168.100.100/24 dev veth11
ip link set veth10 up
ovs-vsctl add-port br0 veth10 tag=100

# 设置 ns1 和 veth pair (20,21), 处于 vlan100
ip netns add ns1
ip link add name veth20 type veth peer name veth21
ip link set veth21 netns ns1
ip netns exec ns1 ip link set veth21 up
ip netns exec ns1 ip addr add 192.168.100.101/24 dev veth21
ip link set veth20 up
ovs-vsctl add-port br0 veth20 tag=100

# 设置 ns2 和 veth pair (30,31), 处于 vlan100
ip netns add ns2
ip link add name veth30 type veth peer name veth31
ip link set veth31 netns ns2
ip netns exec ns2 ip link set veth31 up
ip netns exec ns2 ip addr add 192.168.100.102/24 dev veth31
ovs-vsctl add-port br0 veth30 tag=101
ip link set veth30 up

# 创建 ns-router 用来模拟路由器，
ip netns add ns-router

# vlan100 使用 veth pair 连接到路由器
ip link add name router-veth10 type veth peer name router-veth11
ip link set router-veth11 netns ns-router
ip link set router-veth10 up
ip netns exec ns-router ip link set router-veth11 up
ip netns exec ns-router ip addr add 192.168.100.1/24 dev router-veth11
ovs-vsctl add-port br0 router-veth10 tag=100

# 将  vlan101 使用 veth pair 连接到路由器
ip link add name router-veth20 type veth peer name router-veth21
ip link set router-veth21 netns ns-router
ip link set router-veth20 up
ip netns exec ns-router ip link set router-veth21 up
ip netns exec ns-router ip addr add 192.168.101.1/24 dev router-veth21
ovs-vsctl add-port br0 router-veth20 tag=101

# 打开 ip forward
sysctl -w net.ipv4.ip_forward=1

# 检查 ns2 到 ns0 二层是否互通
ip netns exec ns2 arping -I veth31 -s 192.168.101.100 192.168.100.100
# 结果：不通

# 检查 ns2 到 ns0 三层是否互通
ip netns exec ns2 ping 192.168.100.100
# 结果：互通
```
