零入门kubernetes网络实战-36->基于vethpair-bridge-静态点对点模式的vxlan实现内网的跨主机通信方案一

news2025/1/10 23:32:19

《零入门kubernetes网络实战》视频专栏地址

https://www.ixigua.com/7193641905282875942

本篇文章视频地址(稍后上传)



本篇文章主要测试使用vxlan的点对点模式下实现跨主机的内网通信。

本篇文章采用的vxlan点对点模式是静态点对点,也就是说,目的VETP设备已经确定好了,目的VETP设备的MAC信息是确定的。

不需要通过其他方式获取。

主要用到的网络设备包括:veth pair, bridge ,vxlan;
以及路由技术,UDP协议。

1、总结

  • 本篇文章主要是测试了静态点对点模式下的vxlan技术,如何实现"不同节点上的内网如何实现跨节点通信"。
  • 重点分析了第一次请求时,数据包的报文结构变化过程
  • 重点分析了第一次请求时,数据包主要经过了哪些iptables规则链
  • 重点分析了第一次请求时,数据包从发送端到接收端整个过程,都涉及到了哪些网络设备,路由,网络协议等
  • 阐释了为什么说vxlan模式是MAC in UDP?
  • wireshark如何解析UDP数据包?

2、测试环境介绍

两台centos虚拟机

# 查看操作系统版本
cat /etc/centos-release
# 内核版本
uname -a
uname -r 
# 查看网卡信息
ip a s eth0

在这里插入图片描述

3、网络拓扑

在这里插入图片描述

4、操作实战

4.1、master节点上

接下来,在master节点上,通过相关命令来构建网络拓扑

4.1.1、创建ns1网络命名空间

ip netns add ns1

4.1.2、创建网桥、并设置IP

ip link add br0 type bridge
ip addr add 10.244.1.1/24 dev br0
ip link set br0 up

4.1.3、创建veth pair,并进行相应设置

ip link add veth1a type veth peer name veth1b

ip link set veth1a netns ns1 
ip netns exec ns1 ip address add 10.244.1.2/24 dev veth1a
ip netns exec ns1 ip link set veth1a up

ip link set veth1b master br0 
ip link set veth1b up 

ip netns exec ns1 ip link set lo up

4.1.4、创建vxlan设备,并进行相应设置

ip link add vxlan11 type vxlan id 11 dstport 4789 remote 10.211.55.123 local 10.211.55.122  dev eth0 
ip addr add 10.244.1.0/32 dev vxlan11
ip link set vxlan11 up

4.1.5、进入到ns1空间里,设置去往其他网段的路由

ip netns exec ns1 ip route add 10.244.2.0/24 via 10.244.1.1 dev veth1a

4.1.6、在主命名空间下,设置去往其他VTEP设备的路由

ip r a 10.244.2.0/24 via 10.244.2.0 dev vxlan11 onlink 

4.2、slave节点上

接下来,在slave节点上,通过相关命令来构建网络拓扑

4.2.1、创建ns2网络命名空间

ip netns add ns2

4.2.2、创建网桥、并设置IP

ip link add br0 type bridge
ip addr add 10.244.2.1/24 dev br0
ip link set br0 up

4.2.3、创建veth pair,并进行相应设置

ip link add veth2a type veth peer name veth2b

ip link set veth2a netns ns2 
ip netns exec ns2 ip address add 10.244.2.2/24 dev veth2a
ip netns exec ns2 ip link set veth2a up

ip link set veth2b master br0 
ip link set veth2b up 

ip netns exec ns2 ip link set lo up

4.2.4、创建vxlan设备,并进行相应设置

ip link add vxlan11 type vxlan id 11 dstport 4789 remote 10.211.55.122 local 10.211.55.123  dev eth0 
ip addr add 10.244.2.0/32 dev vxlan11
ip link set vxlan11 up

4.2.5、进入到ns2空间里,设置去往其他网段的路由

ip netns exec ns2 ip route add 10.244.1.0/24 via 10.244.2.1 dev veth2a

4.2.6、在主命名空间下,设置去往其他VTEP设备的路由

ip r a 10.244.1.0/24 via 10.244.1.0 dev vxlan11 onlink 

在这里插入图片描述

4.3、登录到master节点上,发起ICMP协议请求

ip netns exec ns1 ping -c 1 10.244.2.2

在这里插入图片描述

5、分析master节点到slave节点第一次请求时,数据包报文结构

5.1、在master节点上,对网桥进行抓包

tcpdump -nn -i br0
tcpdump -nn -i br0 -w br0.pcap

5.2、在master节点上,对vxlan11设备进行抓包

tcpdump -nn -i vxlan11
tcpdump -nn -i vxlan11 -w vxlan11.pcap

5.3、在master节点上,对eth0网卡进行抓包

tcpdump -nn -i eth0 port 4789
tcpdump -nn -i eth0 port 4789 -w eth0.pcap

5.4、在master节点上,重新发起请求

ip netns exec ns1 ping -c 1 10.244.2.2

分析一下网桥br0的数据包
在这里插入图片描述

分析一下,vxlan11设备的数据包
在这里插入图片描述

分析一下,eth0网卡的数据包
在这里插入图片描述

