MACsec配置下VM1与VM3虚拟接口通信异常的原因排查
MACsec配置下VM1与VM3虚拟接口通信异常的原因排查
让我来帮你拆解这个问题,从你的配置细节和抓包信息来看,核心问题出在MACsec会话的端口号(Port)不匹配上,这也是为什么VM1和VM2能正常通信、但VM1和VM3不行的关键原因。
先看正常通信的VM1<->VM2配置逻辑
VM1的macsec1和VM2的macsec1在创建时都指定了port 1:
- VM1创建命令:
sudo ip link add link ens3 macsec1 type macsec port 1 ... - VM2创建命令:
sudo ip link add link ens3 macsec1 type macsec port 1 ...
MACsec的port参数是会话标识的一部分,发送方的TX端口号必须和接收方配置的RX端口号完全一致,否则接收端的MACsec驱动会直接丢弃不匹配的帧。VM1和VM2的端口号完全匹配,所以MACsec能正确封装/解封装数据包,通信自然正常。
再看VM1<->VM3的配置矛盾点
你在配置VM1的macsec2时犯了一个端口号不匹配的错误:
- VM1的macsec2端口号是2:创建命令里写的是
port 2sudo ip link add link ens3 macsec2 type macsec port 2 encrypt on validate check - VM3的macsec1端口号是1:创建命令里写的是
port 1sudo ip link add link ens3 macsec1 type macsec port 1 encrypt on validate check
这就导致了一个尴尬的情况:
- VM3发送请求时,用的是
port 1标记MACsec帧,VM1的macsec2配置了rx port 1,所以能正常接收并回复; - 但VM1回复时,会用自己
macsec2的port 2标记帧,VM3的macsec1只监听port 1的帧,收到port 2的包后直接丢弃——这就是为什么你能在VM3的ens3看到回复帧,但macsec1接口收不到的原因。
另外,VM1的macsec2的RX配置其实是对的(匹配VM3的port 1),但TX端口号和VM3的RX端口不匹配,才是核心问题。
修复方案
把VM1的macsec2端口号改成1,和VM3的macsec1端口号保持一致即可。步骤如下:
# 先删除现有macsec2接口 sudo ip link delete macsec2 # 重新创建macsec2,将port改为1 sudo ip link add link ens3 macsec2 type macsec port 1 encrypt on validate check # 重新配置TX SA(参数和之前一致) sudo ip macsec add macsec2 tx sa 0 pn 1 on key 44 44444444444444444444444444444444 # 重新配置RX规则(port保持1,和VM3的port匹配) sudo ip macsec add macsec2 rx address 0c:99:22:ee:00:00 port 1 sudo ip macsec add macsec2 rx address 0c:99:22:ee:00:00 port 1 sa 0 pn 1 on key 33 33333333333333333333333333333333 # 重新启用接口并设置IP sudo ip link set dev macsec2 up sudo ifconfig macsec2 10.2.0.1/16
修改完成后,再测试VM1和VM3的ping,应该就能正常通信了。你也可以再抓包验证:此时ens3上的MACsec帧端口号会完全匹配,VM3的macsec1能正确解封装回复包。
备注:内容来源于stack exchange,提问作者Reinis
相关产品推荐
相关产品推荐

