惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Hackread – Cybersecurity News, Data Breaches, AI and More
W
WeLiveSecurity
C
Check Point Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
A
Arctic Wolf
NISL@THU
NISL@THU
N
Netflix TechBlog - Medium
The Register - Security
The Register - Security
M
MIT News - Artificial intelligence
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Microsoft Security Blog
Microsoft Security Blog
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tenable Blog
G
GRAHAM CLULEY
O
OpenAI News
S
Schneier on Security
Google Online Security Blog
Google Online Security Blog
Vercel News
Vercel News
宝玉的分享
宝玉的分享
Attack and Defense Labs
Attack and Defense Labs
T
The Blog of Author Tim Ferriss
量子位
aimingoo的专栏
aimingoo的专栏
The Cloudflare Blog
P
Privacy & Cybersecurity Law Blog
S
SegmentFault 最新的问题
MongoDB | Blog
MongoDB | Blog
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
LINUX DO - 热门话题
博客园_首页
F
Full Disclosure
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Docker
U
Unit 42
A
About on SuperTechFans
博客园 - 司徒正美
Hacker News - Newest:
Hacker News - Newest: "LLM"
人人都是产品经理
人人都是产品经理
Application and Cybersecurity Blog
Application and Cybersecurity Blog
G
Google Developers Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
Scott Helme
Scott Helme
TaoSecurity Blog
TaoSecurity Blog

郑文峰的博客

使用dify对接飞书多维表格 使用n8n对接飞书多维表格 服务启动时出现 OOM 一次服务升级时pg表DDL执行超时失败 Go语言高效IO缓冲技术详解 Go语言延迟初始化(Lazy Initialization)最佳实践 Go语言字符串拼接性能对比与优化指南 Go语言结构体内存对齐完全指南 Go语言空结构体:零内存消耗的高效编程 Go语言堆栈分配与逃逸分析深度解析 Go语言原子操作完全指南 Go语言内存预分配完全指南 Go语言不可变数据共享:无锁并发编程实践 Go语言零拷贝技术完全指南 Go语言遍历性能深度解析:从原理到优化实践 Go语言Interface Boxing原理与性能优化指南 Go协程池深度解析:原理、实现与最佳实践 使用etcd分布式锁导致的协程泄露与死锁问题 基于pre-commit的Python代码规范落地实践 初识 MCP Server pulsar阻塞导致logstash无法接入日志 django-prometheus使用及源码分析 kube-proxy源码分析 kubernetes service如何通过iptables转发 tcp缓存引起的日志丢失 django-apschedule定时任务异常停止 理解calico容器网络通信方案原理 理解flannel的三种容器网络方案原理 理解Linux IPIP隧道 理解Linux TunTap设备 快速了解iptables kafka中listener和advertised.listeners的作用 django rest_framework 分页 django后端服务、logstash和flink接入VictoriaMetrics指标监控 python中import原理 docker容器单机网络 手动实现docker容器bridge网络模型 mysql之MVCC原理 mysql之日志 使用java开发logstash的filter插件 使用python实现单例模式的三种方式 redis之缓存 redis之分片集群 redis之哨兵机制 redis之主从库同步 redis之持久化 redis之五种基本数据类型 go中如何处理error pod中将代码与运行环境分离 ddt源码分析 python装饰器的使用方法 读书笔记:如何阅读一本书 使用ddt实现unittest的参数化测试 使用kubeadm安装k8s 优化gin表单的错误提示信息 gin中validator模块的源码分析 go简单使用grpc python简单使用grpc k8s之PV、PVC和StorageClass k8s之StatefulSet k8s之DaemonSet k8s之Job和CronJob k8s之ConfigMap和Secret k8s之Service k8s之Pod k8s之Deployment 容器的本质 docker容器 python迭代器与生成器 python元编程 python垃圾回收机制 python上下文管理器 django rest_framework使用jwt django rest_framework异常处理 django rest_framework 自定义文档 django压缩文件下载 django rest_framework使用pytest单元测试 django restframework choice 自定义输出数据 django Filtering 使用 django viewset 和 Router 配合使用时报的错 django model的序列化 django中使用AbStractUser django.core.exceptions.ImproperlyConfigured Application labels aren't unique, duplicates users django 中 media配置 django 外键引用自身和on_delete参数 django 警告 while time zone support is active Flask使用flask_socketio实现websocket flask结合mongo tornado 文件上传 tornado 使用jwt完成用户异步认证 tornado 用户密码 bcrypt加密 tornado 结合wtforms使用表单操作 tornado finish和write区别 tornado 使用peewee-async 完成异步orm数据库操作 pyspark streaming简介 和 消费 kafka示例 使用hue创建ozzie的pyspark action workflow count的性能优化 django rest_framework Authentication django celery 结合使用 网站
理解VXLAN网络
zhengwenfeng · 2023-05-26 · via 郑文峰的博客

