容器网络(四)vxlan

时间:2024-04-16 11:21:15

一、 什么是vxlan
VXLAN,即 Virtual Extensible LAN(虚拟可扩展局域网),是 Linux 内核本身就支持的一种网络虚似化技术。

特点:

  • 完全在内核态实现上述封装和解封装的工作。
  • 本质上是一种隧道技术,在源网络设备与目的网络设备之间的IP网络上,建立一条逻辑隧道,将用户侧报文经过特定的封装后通过这条隧道转发。
  • 将L2的以太帧封装到UDP报文(即L2 over L4)中,并在L3网络中传输。
  • 从用户的角度来看,接入网络的服务器就像是连接到了一个虚拟的二层交换机的不同端口上。

二、 常见术语
1、 VTEP(VXLAN Tunnel Endpoints,VXLAN 隧道端点)
  VXLAN 网络的边缘设备,用来进行 VXLAN 报文的处理(封包和解包)。

  VTEP 可以是网络设备(比如交换机),也可以是一台机器(比如虚拟化集群中的宿主机)。
2、 VNI(VXLAN Network Identifier,VXLAN 网络标识符)
  VNI 是每个 VXLAN 段的标识,是个 24 位整数。
3、 Tunnel(VXLAN 隧道)
  隧道是一个逻辑上的概念,在 VXLAN 模型中并没有具体的物理实体向对应。

  隧道可以看做是一种虚拟通道,VXLAN 通信双方认为自己是在直接通信,并不知道底层网络的存在。

  从整体来说,每个 VXLAN 网络像是为通信的虚拟机搭建了一个单独的通信通道,也就是隧道。

三、在linux上实现vxlan

vxlan网络拓扑图如下,实现不同宿主机间的容器互访:

 

 

1、创建网桥、vxlan设备、容器

1)宿主机10.30.20.93

# ip link add vxlan.1 type vxlan id 1 dstport 8472 local 10.30.20.93 dev eth0 nolearning
# ip addr add 10.20.10.0/32 dev vxlan.1
# ip link set vxlan.1 up
# ip -d link show vxlan.1
# netstat -tlunp|grep 8472
udp 0 0 0.0.0.0:8472 0.0.0.0:* - 
# ip link add br10 type bridge
# ip link set br10 up
# ip addr add 10.20.10.1/32 dev br10
# ip netns add ns0
# ip link add veth0 type veth peer name eth0 netns ns0
# ip link set veth0 master br10
# ip link set veth0 up
# ip -n ns0 link set lo up
# ip -n ns0 addr add 10.20.10.2/24 dev eth0
# ip -n ns0 link set eth0 up
# route add -net 10.20.10.0/24 dev br10
# ip netns exec ns0 route add -net 0.0.0.0/0 gw 10.20.10.1

2)宿主机10.30.20.80

# ip link add vxlan.1 type vxlan id 1 dstport 8472 local 10.30.20.80 dev eth0 nolearning
# ip addr add 10.20.11.0/32 dev vxlan.1
# ip link set vxlan.1 up
# ip -d link show vxlan.1
# netstat -tlunp|grep 8472
udp 0 0 0.0.0.0:8472 0.0.0.0:* 
# ip link add br11 type bridge
# ip link set br11 up
# ip addr add 10.20.11.1/32 dev br11
# ip netns add ns0
# ip link add veth0 type veth peer name eth0 netns ns0
# ip link set veth0 master br11
# ip link set veth0 up
# ip -n ns0 link set lo up
# ip -n ns0 addr add 10.20.11.2/24 dev eth0
# ip -n ns0 link set eth0 up
# route add -net 10.20.11.0/24 dev br11
# ip netns exec ns0 route add -net 0.0.0.0/0 gw 10.20.11.1
# ip netns exec ns0 ping -c 3 10.20.11.1

3)宿主机10.30.8.73

# ip link add vxlan.1 type vxlan id 1 dstport 8472 local 10.30.8.73 dev eth0 nolearning
# ip addr add 10.20.12.0/32 dev vxlan.1
# ip link set vxlan.1 up
# ip -d link show vxlan.1
# netstat -tlunp|grep 8472
udp 0 0 0.0.0.0:8472 0.0.0.0:* 
# ip link add br12 type bridge
# ip link set br12 up
# ip addr add 10.20.12.1/32 dev br12
# ip netns add ns0
# ip link add veth0 type veth peer name eth0 netns ns0
# ip link set veth0 master br12
# ip link set veth0 up
# ip -n ns0 link set lo up
# ip -n ns0 addr add 10.20.12.2/24 dev eth0
# ip -n ns0 link set eth0 up
# route add -net 10.20.12.0/24 dev br12
# ip netns exec ns0 route add -net 0.0.0.0/0 gw 10.20.12.1
# ip netns exec ns0 ping -c 3 10.20.12.1

