使用 MACsec 时如何将流量从物理接口路由到虚拟接口?

使用 MACsec 时如何将流量从物理接口路由到虚拟接口?

设置:
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 的流量。

相关内容