A configuração:
3 Linux Ubuntu 18.04 virtualizado em GNS3 todos conectados a um hub Ethernet, vamos chamá-los de VM1, VM2 e VM3, cada VM possui uma interface física chamada ens3 e um endereço IP do servidor DHCP rodando no roteador principal.
Na VM1 criei duas novas interfaces virtuais chamadas macsec1 e macsec2, na VM2 - macsec1 e na VM3 - macsec1. Eles são criados com os seguintes comandos:
Para 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
Para 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
E para 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
O resultado esperado:
com base na configuração, devo ser capaz de executar ping em VM2 e VM3 a partir de VM1 e os pacotes devem ser roteados a partir das respectivas interfaces, por exemplo. Uma solicitação de ping de VM1 para VM2 deve vir da origem 10.1.0.1 e 10.1.0.2 deve ser o destino, resultando na aplicação da configuração MACsec correta e este é o caso das comunicações entre VM1 e VM2, no entanto, não funciona para VM1 VM3, agora chegamos ao problema.
O problema e o processo de solução de problemas:
VM1 não consegue acessar VM3 usando as interfaces virtuais criadas, após verificar as rotas, tudo me parece correto, aqui estão elas para VM1 e VM3:
Rotas 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
Rotas 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
Depois de inspecionar os tcpdumps, descobri o seguinte:
Quando o VM3 faz ping no VM1, a interface macsec1 no VM3 envia a solicitação de eco ICMP para 10.2.0.1, mas nenhuma resposta é recebida.
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
Na VM1 posso ver a solicitação de eco recebida e também a resposta.
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
Após inspecionar o tráfego na interface ens3 na VM3, podemos observar que tanto a solicitação quanto a resposta passaram por ele, porém a interface macsec1 não recebeu a resposta.
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:
Agora, voltando à questão: por que a interface macsec1 na VM3 não está recebendo pacotes de resposta da VM1, mesmo que a interface ens3 os receba? E também, por que esse problema não está acontecendo com a comunicação entre VM1 e VM2?
Nota: para reproduzir a configuração do OP (e exibir os endereços MAC e SCIs corretos abaixo), é necessário inferir os endereços MAC nas 3 interfaces envolvidas a partir da configuração MACsec.
ens3 da VM1: 0c:63:58:d6:00:00
ens3 da VM2: 0c:a0:95:25:00:00
ens3 da VM3: 0c:99:22:ee:00:00
Ao criar interfaces MACsec adicionais:
o valor exclusivo da porta escolhido para criar a segunda interface MACsec virtual a partir da mesma interface "física" não é apenas um identificador local: é parte do quadro on-wire transmitido no campo "Secure Channel Identifier" (SCI), que é o concatenação do endereço MAC da NIC local e da porta como um valor de 2 bytes para um total de 8 bytes:
O peer (VM3) deve ser configurado para reconhecer este SCI com o valor de porta correto para a configuração RX correspondente.
Então, na configuração do VM3, em vez de:
usar:
para realmente configurar o recebimento do SCI 0c6358d6000 0002 da VM1 e permitir a descriptografia adequada do tráfego de VM1 para VM3.