5.5、第一次请求时,传输过程中数据包报文结构变化

在这里插入图片描述

在master节点上:

  • 从ns1里发起ping -c 1 10.244.2.2请求产生icmp数据包
  • ICMP数据包通过veth1a到达网桥br0
  • 数据包达到网桥后,通过路由等转发到了vxlan11设备
  • 经过vxlan11设备后,更新了ICMP数据包的源MAC地址,目的MAC地址
  • 从vxlan11出来后,linux内核将此数据包作为原始包,封装到了UDP包里,通过eth0发送出去。

而在slave节点上:

  • eth0网卡接收到master节点发送过来的数据包后,发现目的MAC地址是eth0网卡的,就进行解析
  • 发现此数据包带有vxlan头部,就将此UDP数据包的内部数据交由vxlan11设备处理
  • vxlan11设备解析此数据包(接收的数据包是UDP里的被封装的数据,即ICMP数据包),发现目的IP地址是10.244.2.2,经过路由判断就交由br0网桥处理
  • br0网桥,将此数据包转发给veth2b,在转发给了ns2里veth2a网卡处理。

通过上面的流程,封装,解封装
我们知道内部网络ns1产生的ICMP数据包被封装到了物理网络里,通过物理网络进行的传输。

6、为什么说vxlan是MAC in UDP呢?(纯属个人理解)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

从对vxlan11的抓包分析,可知道,vxlan不负责创建UDP数据包,

vxlan11,至少做了一件事,更新了从网桥br0接收到数据包的源MAC,目的MAC地址。

源MAC地址变为了vxlan11自己的MAC地址

目的MAC地址变为了目的vxlan11设备的MAC地址。

7、分析master节点到slave节点第一次请求时,经过的iptables规则链

为了能够监测到iptables规则链,需要给master节点、slave节点添加日志埋点。

需要用到rsyslog服务。

参考下面的步骤,分别在master节点,slave节点上安装即可。

7.1、安装rsyslog(已安装,可跳过此步骤)

7.1.1、安装rsyslog服务

yum -y install rsyslog

7.1.2、更新配置文件

echo "kern.*     /var/log/iptables.log" >> /etc/rsyslog.conf 

在这里插入图片描述

.*,表示所有等级的消息都添加到iptables.log文件里

信息等级的指定方式

  • .XXX,表示 大于XXX级别的信息
  • .=XXX,表示等于XXX级别的信息
    • 如,kern.=notice /var/log/iptables.log, 将notice以上的信息添加到iptables.log里
  • .!XXX, 表示在XXX之外的等级信息

7.1.3、重启rsyslog服务

systemctl restart rsyslog

systemctl status  rsyslog

在这里插入图片描述

7.2、在master节点上添加日志埋点

iptables -t nat -I PREROUTING -d 10.244.2.0/24 -j LOG --log-prefix "Nat-PREROUTING-1-"
iptables -t filter -A FORWARD -d 10.244.2.0/24 -j LOG --log-prefix "Filter-FORWARD-1-"
iptables -t nat -A POSTROUTING -d 10.244.2.0/24 -j LOG --log-prefix "Nat-POSTROUTING-1-"

iptables -t nat -I PREROUTING -d 10.211.55.123 -j LOG --log-prefix "Nat-PREROUTING-2-"
iptables -t filter -A FORWARD -d 10.211.55.123 -j LOG --log-prefix "Filter-FORWARD-2-"
iptables -t nat -I OUTPUT -d 10.211.55.123 -j LOG --log-prefix "Nat-OUTPUT-2-"
iptables -t nat -A POSTROUTING -d 10.211.55.123 -j LOG --log-prefix "Nat-POSTROUTING-2-"

在这里插入图片描述

因为一开始,我们是不知道数据包经过哪些链的

因此,我们可以给所有的链添加日志埋点。

其实,主要是三条路线:

  • PREROUTING->INPUT
  • PREROUTING->FORWARD->POSTROUTING
  • OUTPUT->POSTROUTING

在这三条路线上,添加上日志埋点即可。

实时查看日志变化

tail -f /var/log/iptables.log

7.3、在slave节点上添加日志埋点

iptables -t nat -I PREROUTING -p udp --dport 4789 -j LOG --log-prefix "Nat-PREROUTING-1-"
iptables -t filter -I INPUT -p udp --dport 4789 -j LOG --log-prefix "Nat-INPUT-1-"

iptables -t nat -I PREROUTING -d 10.244.2.2 -j LOG --log-prefix "Nat-PREROUTING-2-"
iptables -t nat -I OUTPUT -d 10.244.2.2 -j LOG --log-prefix "Nat-OUTPUT-2-"
iptables -t nat -A INPUT -d 10.244.2.2 -j LOG --log-prefix "Nat-INPUT-2-"
iptables -t filter -I FORWARD -d 10.244.2.2 -j LOG --log-prefix "filter-FORWARD-2-"
iptables -t nat -A POSTROUTING -d 10.244.2.2 -j LOG --log-prefix "Nat-POSTROUTING-2-"

在这里插入图片描述

实时查看日志变化

tail -f /var/log/iptables.log

7.4、在master节点上,重新发起请求

7.4.1、查看master节点上的日志

在这里插入图片描述