# 什么是VXLAN?

在三层可达的网络中部署VXLAN,在每个VXLAN网络端点中都有一个VTEP设备,负责将VXLAN协议的数据包进行UDP数据包的封包和解包,可以将其理解为隧道,将VXLAN数据包从逻辑网络转发到物理网络

VXLAN使用24位的VXLAN网络标识符(VNI)来标识不同的虚拟网络

# 点对点的VXLAN

在已经知道对端VTEP所在节点,是如何进行跨节点通信的。

# 实操

在Node上新增VTEP设备vxlan0,创建命令如下:

ip link add vxlan0 type vxlan id 42 dstport 4789 remote 10.65.132.188 local 10.65.132.187 dev ens18

1

  • remote是对端节点的IP
  • local是本节点IP
  • id是VNI的值
  • dstport 是VTEP设备的端口

创建好后,需要给它配置IP并启用

ip a add 172.17.1.2/24 dev vxlan0
ip link set vxlan0 up

1
2

vxlan0详情如下:

# ip -d link show dev vxlan0
114: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 86:45:5c:56:49:42 brd ff:ff:ff:ff:ff:ff promiscuity 0 
    vxlan id 42 remote 10.65.132.187 local 10.61.74.37 dev ens18 srcport 0 0 dstport 4789 ageing 300 noudpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

1
2
3
4

并且可以看到路由中新增一条记录,所有目的地址是172.17.1.0/24网段的包都要走vxlan0转发。

# ip r
...
172.17.1.0/24 dev vxlan0 proto kernel scope link src 172.17.1.2
...

1
2
3
4

同时fdb表中新增以下记录,代表着,所有进过vxlan0包的外部UDP目的地址都会设置为10.65.132.187,并从ens18网卡出去。

]# bridge fdb | grep vxlan0
00:00:00:00:00:00 dev vxlan0 dst 10.65.132.187 via ens18 self permanent

1
2

到这里,Node1已经配置好了,我们重复上面操作设置Node2,只需要将部分IP修改即可。

# 将Node1中remote和local反过来即可.
ip link add vxlan0 type vxlan id 42 dstport 4789 remote 10.65.132.187 dev ens18 local 10.65.132.188 dev ens18

# vxlan0 地址设置为172.17.1.3/24
ip a add 172.17.1.3/24 dev vxlan0
ip link set vxlan0 up

# ip -d link show vxlan0
20: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 12:09:3d:c0:97:32 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 
    vxlan id 42 remote 10.65.132.187 local 10.65.132.188 dev ens18 srcport 0 0 dstport 4789 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

1
2
3
4
5
6
7
8
9
10
11

# 开测

在Node2上监听Node1的udp数据包

tcpdump -i ens18 udp and host 10.65.132.187 -n

1

然后在Node1中ping Node2的VTEP设备地址172.17.1.3

[root@k8s-master-07rf9 ~]# ping 172.17.1.3 -c 3
PING 172.17.1.3 (172.17.1.3) 56(84) bytes of data.
64 bytes from 172.17.1.3: icmp_seq=1 ttl=64 time=0.841 ms
64 bytes from 172.17.1.3: icmp_seq=2 ttl=64 time=0.382 ms
64 bytes from 172.17.1.3: icmp_seq=3 ttl=64 time=0.377 ms

1
2
3
4
5

可以看到tcpdump抓到的数据包如下,先收到了Node1的发过来封装了ARP数据包的数据包,想要知道Node2中VTEP设备的MAC地址,然后回给了Node1,Node1收到后,将MAC地址填充,再将封装了ICMP的VXLAN数据包发送到Node2,Node2中VTEP收到包并解包,最后回包给Node1

