You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时犯了一个端口号不匹配的错误:

  1. VM1的macsec2端口号是2:创建命令里写的是port 2
    sudo ip link add link ens3 macsec2 type macsec port 2 encrypt on validate check
    
  2. VM3的macsec1端口号是1:创建命令里写的是port 1
    sudo 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 13:18:11