7.4.2、查看slave节点上的日志

在这里插入图片描述

7.5、第一次请求时,经过的iptables规则链

在这里插入图片描述

需要明白
数据包在不同设备之间进行转发时,都经过了哪些链。

8、整体分析一下,第1次请求时,数据包到底经过了什么才能到达对方?(仅供参考)

在分析iptables规则链的基础上,我们进一步分析一下。

只有明白数据包到底经过了哪些设备,哪些规则链,出现问题后,才能一步一步的进行排错。

8.1、整体流程解剖图

在这里插入图片描述

该图主要画出了不同网络设备之间数据包转发时,主要用到了哪些知识点

比方说:

master节点上的veth1a产生的数据包到网桥br0时,主要涉及到了容器里的路由,以及ARP。

数据包从br0到vxlan11设备时,中间主要涉及到了宿主机路由,iptables规则链,以及路由转发功能ip_forward。

其他类似。

8.2、在master节点上,数据包从veth1a是如何到网桥br0的?

在ns1网络命名空间里,当发起ping -c 1 10.244.2.2命令请求后,主要发生了什么事情

ping命令产生数据包的目的地址是10.244.2.2,先通过arp查询10.244.2.2的MAC地址

在这里插入图片描述

从图中可以看出来,没有查询到。

即,本地没有缓存目的地址的MAC地址,因此,需要创建ARP数据包,获取目的IP的MAC地址。

目的地址跟本地地址不在同一个局域网里,本地网络是10.244.1.10/24,而目的网络是10.244.2.0/24

因此,需要将ARP数据包发送给本地网络的网关,网关地址就是网桥br0,10.244.1.1

看一下,对网桥的抓包数据

在这里插入图片描述

网桥收到数据包后,对其进行解析,发现是ARP包,目的地址是网桥自己的。

网桥就会将自己的MAC地址发送给veth1a

在这里插入图片描述

也就是说,想获取的是10.244.2.2IP的MAC地址,实际上获取到的是10.244.1.1的MAC地址。

veth1a网卡收到网桥反馈的ARP数据包后,就会创建ICMP数据包;

此时,数据包的主要报文结构内容:

  • 目的IP依旧是10.244.2.2,源IP是10.244.1.2
  • 目的MAC地址是网桥的MAC地址,源MAC地址是veth1a的MAC地址。

在这里插入图片描述

小总结:
先通过ARP协议获取目的MAC地址,
路由是设置数据包通过哪个网卡发送给哪个网络的;
因此,如果是跨网段传输的话,一定要检查是否有去往目的网络的路由

8.3、在master节点上,数据包从网桥br0是如何到vxlan11设备的?

网桥br0接收到veth1a发送过来的ICMP数据包后,对其进行解析,获取到目的MAC地址是自己的MAC地址,目的IP地址是10.244.2.2

对于网桥br0来说,它是收到的数据包(而不是通过br0发送数据包的),因此,以PREROUTING链为开始,而非OUTPUT链。
即,

  • 经过PREROUTING链
    • 在这里插入图片描述
    • 查看nat表的PRETROUTING链,发现此链只有一条规则DOCKER,数据包的目的地址是10.244.2.2不符合DOCKER规则中的dst-type LOCAL,
    • 因此,不会匹配此规则,
    • 因此,数据包最终会匹配PREROUTING链的默认规则,而默认规则是ACCEPT,因此,此数据包可以通过PREROUTING链。
  • 接下来,查看宿主机上的路由表
    • 在这里插入图片描述
    • 去往10.244.2.2的数据包,需要通过vxlan11设备发送到10.244.2.0网段,而下一跳地址是10.244.2.0,即,就是vxlan11设备的IP地址。
  • 此时,数据包已经知道去往哪个网段了,发送给哪个网卡
  • 发送给vxlan11设备时,需要经过filter表的FORWARD链
    • 在这里插入图片描述
    • 数据包经过FORWARD链时,不会匹配FORWARD链当前的规则,因为当前规则对入网卡,或者出网卡都进行了限制,而此数据包是不满足的
    • 因此,最终此数据包会匹配FORWARD链的默认规则
    • 而,默认规则是ACCEPT,因此,此数据包会通过FORWARD链
  • 接下来,数据包会通过nat表的POSTROUTING链
  • 在这里插入图片描述
    • 数据包不会匹配POSTROUTING链的规则,源IP地址不符合当前规则。
    • 因此,数据包会匹配POSTROUTING链的默认规则,
    • 同样,默认规则是ACCETP,因此,放行此数据包。
  • 最终数据包到达了vxlan11设备

由于使用了数据包的转发,同样,需要本宿主机开启路由转发功能,即
在这里插入图片描述

为1,说明已经开启了。

否则,临时设置一下

echo 1 > /proc/sys/net/ipv4/ip_forward

同一个宿主机上多个网卡之间转发数据包时,需要经过PRETOUTING链,路由表,FORWARD链,POSTROUTING链 以及 开启了路由转发功能。

8.4、在master节点上,数据包是如何从vxlan11设备到达本机的eth0对外网卡的?

vxlanll设备接收到从网桥br0转发过来的ICMP数据包,发现目的IP是10.244.2.2

