设置:
在 GNS3 中虚拟化的 3 个 Linux Ubuntu 18.04 全部连接到以太网集线器,我们称它们为 VM1、VM2 和 VM3,每个 VM 都有一个称为 ens3 的物理接口和一个来自主路由器上运行的 DHCP 服务器的 IP 地址。
在 VM1 上,我创建了两个新的虚拟接口,分别称为 macsec1 和 macsec2,在 VM2 上创建了 macsec1,在 VM3 上创建了 - macsec1。它们是使用以下命令创建的:
对于虚拟机1:
# Creating the virtual macsec1 interface and its Rx channels
sudo ip link add link ens3 macsec1 type macsec port 1 encrypt on validate strict
sudo ip macsec add macsec1 tx sa 0 pn 1 on key 11 11111111111111111111111111111111
sudo ip macsec add macsec1 rx address 0c:a0:95:25:00:00 port 1
sudo ip macsec add macsec1 rx address 0c:a0:95:25:00:00 port 1 sa 0 pn 1 on key 22 22222222222222222222222222222222
# Creating the virtual macsec2 interface and its Rx channels
sudo ip link add link ens3 macsec2 type macsec port 2 encrypt on validate check
sudo ip macsec add macsec2 tx sa 0 pn 1 on key 44 44444444444444444444444444444444
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
# Set the IP and bring the interface UP
sudo ip link set dev macsec1 up
sudo ip link set dev macsec2 up
sudo ifconfig macsec1 10.1.0.1/16
sudo ifconfig macsec2 10.2.0.1/16
对于虚拟机2:
# Creating the virtual macsec1 interface and its Rx channels
sudo ip link add link ens3 macsec1 type macsec port 1 encrypt on validate strict
sudo ip macsec add macsec1 tx sa 0 pn 1 on key 22 22222222222222222222222222222222
sudo ip macsec add macsec1 rx address 0c:63:58:d6:00:00 port 1
sudo ip macsec add macsec1 rx address 0c:63:58:d6:00:00 port 1 sa 0 pn 1 on key 11 11111111111111111111111111111111
# Set the IP and bring the interface UP
sudo ip link set dev macsec1 up
sudo ifconfig macsec1 10.1.0.2/16
对于 VM3:
# Creating the virtual macsec1 interface and its Rx channels
sudo ip link add link ens3 macsec1 type macsec port 1 encrypt on validate check
sudo ip macsec add macsec1 tx sa 0 pn 1 on key 33 33333333333333333333333333333333
sudo ip macsec add macsec1 rx address 0c:63:58:d6:00:00 port 1
sudo ip macsec add macsec1 rx address 0c:63:58:d6:00:00 port 1 sa 0 pn 1 on key 44 44444444444444444444444444444444
# Set the IP and bring the interface UP
sudo ip link set dev macsec1 up
sudo ifconfig macsec1 10.2.0.2/16
预期结果:
例如,根据配置,我应该能够从 VM1 ping VM2 和 VM3,并且数据包应该从相应的接口路由。从 VM1 到 VM2 的 ping 请求应来自 10.1.0.1 源,10.1.0.2 应该是目标,从而应用正确的 MACsec 配置,这是 VM1 和 VM2 之间通信的情况,但对于 VM1 来说这不起作用VM3,现在我们解决问题了。
问题和故障排除过程:
VM1无法使用创建的虚拟接口到达VM3,检查路由后,一切对我来说似乎都是正确的,这是VM1和VM3的:
VM1 路由:
Destination Gateway Genmask Flags Metric Ref Use Iface
default homerouter.cpe 0.0.0.0 UG 100 0 0 ens3
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3
10.1.0.0 0.0.0.0 255.255.0.0 U 0 0 0 macsec1
10.2.0.0 0.0.0.0 255.255.0.0 U 0 0 0 macsec2
VM3 路由:
Destination Gateway Genmask Flags Metric Ref Use Iface
default homerouter.cpe 0.0.0.0 UG 100 0 0 ens3
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3
10.2.0.0 0.0.0.0 255.255.0.0 U 0 0 0 macsec1
检查 tcpdump 后,我发现以下内容:
当 VM3 ping VM1 时,VM3 上的 macsec1 接口向 10.2.0.1 发送 ICMP 回显请求,但未收到回复。
IP vm3 > 10.2.0.1: ICMP echo request, id 3387, seq 1, length 64
IP vm3 > 10.2.0.1: ICMP echo request, id 3387, seq 2, length 64
在 VM1 上,我可以看到传入的 echo 请求以及响应。
IP 10.2.0.2 > vm1: ICMP echo request, id 3387, seq 1, length 64
IP vm1 > 10.2.0.2: ICMP echo reply, id 3387, seq 2, length 64
检查 VM3 上 ens3 接口上的流量后,我们可以看到请求和回复都已通过该接口,但 macsec1 接口尚未收到回复。
0c:99:22:ee:00:00 > 0c:63:58:d6:00:00, ethertype Uknown (0x88e5), length 130:
0c:63:58:d6:00:00 > 0c:99:22:ee:00:00, ethertype Uknown (0x88e5), length 130:
现在回到问题:为什么 VM3 上的 macsec1 接口没有收到来自 VM1 的回复数据包,即使 ens3 接口收到了回复数据包?另外,为什么 VM1 和 VM2 之间的通信不会出现此问题?
注意:要重现 OP 的设置(并在下面显示正确的 MAC 地址和 SCI),必须从 MACsec 配置推断 3 个相关接口上的 MAC 地址。
VM1 的 ens3: 0c:63:58:d6:00:00
VM2 的 ens3: 0c:a0:95:25:00:00
VM3 的 ens3: 0c:99:22:ee:00:00
创建其他 MACsec 接口时:
选择从同一“物理”接口创建第二个虚拟 MACsec 接口的端口的唯一值不仅仅是一个本地标识符:它是“安全通道标识符”(SCI) 字段中传输的在线帧的一部分,该字段是将本地 NIC 的 MAC 地址和端口串联为 2 字节值,总共 8 字节:
对等方 (VM3) 必须配置为使用匹配 RX 配置的正确端口值来识别此 SCI。
因此,在 VM3 的配置上,而不是:
使用:
实际配置为接收 VM1 的 SCI 0c6358d6000 0002并允许正确解密从 VM1 到 VM3 的流量。