[root@k8s-work01-1zapn ~]# tcpdump -i ens18 udp and host 10.65.132.187 -n
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens18, link-type EN10MB (Ethernet), capture size 262144 bytes
19:23:36.705418 IP 10.65.132.187.34062 > 10.65.132.188.vxlan: VXLAN, flags [I] (0x08), vni 42
ARP, Request who-has 172.17.1.3 tell 172.17.1.2, length 28
19:23:36.705574 IP 10.65.132.188.20835 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
ARP, Reply 172.17.1.3 is-at 3a:84:39:cc:05:93, length 28
19:23:36.705880 IP 10.65.132.187.jboss-iiop > 10.65.132.188.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.17.1.2 > 172.17.1.3: ICMP echo request, id 25707, seq 1, length 64
19:23:36.705986 IP 10.65.132.188.62793 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.17.1.3 > 172.17.1.2: ICMP echo reply, id 25707, seq 1, length 64
19:23:37.708701 IP 10.65.132.187.jboss-iiop > 10.65.132.188.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.17.1.2 > 172.17.1.3: ICMP echo request, id 25707, seq 2, length 64
19:23:37.708846 IP 10.65.132.188.62793 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.17.1.3 > 172.17.1.2: ICMP echo reply, id 25707, seq 2, length 64
19:23:38.732737 IP 10.65.132.187.jboss-iiop > 10.65.132.188.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.17.1.2 > 172.17.1.3: ICMP echo request, id 25707, seq 3, length 64
19:23:38.732846 IP 10.65.132.188.62793 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.17.1.3 > 172.17.1.2: ICMP echo reply, id 25707, seq 3, length 64
19:23:41.804637 IP 10.65.132.188.20835 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
ARP, Request who-has 172.17.1.2 tell 172.17.1.3, length 28
19:23:41.804917 IP 10.65.132.187.34062 > 10.65.132.188.vxlan: VXLAN, flags [I] (0x08), vni 42
ARP, Reply 172.17.1.2 is-at c2:a1:4e:56:7d:eb, length 28

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# VXLAN的多播模式

在我们不知道VTEP所在节点的情况下,并且需要使用多个VTEP组建逻辑网络。

# 通信过程

  1. 在Node1上通过ping Node2上vxlan0设备ip,数据包通过路由到达vxlan0,vxlan0发现目的IP和源IP属于同一网段,需要知道对方的MAC地址,因此需要发送ARP查询报文。
  2. ARP报文中,源MAC地址为Node1上vxlan0的mac地址,目的mac地址为255.255.255.255也就是广播地址,并且添加VXLAN头部VNI=42
  3. 因为不知道对端的VTEP设备在哪台节点上,所以vxlan0会向多播地址224.1.1.1发送多播报文。
  4. 多播组中所有的主机都会收到报文,并且内核会判断该数据包为VXLAN报文,根据VNI发送给VTEP设备。
  5. Node2中vxlan0收到报文后,解包拿到ARP报文,然后通过ARP报文学习到了将Node1的vxlan0的mac地址与Node1 IP的映射关系记录到FDB表中,并且生成ARP应答报文。
  6. ARP应答报文中,目的主机Node1的MAC地址和目的主机Node1中vxlan0的MAC地址都通过发过来的ARP报文中学习到,所以可以直接通过单播进行回复。
  7. Node1收到ARP回复的报文后,通过报文内容,将Node2的主机地址和vxlan0的MAC地址的映射关系缓存到FDB表中。
  8. 现在双方都已经通过ARP报文获得了双方的建立ICMP通信的所有信息,可以直接通过通过单播进行通信。

# 环境准备

首先在Node1中新增VTEP设备vxlan0,VNI为42,通信端口4789,主机地址为10.65.132.187,设置多播地址为224.1.1.1,数据包通过ens18真实网卡出去。

ip link add vxlan0 type vxlan id 42 dstport 4789 local 10.65.132.187 group 224.1.1.1 dev ens18

1

给vxlan0添加地址172.17.1.2/24,并把它拉起

ip addr add 172.17.1.2/24 dev vxlan0
ip link set vxlan0 up

1
2

查看vxlan0的详细信息

# ip -d link  show vxlan0
22: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 4e:92:72:79:59:ed brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 
    vxlan id 42 group 224.1.1.1 local 10.65.132.187 dev ens18 srcport 0 0 dstport 4789 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

1
2
3
4

再看看fdb表,意思是,vxlan0封包的时候,默认会使用224.1.1.1作为VXLAN包也就是外部UDP的目的IP。

# bridge fdb | grep vxlan0
00:00:00:00:00:00 dev vxlan0 dst 224.1.1.1 via ens18 self permanent

1
2

在Node2上重复上述操作

ip link add vxlan0 type vxlan id 42 dstport 4789 local 10.65.132.188 group 224.1.1.1 dev ens18

ip addr add 172.17.1.3/24 dev vxlan0
ip link set vxlan0 up

# ip -d link show vxlan0
11: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether ba:d8:43:67:8d:fb brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 
    vxlan id 42 group 224.1.1.1 local 10.65.132.188 dev ens18 srcport 0 0 dstport 4789 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

1
2
3
4
5
6
7
8
9

# 开始分析