vxlan11会查询宿主机上的ARP表,是否有10.244.2.2对应的MAC地址
在这里插入图片描述

上图可以看出来,是没有的。

那么,此时,需要发送ARP协议了。

在宿主机所在的主网络命名空间下查看一下,去往10.244.2.2的路由?
在这里插入图片描述

即,去往10.244.2.2目的地址的ARP数据包,需要发送给10.244.2.0地址

ARP数据包的主要报文结构内容:

目的MAC地址是00:00:00:00:00:00, 源MAC地址是vxlan11设备自己的MAC地址
目的IP是10.244.2.0,源IP是vxlan11的IP,即10.244.1.0

Linux内核发现从vxlan11设备发送出ARP数据包后,会对其进行重新封装,如封装成UDP数据包,如下图所示:
在这里插入图片描述

而UDP数据包的报文结构内容?

Linux内核需要查看vxlan11设备的详细信息,如下:

在这里插入图片描述
从这里可以获取到

目的IP是10.211.55.123,源IP是10.211.55.122

查询本地路由,就知道去往10.211.55.123目的地址的数据包需要通过本地网卡eth0,即10.211.55.122发送

因此,相当于知道了以下信息:

UDP数据包的目的MAC地址就是10.211.55.123的MAC地址,

源MAC地址就是10.211.55.122的MAC地址

源端口号是本地随机产生的,目的端口是4789

被封装的数据是vxlan头部以及ARP数据包

Linux内核产生的UDP数据包的目的地址是10.211.55.123

  • 查询路由
    • 在这里插入图片描述
    • 去往10.211.55.0网段的数据包,需要通过eth0发送
  • 路由已经知道了,接下来需要通过iptables规则链
    • 既然是Linux内核新产生的数据包而并非某个网卡接收或者转发的数据包,因此,首先需要经过OUTPUT链
  • nat表的OUTPUT链
    • 在这里插入图片描述
    • 数据包的目的地址是10.211.55.123,不满足dst-type LOCAL匹配条件,因此,不会匹配DOCKER规则
    • 最终会匹配OUTPUT的默认规则,而默认规则是ACCETP,因此,放行此数据包
  • 接下来,经过nat表的POSTROUTING链
    • 在这里插入图片描述
    • 此数据包的源IP地址不满足此规则的源匹配条件172.17.0.0/16
    • 最终会匹配默认规则,而默认规则是ACCEPT,因此,放行此数据包。
  • 最终,Linux产生的UDP数据包到达了eth0网卡
  • 通过此网卡发送出去。

即,Linux内核将vxlan11设备产生的ARP数据包封装成了UDP数据包,通过eth0网卡发送出去,UDP数据包是通过原有的网络线路传输过去的。

这里要注意一下,查询本地vxlan11设备详情,主要是获取目的vxlan11设备所在的宿主机IP的。

8.5、在slave1节点上,eth0网卡接收到从master节点发送过来的UDP数据包后,UDP数据包如何到达slave1节点上的vxlan11设备?

eth0网卡接收到从master节点发送过来的UDP数据包后,
对其进行解析,发现目的MAC地址是自己的,目的IP也是自己10.211.55.123
经过iptables规则链

  • 经过nat表的PREROUTING链
    • 在这里插入图片描述
    • 接收到数据包会匹配成功DOCKER链,然后,进入DOCKER链的进行匹配
    • 在DOCKER链里,不满足in的匹配条件,因此,会触发return
    • 因此,接收到的数据包会匹配PREROUTING链的默认规则
    • 而,默认规则是ACCEPT,因此,放行此数据包
  • 接下来,进行路由判断,发现是目的IP是本网卡eth0,因此,需要经过nat的INPUT链了。
    • 在这里插入图片描述
    • INPUT链,当前没有规则。因此,直接匹配INPUT链的默认规则,
    • 而,默认规则是ACCEPT,因此,放行此数据包。
  • 因为,此数据包是UDP协议,交由监听4789端口的服务处理(仅个人理解,要么是Linux内核处理,要么是vxlan处理;就当Linux内核处理吧,因为在vxlan设备上抓取不到udp数据包)
  • Linux内核对UDP数据包进行拆解,发现有vxlan头部标识,
  • 因此,linux内核将剩下的数据发送给vxlan11设备

8.6、在slave1节点上,vxlan11设备接收到linux内核发送过来的数据后,如何处理?

vxlan11设备接收到Linux内核发送过来的数据后

也就是ARP数据,

对ARP数据包进行解析,发现目的IP是自己10.244.2.2

因此,需要对此数据包进行响应,

即,将自己的MAC地址回馈给对方。

也就是,创建一个ARP反馈包。

接下来,Linux内核会检测到vxlan11设备发送了ARP数据包,同样的原理,会添加vxlan头部,封装成UDP数据包,发送给122节点。

122节点的eth0网卡收到数据包后,会经过PRETOURINGT链,路由判断,INPUT链,

接下来,

Linux内核会对其进行解析,发现有vxlan头部,将剩下的数据交由master节点的vxlan设备

具体就不再详细的解析了。

8.7、在master节点上,vxlan11设备接收到slave1节点上反馈的ARP数据包后,接下来如何处理?

