设置:
3 Linux Ubuntu 18.04 在 GNS3 中虚拟化,全部连接到以太网集线器,我们将它们称为 VM1、VM2 和 VM3,每个 VM 都有一个名为 ens3 的物理接口和一个来自主路由器上运行的 DHCP 服务器的 IP 地址。
在 VM1 上,我创建了两个新的虚拟接口,分别称为 macsec1 和 macsec2,在 VM2 上为 macsec1,在 VM3 上为 macsec1。它们是使用以下命令创建的:
对于 VM1:
# 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
对于 VM2:
# 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
检查 tcpdumps 后,我发现了以下情况:
当 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 上,我可以看到传入的回显请求以及响应。
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 之间的通信中?
答案1
注意:要重现 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 接口时:
# 创建虚拟 macsec2 接口及其 Rx 通道 sudo ip link 添加链接 ens3 macsec2 类型 macsec端口 2验证后加密
从同一“物理”接口创建第二个虚拟 MACsec 接口时选择的端口唯一值不仅仅是一个本地标识符:它是“安全通道标识符”(SCI) 字段中传输的在线帧的一部分,该字段是本地 NIC 的 MAC 地址和端口的连接,为 2 字节值,总共 8 个字节:
# ip -details 链接显示 dev macsec2 3:macsec2@ens3:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1468 qdisc noqueue 状态 UP 模式 DEFAULT 组默认 qlen 1000 链路/以太 0c:63:58:d6:00:00 brd ff:ff:ff:ff:ff:ff 混杂性 0 allmulti 0 minmtu 0 maxmtu 65535 macsec 科学 0c6358d600000002保护密码 GCM-AES-128 icvlen 16 encodingsa 0 验证检查卸载关闭加密打开 send_sci 打开 end_station 关闭 scb 关闭重放关闭 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 tso_max_size 65536 tso_max_segs 65535 gro_max_size 65536 gso_ipv4_max_size 65536 gro_ipv4_max_size 65536
必须配置对等方 (VM3) 以使用匹配 RX 配置的正确端口值来识别此 SCI。
因此在 VM3 的配置中,而不是:
sudo ip macsec 添加 macsec1 rx 地址 0c:63:58:d6:00:00端口 1 sudo ip macsec 添加 macsec1 rx 地址 0c:63:58:d6:00:00端口 1sa 0 pn 1 开键 44 44444444444444444444444444444444444444
使用:
sudo ip macsec 添加 macsec1 rx 地址 0c:63:58:d6:00:00端口 2 sudo ip macsec 添加 macsec1 rx 地址 0c:63:58:d6:00:00端口 2sa 0 pn 1 开键 44 44444444444444444444444444444444444444
实际配置接收 VM1 的 SCI 0c6358d60000002并允许正确解密从 VM1 到 VM3 的流量。