先使用tcpdump来监听Node2中ens18网卡中来自Node1的UDP数据包,然后在Node1上ping Node2中vxlan0设备。

可以看到是可以ping通的。

# ping 172.17.1.3 -c 1
PING 172.17.1.3 (172.17.1.3) 56(84) bytes of data.
64 bytes from 172.17.1.3: icmp_seq=1 ttl=64 time=0.807 ms

--- 172.17.1.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.807/0.807/0.807/0.000 ms

1
2
3
4
5
6
7

再来看看抓到的包:

  1. 第一个数据包,可以看到Node2收到了来自Node1的 VXLAN数据包,vni为42,目的地址是多播IP224.1.1.1,因为我们创建的VTEP设备设置了该多播IP,所以会接收该数据包。且里面封装了ARP数据包,需要将172.17.1.3的MAC地址告诉172.17.1.2。
  2. 第二个数据包可以看到回复了一个VXLAN数据包,里面包含了ARP应答包,将172.17.1.3的mac地址也就是vxlan0的地址回复过去。
  3. 第三个数据包是Node1 vxlan0根据对方的MAC地址和Node2的IP地址,直接单播发送包含了ICMP数据包的VXLAN数据包到Node2
  4. 第四个数据包时Node2 vxlan0进行回复ICMP,也是包裹在一个VXLAN数据包中,发送到Node1中。
# tcpdump -i ens18 udp and host 10.65.132.187 -n
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens18, link-type EN10MB (Ethernet), capture size 262144 bytes

10:31:34.560469 IP 10.65.132.187.34062 > 224.1.1.1.vxlan: VXLAN, flags [I] (0x08), vni 42
ARP, Request who-has 172.17.1.3 tell 172.17.1.2, length 28
10:31:34.560616 IP 10.65.132.188.20835 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
ARP, Reply 172.17.1.3 is-at ba:d8:43:67:8d:fb, length 28
10:31:34.560819 IP 10.65.132.187.jboss-iiop > 10.65.132.188.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.17.1.2 > 172.17.1.3: ICMP echo request, id 46810, seq 1, length 64
10:31:34.560935 IP 10.65.132.188.62793 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.17.1.3 > 172.17.1.2: ICMP echo reply, id 46810, seq 1, length 64
10:31:39.661990 IP 10.65.132.188.20835 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
ARP, Request who-has 172.17.1.2 tell 172.17.1.3, length 28
10:31:39.662329 IP 10.65.132.187.34062 > 10.65.132.188.vxlan: VXLAN, flags [I] (0x08), vni 42
ARP, Reply 172.17.1.2 is-at 4e:92:72:79:59:ed, length 28

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

再次ping Node2的vxlan0设备,通过抓包可以看到,不需要发送ARP报文了,是因为Node1已经缓存了ARP。

第一个数据包目的IP不再是224.1.1.1多播地址了,而是Node2的地址。是因为vxlan0也已经缓存到fdb表中。

10:49:36.712777 IP 10.65.132.187.jboss-iiop > 10.65.132.188.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.17.1.2 > 172.17.1.3: ICMP echo request, id 41695, seq 1, length 64
10:49:36.712973 IP 10.65.132.188.62793 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.17.1.3 > 172.17.1.2: ICMP echo reply, id 41695, seq 1, length 64

1
2
3
4

查看arp缓存

# arp | grep vxlan0
172.17.1.3               ether   ba:d8:43:67:8d:fb   C                     vxlan0

1
2

查看fdb表,添加了Node2中vxlan0的MAC地址和Node2地址的映射表项。

# bridge fdb | grep vxlan0
00:00:00:00:00:00 dev vxlan0 dst 224.1.1.1 via ens18 self permanent
ba:d8:43:67:8d:fb dev vxlan0 dst 10.65.132.188 self

1
2
3

# VXLAN多播模式+桥接

在VXLAN的多播的基础上再加上桥接网络。

# 通信过程

桥接网络模拟及通信到宿主机过程可以参考手动实现docker容器bridge网络模型

数据包达到网桥后,然后再转发到vxlan0中,接下来的流程也与上面将的多播是一致的。

# 环境准备

在Node1上运行如下命令准备环境

# 添加VTEP设备
ip link add vxlan0 type vxlan id 42 dstport 4789 local 10.65.132.187 group 224.1.1.1 dev ens18

# 添加网桥
ip link add bridge0 type bridge
ip link set vxlan0 master bridge0
ip link set vxlan0 up
ip link set bridge0 up

# 添加net1模拟容器
ip netns add net1
ip link add veth0 type veth peer name veth1
ip link set dev veth0 up