vxlan11网卡接收到ARP反馈包后,即获取到了目的vxlan11设备的MAC地址

接下来,开始重新封装ICMP数据包,此报文的主要内容:

目的MAC地址就是刚从ARP响应包里获取到的MAC地址,即123节点上的vxlan11设备的MAC地址

源MAC地址就是自己的地址,即122节点的vxlan11设备的MAC地址

目的IP,就是10.244.2.2这个不变

源IP,就是10.244.1.2这个也不变。

8.8、在master节点上,vxlan11设备发送的ICMP数据包如何到达本节点的eth0网卡上?

道理跟vxlan11设备发送ARP数据包时是一样的。

Linux内核监测到vxlan11设备发送数据包后,会自动给此数据包添加一个vxlan头部

因为,从vxlan11设备详情里已经知道,vxlan11设备发送的数据包的目的IP是10.211.55.123

因此,Linux内核将vxlan11设备发送的数据包重新封装后的UDP数据包的主要内容:

  • 目的MAC是123节点的MAC地址,源MAC地址是122节点的MAC地址
  • 目的IP是10.211.55.123,源IP是10.211.55.122
  • 目的端口是4789,源端口是随机产生的。
  • 被封装的数据是vxlan头部以及ICMP数据包

Linux内核创建的UDP数据包,先经过路由判断,获取到去往10.211.55.123节点的数据包,需要由本地的eth0网卡发送。

同样会经过nat表的OUTPUT链,nat表的POSTROUTING链。(不再,展示图了,跟上面发送ARP时是一样的)

Linux内核产生的UDP数据包(此数据包,携带者ICMP数据包),最终到达了本地的eth0网卡;

本地网卡eth0会将此数据包通过原来的网络发送给123节点的eth0网卡。

8.9、在slave1节点上,eth0网卡接收到master节点发送的UDP数据包(携带ICMP数据包)后,如何处理?

其实,整个处理过程,跟上面处理ARP时,完全一样的。

eth0网卡接收到数据包后,判断目的MAC地址是否是自己。发现是自己的MAC地址,

接下来,经过nat表的PREROUTING链,然后,经过路由判断,

继续经过nat表的INPUT链,此数据包是UDP类型的数据包,发现目的端口是4789

因此,需要交由监听4789的服务处理,

即,Linux内核对此数据包进行解析,发现还有vxlan头部

因此,Linux内核将剩下的数据,转发给了slave1节点的vxlan11设备。

8.10、在slave1节点上,vxlan11设备如何处理Linux转发过来的数据?是如何发送到网桥br0的?

vxlan11设备接收到Linux内核转发过来的数据后,对其进行解析

发现目的MAC地址,就是自己。而目的IP地址是10.244.2.2,并非自己。

  • 接下来需要经过nat表PREROUTING链:
    • 在这里插入图片描述
    • 此,数据包的目的IP地址不满足dst-type LOCAL匹配条件
    • 因此,会匹配PREROUTING链的默认规则,而,默认规则是ACCEPT,因此,放行此数据包
  • 然后,进行路由判断,
    • 在这里插入图片描述
    • 去往10.244.2.2的数据包,需要通过br0网桥发送到10.244.2.0网段
  • 因此,接下来需要匹配filter表的FORWARD链
    • 在这里插入图片描述
    • 此数据包是通过vxlan11设备接收到的,需要转发给br0网桥,即in是vxlan11,out是br0;因此,不满足FORWARD链里的规则。
    • 最终会匹配FORWARD链的默认规则,而默认规则是ACCEPT,因此,放行此数据包。
  • 接下来匹配nat表的POSTROUTING链
    • 在这里插入图片描述
    • 此数据包的目的IP是10.244.2.2 因此,不匹配POSTROUTING链的规则
    • 因此,最终会匹配POSTROUTING链的默认规则,同样,默认规则是ACCEPT,放行此数据包
  • 最终,从vxlan11出来的数据包到达了网桥br0

同样,不同网卡之间进行路由转发时,需要查看是否开启了路由转发功能?

more /proc/sys/net/ipv4/ip_forward

查看是否是1

不同网卡之间数据包转发的主要流程
vxlan11—>PREROUTING—>路由判断—>FORWARD—>POSTROUTING—>br0

br0收到vxlan11设备的数据包的报文结构
目的MAC地址是br0的MAC地址,源MAC地址是vxlan11设备的MAC地址
目的IP是10.244.2.2,源IP是10.244.1.2
协议是ICMP

8.11、在slave1节点上,数据包到达网桥br0如何到达最终的目的网卡veth2a?

从vxlan11设备发送的数据包到达br0网桥后,

br0网桥会对此数据包进行解析,发现目的IP是10.244.2.2

会查询本地ARP表,如果没有的话,同样会创建ARP数据包,发送到本网桥管理的局域网里,

即,给ns2网络里的veth2a网卡也发送了arp数据包。

在这里插入图片描述

从上面的图,可以看出来,一开始是没有的。

master节点的ns1里发送ping请求后,slave1节点才添加到。

网桥br0获取到目的IP10.244.2.2的MAC地址后,会重新封包
(需要更新源MAC地址为网桥br0的MAC地址,目的MAC地址改为10.244.2.2的MAC地址;IP信息不变)