2、添加fdb表记录、arp表记录、路由信息

1)宿主机10.30.20.93

# bridge fdb append ca:62:2b:04:a7:76 dev vxlan.1 dst 10.30.20.80 via eth0
# bridge fdb append 5a:32:eb:56:e4:7c dev vxlan.1 dst 10.30.8.73 via eth0
# ip neigh add 10.20.11.0 lladdr ca:62:2b:04:a7:76 dev vxlan.1 nud perm
# ip neigh add 10.20.12.0 lladdr 5a:32:eb:56:e4:7c dev vxlan.1 nud perm
# sysctl net.ipv4.ip_forward=1
# route add -net 10.20.11.0/24 dev vxlan.1
# route add -net 10.20.11.0/24 gw 10.20.11.0 dev vxlan.1
# route add -net 10.20.12.0/24 dev vxlan.1
# route add -net 10.20.12.0/24 gw 10.20.12.0 dev vxlan.1

2)宿主机10.30.20.80

# bridge fdb append 42:cb:f8:c1:d2:8e dev vxlan.1 dst 10.30.20.93 via eth0
# bridge fdb append 5a:32:eb:56:e4:7c dev vxlan.1 dst 10.30.8.73 via eth0
# ip neigh add 10.20.10.0 lladdr 42:cb:f8:c1:d2:8e dev vxlan.1 nud perm
# ip neigh add 10.20.12.0 lladdr 5a:32:eb:56:e4:7c dev vxlan.1 nud perm
# sysctl net.ipv4.ip_forward=1
# route add -net 10.20.10.0/24 dev vxlan.1
# route add -net 10.20.10.0/24 gw 10.20.10.0 dev vxlan.1
# route add -net 10.20.12.0/24 dev vxlan.1
# route add -net 10.20.12.0/24 gw 10.20.12.0 dev vxlan.1

3)宿主机10.30.8.73

# bridge fdb append 42:cb:f8:c1:d2:8e dev vxlan.1 dst 10.30.20.93 via eth0
# bridge fdb append ca:62:2b:04:a7:76 dev vxlan.1 dst 10.30.20.80 via eth0
# ip neigh add 10.20.10.0 lladdr 42:cb:f8:c1:d2:8e dev vxlan.1 nud perm
# ip neigh add 10.20.11.0 lladdr ca:62:2b:04:a7:76 dev vxlan.1 nud perm
# sysctl net.ipv4.ip_forward=1
# route add -net 10.20.10.0/24 dev vxlan.1
# route add -net 10.20.10.0/24 gw 10.20.10.0 dev vxlan.1
# route add -net 10.20.11.0/24 dev vxlan.1
# route add -net 10.20.11.0/24 gw 10.20.11.0 dev vxlan.1

四、抓包分析

容器10.20.10.2访问容器10.20.11.2。
数据包转发过程:
容器(10.20.10.2)->br10(10.20.10.1)->匹配路由->vxlan.1(10.20.10.0)->eth0(10.30.20.93)->eth0(10.30.20.80:8472)->vxlan.1(10.20.11.0)->匹配路由->br11(10.20.11.1)->容器(10.20.11.2)

1、 容器(10.20.10.2)->br10(10.20.10.1)
数据包从容器发出,先达到网关10.20.10.1

 

2、br10(10.20.10.1)->匹配路由
数据包达到宿主机后,进行路由匹配

 

凡是发往 10.20.11.0/24 网段的 IP 包,都需要经过vxlan.1设备发出,并且,它最后被发往的网关地址是:10.20.10.0

 

 查看arp表,10.20.11.0的mac地址为ca:62:2b:04:a7:76

 

 3、 vxlan.1(10.20.10.0)->eth0(10.30.20.93:8472)

查看网桥的转发表,mac地址为ca:62:2b:04:a7:76的,下一跳是10.30.20.80,从eth0设备发出

 

 

将原始数据包添加VNI头部、使用udp协议,发送到10.30.20.80:8472 

 

 4、 vxlan.1(10.20.11.0)->匹配路由->br11(10.20.11.1)->容器(10.20.11.2)

vxlan.1设备对数据包解封后,查看路由表,转发到br11,最后到达目的容器