# 将另一端绑定在网桥上
ip link set dev veth1 up
ip link set dev veth1 master bridge0


# 设置net1中网络配置
ip link set dev veth0 netns net1
ip netns exec net1 ip addr add 172.19.1.2/24 dev veth0
ip netns exec net1 ip link set veth0 up

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

在Node2中重复上面操作,将172.19.1.3/24绑定到另一个Network Namespace net3中

# 添加VTEP设备
ip link add vxlan0 type vxlan id 42 dstport 4789 local 10.65.132.188 group 224.1.1.1 dev ens18

# 添加网桥
ip link add bridge0 type bridge
ip link set vxlan0 master bridge0
ip link set vxlan0 up
ip link set bridge0 up

# 添加net1模拟容器
ip netns add net3
ip link add veth0 type veth peer name veth1

# 将另一端绑定在网桥上
ip link set dev veth1 up
ip link set dev veth1 master bridge0

# 设置net1中网络配置
ip link set dev veth0 netns net3
ip netns exec net3 ip addr add 172.19.1.3/24 dev veth0
ip netns exec net3 ip link set veth0 up

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 开始分析

在Node1的net1中ping Node2中的net3,可以看到有回包,说明网络是通的。

# ip netns exec net1 ping 172.19.1.3 -c 2
PING 172.19.1.3 (172.19.1.3) 56(84) bytes of data.
64 bytes from 172.19.1.3: icmp_seq=1 ttl=64 time=0.992 ms
64 bytes from 172.19.1.3: icmp_seq=2 ttl=64 time=0.605 ms

1
2
3
4

通过监听Node2的网卡ens18,抓到以下的包:

  1. 首先是Node1发送包含ARP的UDP包到多播地址224.1.1.1,因为Node2是属于该多播地址,所以会接收该包,并通过vxlan0进行解包,最终拿到ARP包,然后发送vxlan0的mac地址进行arp回包,也是通过封装到UDP包中发送Node1中,然后再通过vxlan0->bridge进入到net1中,net1中收到ARP后,将Node2的容器IP地址和mac地址缓存到ARP中。

  2. 并且在fdb表中添加一项,net3的的mac地址与Node2的IP地址映射关系

  3. 接下来是通过ARP缓存找到MAC地址并添加到ICMP的IP包上,然后再将其封装到UDP包中,UDP的源IP是通过查询fdb表得到的,可以直接通过单播发送。

7:15:47.595683 IP 10.65.132.187.34062 > 224.1.1.1.vxlan: VXLAN, flags [I] (0x08), vni 42
ARP, Request who-has 172.19.1.3 tell 172.19.1.2, length 28
17:15:47.595863 IP 10.65.132.188.20835 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
ARP, Reply 172.19.1.3 is-at 02:fd:f9:7f:61:a7, length 28
17:15:47.596172 IP 10.65.132.187.42208 > 10.65.132.188.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.19.1.2 > 172.19.1.3: ICMP echo request, id 51397, seq 1, length 64
17:15:47.596295 IP 10.65.132.188.22080 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.19.1.3 > 172.19.1.2: ICMP echo reply, id 51397, seq 1, length 64
17:15:48.596543 IP 10.65.132.187.42208 > 10.65.132.188.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.19.1.2 > 172.19.1.3: ICMP echo request, id 51397, seq 2, length 64
17:15:48.596724 IP 10.65.132.188.22080 > 10.65.132.187.vxlan: VXLAN, flags [I] (0x08), vni 42
IP 172.19.1.3 > 172.19.1.2: ICMP echo reply, id 51397, seq 2, length 64

1
2
3
4
5
6
7
8
9
10
11
12

可以看到net1中已经缓存了net3的ip地址与mac地址

# Node1
# ip netns exec net1 arp 
Address                  HWtype  HWaddress           Flags Mask            Iface
172.19.1.3               ether   02:fd:f9:7f:61:a7   C                     veth0

1
2
3
4

net3中的mac地址和net1中的arp缓存是对应上的。

# ip netns exec net3 ip -d link show veth0
34: veth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 02:fd:f9:7f:61:a7 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 0 minmtu 68 maxmtu 65535 
    veth addrgenmode eui64 numtxqueues 8 numrxqueues 8 gso_max_size 65536 gso_max_segs 65535 

1
2
3
4

查看fdb表,新增了net3的mac地址和Node2的IP地址映射关系

# bridge fdb | grep vxlan0
02:fd:f9:7f:61:a7 dev vxlan0 dst 10.65.132.188 self

1
2

# 巨人的肩膀

  • 《kubernetes网络权威指南》