然后,网桥br0通过内部管理的veth2b网卡,将数据包发送给了ns2里的veth2a。

veth2a跟veth2b是一一对veth pair
在这里插入图片描述

8.12、总结

到此为止,我们整体分析了在master节点的ns1网络命名空间里发起的ping -c 1 10.244.2.2请求

产生的数据包是如何一步一步的到达目的网卡的。

反馈过程,很类似,就不再一一解析了。

需要注意一点是,反馈过程,以及后续的第n次请求时,可能不会再经过nat表了。

即,不会经过nat表的INPUT,PREROUTING,POSTROUITNG链了。(原因不是很了解,不在详细研究。可能是为了提高效率吧)

在网络通信时,需要重点关注以下几点:

  • ARP协议,用来获取目的MAC地址的;
    • ARP协议不能跨网段使用,出网段时,只能交由网关,
    • 网关会将自己的MAC地址发送给ARP请求的发起者;
    • 接下来,由网关发起新的ARP请求,发送给下一跳地址。
    • 直到获取到目的MAC地址
  • 路由,需要关心下一跳的地址,通过哪个网卡设备发送出去的
  • vxlan设备,需要关心对端的地址是多少?监听的是哪个端口?4789?
  • 不同网卡之间进行数据包转发时,需要经过哪些链?
  • 路由转发功能是如何开启的?

备注:

上面分析中,涉及到INPUT链、OUTPUT链的时候,说的不是很全。

只说了NAT表下的INPUT链,OUTPUT链。

大家在实际分析的时候,可以自己再添加上对filter表下的INPUT链,OUTPUT链分析即可。

9、提供完整的操作命令

9.1、master节点上

ip netns add ns1

ip link add br0 type bridge
ip addr add 10.244.1.1/24 dev br0
ip link set br0 up

ip link add veth1a type veth peer name veth1b

ip link set veth1a netns ns1 
ip netns exec ns1 ip address add 10.244.1.2/24 dev veth1a
ip netns exec ns1 ip link set veth1a up

ip link set veth1b master br0 
ip link set veth1b up 

ip netns exec ns1 ip link set lo up

ip link add vxlan11 type vxlan id 11 dstport 4789 remote 10.211.55.123 local 10.211.55.122  dev eth0 
ip addr add 10.244.1.0/32 dev vxlan11
ip link set vxlan11 up

ip netns exec ns1 ip route add 10.244.2.0/24 via 10.244.1.1 dev veth1a

ip r a 10.244.2.0/24 via 10.244.2.0 dev vxlan11 onlink 

9.2、slave节点

ip netns add ns2

ip link add br0 type bridge
ip addr add 10.244.2.1/24 dev br0
ip link set br0 up

ip link add veth2a type veth peer name veth2b

ip link set veth2a netns ns2 
ip netns exec ns2 ip address add 10.244.2.2/24 dev veth2a
ip netns exec ns2 ip link set veth2a up

ip link set veth2b master br0 
ip link set veth2b up 

ip netns exec ns2 ip link set lo up

ip link add vxlan11 type vxlan id 11 dstport 4789 remote 10.211.55.122 local 10.211.55.123  dev eth0 
ip addr add 10.244.2.0/32 dev vxlan11
ip link set vxlan11 up

ip netns exec ns2 ip route add 10.244.1.0/24 via 10.244.2.1 dev veth2a

ip r a 10.244.1.0/24 via 10.244.1.0 dev vxlan11 onlink 

9.3、登录到master节点上 测试

ip netns exec ns1 ping -c 1 10.244.2.2

10、wireshark如何解析vxlan数据包

10.1、修改默认wireshark解析vxlan数据包的端口

当前使用wireshark的版本号

在这里插入图片描述

wireshark是可以解析vxlan协议的。

wireshark解析vxlan协议时,默认用到的端口号是4789,即wireshark认为4789端口的数据包为vxlan协议数据包。

但是,我们使用的vxlan端口是8472,因此,需要修改wireshark中解析vxlan的端口号。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


2023年06.04
再重新提供一版

11、新的版本

11.1、122节点

ip netns add ns1

ip link add br0 type bridge
ip addr add 10.244.1.1/24 dev br0
ip link set br0 up

ip link add veth1a type veth peer name veth1b

ip link set veth1a netns ns1 
ip netns exec ns1 ip address add 10.244.1.2/24 dev veth1a
ip netns exec ns1 ip link set veth1a up

ip link set veth1b master br0 
ip link set veth1b up 

ip netns exec ns1 ip link set lo up

ip link add vxlan11 type vxlan id 11 dstport 4789 remote 10.211.55.123 local 10.211.55.122  dev eth0 
ip addr add 10.244.1.0/32 broadcast 10.244.1.255 dev vxlan11
ip link set vxlan11 up

ip netns exec ns1 ip route add 10.244.2.0/24 via 10.244.1.1 dev veth1a

ip r a 10.244.2.0/24 via 10.244.2.0 dev vxlan11 onlink 

在这里插入图片描述

11.2、123节点

ip netns add ns2

ip link add br0 type bridge
ip addr add 10.244.2.1/24 dev br0
ip link set br0 up

ip link add veth2a type veth peer name veth2b

ip link set veth2a netns ns2 
ip netns exec ns2 ip address add 10.244.2.2/24 dev veth2a
ip netns exec ns2 ip link set veth2a up

ip link set veth2b master br0 
ip link set veth2b up 

ip netns exec ns2 ip link set lo up

ip link add vxlan11 type vxlan id 11 dstport 4789 remote 10.211.55.122 local 10.211.55.123  dev eth0 
ip addr add 10.244.2.0/32 broadcast 10.244.2.255 dev vxlan11
ip link set vxlan11 up

ip netns exec ns2 ip route add 10.244.1.0/24 via 10.244.2.1 dev veth2a

ip r a 10.244.1.0/24 via 10.244.1.0 dev vxlan11 onlink 

在这里插入图片描述

11.3、登录到122节点上,重新测试

ip netns exec ns1 ping -c 1 10.244.2.2

在这里插入图片描述

12、新的版本2

12.1、122节点

ip netns add ns1

ip link add br0 type bridge
ip addr add 10.244.1.1/24 dev br0
ip link set br0 up

ip link add veth1a type veth peer name veth1b

ip link set veth1a netns ns1 
ip netns exec ns1 ip address add 10.244.1.2/24 dev veth1a
ip netns exec ns1 ip link set veth1a up

ip link set veth1b master br0 
ip link set veth1b up 

ip netns exec ns1 ip link set lo up

ip link add vxlan11 type vxlan id 11 dstport 4789 remote 10.211.55.123 local 10.211.55.122  dev eth0 
ip addr add 10.244.1.0/32 broadcast 10.244.1.0 dev vxlan11
ip link set vxlan11 up

ip netns exec ns1 ip route add 10.244.2.0/24 via 10.244.1.1 dev veth1a

ip r a 10.244.2.0/24 via 10.244.2.0 dev vxlan11 onlink 

12.2、123节点

ip netns add ns2

ip link add br0 type bridge
ip addr add 10.244.2.1/24 dev br0
ip link set br0 up

ip link add veth2a type veth peer name veth2b

ip link set veth2a netns ns2 
ip netns exec ns2 ip address add 10.244.2.2/24 dev veth2a
ip netns exec ns2 ip link set veth2a up

ip link set veth2b master br0 
ip link set veth2b up 

ip netns exec ns2 ip link set lo up

ip link add vxlan11 type vxlan id 11 dstport 4789 remote 10.211.55.122 local 10.211.55.123  dev eth0 
ip addr add 10.244.2.0/32 broadcast 10.244.2.0 dev vxlan11
ip link set vxlan11 up

ip netns exec ns2 ip route add 10.244.1.0/24 via 10.244.2.1 dev veth2a

ip r a 10.244.1.0/24 via 10.244.1.0 dev vxlan11 onlink 

12.3、登录到122节点上重新测试

ip netns exec ns1 ping -c 1 10.244.2.2

在这里插入图片描述



<<零入门kubernetes网络实战>>技术专栏之文章目录


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt调用图片并自适应界面大小显示

一、前言 记录qt使用图片打开、查看和关闭等操作 实现点击按键&#xff0c;打开选择的指定位置图片&#xff0c;有缩放显示&#xff0c;并可以点击放大按键放大图片&#xff0c;放大后图片自适应电脑窗口大小&#xff0c;大于窗口尺寸会根据最大宽和高缩放&#xff0c;小于窗…

软考:软件工程:软件开发方法,软件可行性分析,需求分析,ER实体图,数据流图,状态转换图,数据字典

软考&#xff1a;软件工程: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1&#…

LC-1401. 圆和矩形是否有重叠

1401. 圆和矩形是否有重叠 难度中等56 给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) &#xff0c;其中 (x1, y1) 是矩形左下角的坐标&#xff0c;而 (x2, y2) 是右上角的坐标。 如果圆和矩形有重叠的部分&#xff0c;请你返回…

Linux——进程地址空间,写时拷贝,进程独立性

Linux进程内存分布 验证地址空间排布 结论&#xff1a;堆区向地址增大的方向增长&#xff0c;栈区向地址减少的方向增长。局部变量通常保存在栈上&#xff0c;先定义的先入栈&#xff0c;地址是比较高的&#xff0c;后定义的则地址小。 static变量 作用域不变&#xff0c;生命…

【go】Excelize处理excel表 带数据校验的文件导出

文章目录 1 Excelize介绍2 相关需求与实现2.1 数据的excel文件导出2.2 带数据校验的excel文件导出 1 Excelize介绍 Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库。官方文档&#xff1a;https://xuri.me/excelize/zh-hans/ 引入方法 go get "github.com/…

Linux——进程控制:创建、终止、等待、替换

进程创建 fork #include <unistd.h> pid_t fork(void);操作系统做了什么&#xff1f; 调用fork之后&#xff0c;内核的工作&#xff1a; 分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork返回&#xff0c…

一个简单案例理解为什么在多线程的应用中要使用锁

需求:使用10个线程,同时对一个值count进行加一操作,每个线程对count加100000次,最终使得count1000000 第一版代码:不加锁 ​​​lock.c #include<stdio.h> #include<pthread.h>#define THREAD_COUNT 10void *thread_callback(void *arg){int *pcount(int*)arg;in…

计算机网络--网络传输基本概念

什么是IP地址&#xff1f; 在计算机出厂的时候&#xff0c;有一个唯一标识的物理地址。但是因为厂商不同等各种原因&#xff0c;用来标识一台计算机在网络中是比较麻烦的&#xff0c;于是出现了IP地址&#xff0c;IP地址是互联网协议地址的意思&#xff0c;是“Internet Protoc…

【Matlab】数字图像的 SVD 分解

奇异值分解 (SVD, Singular Value Decomposition) 是线性代数中一种重要的矩阵变换方法&#xff0c;对矩阵进行 SVD 分解&#xff0c;可以把复杂的矩阵简化&#xff0c;从而提取出重要的信息。数字图像的 SVD 分解是对数字图像建模的一种方法与工具&#xff0c;可以应用于图像压…

操作系统01-导论

一、概述 操作系统&#xff1a;英文是operating system&#xff0c;OS 它的作用运行用户程序&#xff08;核心目标&#xff09;高效使用计算机&#xff08;面向系统&#xff09;方便使用计算机&#xff08;面向用户&#xff09; 二、内容 2.1 现代计算机系统 一个或多个CPU和…

机器学习:self supervised learning

340M 参数 BERT 自监督学习的目标跟目标越接近越好。 一个任务&#xff1a;预测句子中被mask的词&#xff1a; BERT通过Masking Input来获得训练数据 mask有两种做法&#xff1a; 将某个字token换成一个特殊符号&#xff08;代表盖住&#xff09; 随机把某个字换成另外一个…

chatgpt赋能python:Python程序怎么打包

Python程序怎么打包 Python作为一种功能强大的编程语言&#xff0c;它的很多应用都需要打包成可执行文件或者可以方便部署的代码。本篇文章将介绍Python程序打包的方法及步骤。 为什么需要打包&#xff1f; 分享代码或程序&#xff1a;当你编写了一个Python程序并且想要分享给…

【⑥MySQL多表查询】:让你的数据检索更高效

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL中多表查询相关知识的讲解 目录 前言一、多表关系二、多表查询1、交叉连接2、内连接3、外连接 三、集合运算四、七种JOINS实现五、多表查询练习六、总结 一、多表关系 ✨项目开发中&#xff0c;在进行数据库表结…

MySQL生产环境高可用架构详解

一、MySQL高可用集群介绍 1、数据库主从架构与分库分表 随着现在互联网的应用越来越大&#xff0c;数据库会频繁的成为整个应用的性能瓶颈。而 我们经常使用的MySQL数据库&#xff0c;也会不断面临数据量太大、数据访问太频繁、数据 读写速度太快等一系列的问题。所以&#xf…

记录分享在10年老的商务本Dell E6230上安装Debian 12的过程,遇到的问题和解决方法

原先在笔记本上安装的是Debian 9&#xff0c;最近发现无法更新了&#xff0c;查一下发现&#xff0c;所有的“源”只支持deb10&#xff0c;11 和 12&#xff0c;所以特意订了一块新的硬盘来安装新系统&#xff0c;前后倒腾了两天多。 在此记录这个过程中遇到的问题和解决的方法…

Mysql主从复制和读写分离(期望日子清静,抬头皆是温柔)

文章目录 一、读写分离1.什么是读写分离?2.为什么要读写分离呢?3.什么时候要读写分离?4.读写分离原理5.读写分离方式&#xff08;1&#xff09;基于程序代码内部实现&#xff08;2&#xff09;基于中间代理层实现 二、主从复制1.主从复制与读写分离的关系2.mysql支持的复制类…

langchain源码阅读系列(一)之LLM输入输出管理

原文首发于博客文章OpenAI 文档解读 LangChain 主体分为 6 个模块&#xff0c;分别是对&#xff08;大语言&#xff09;模型输入输出的管理、外部数据接入、链的概念、&#xff08;上下文记忆&#xff09;存储管理、智能代理以及回调系统&#xff0c;通过文档的组织结构&#x…

如何编写一个最简单的 udp 版本的 echo server 和 echo client(小白也懂!)

目录 目的 第一步 编写Server(服务器) 第二步 创建Server的各类参数 第三步 实现具体的Server内容 第四步 编写Client(客户端) 实现具体的Client内容 总流程 总代码 源码下载 目的 我们编写一个udp 版本的 echo server 和 echo client 实现在自己电脑上通过客户端…

open【部署、使用教程】

目录 【1】创建证书 【2】安装openVPN-Server端并配置 【3】将证书移动到相对路径 【4】开启内核转发功能&#xff0c;否则会无法启动openVPN 【5】启动服务&#xff0c;加入开机自启 【6】启动后服务端会生成一个tun0的虚拟网卡&#xff0c;用于不同网段之间相互通信 【…

VUE2.0集成 Markdown 编辑器

Markdown编辑器的使用 这是一款基于Vue的markdown编辑器。既可以用来编辑Markdown语法&#xff0c;又可以用来解析 效果图,mavonEditor实现了Markdown集成 Markdown是一种标记语言&#xff0c;相较于word文档更加清晰方便&#xff0c;适合进行笔记等。将Markdown集成进入自己项…