O que eu preciso para adicionar um adaptador IPsec virtual?

8

Estou tentando configurar uma conexão IPsec manualmente no console com o iproute2. O que eu preciso é de uma interface virtual (na melhor das hipóteses, um endereço IP virtual também pode ser suficiente) para que o IPsec transforme o ingresso de tudo (ESP / TUNNEL MODE) e o entregue ao eth0 (no meu sistema chamado em1). No outro conjunto, um par pega o pacote de seu próprio eth decifra-o e o entrega a uma interface virtual do outro lado. Então, eu quero estabelecer um túnel IPsec "normal".

Não tenho nenhum problema com a política e o SA, e configurá-lo com facilidade usando os endereços Ethernet normais dos sistemas no modo de transporte, ou seja,

ip xfrm policy add src 198.51.100.1 dst 198.51.100.2 dir out tmpl proto esp
ip xfrm state  add src 198.51.100.1 dst 198.51.100.2 spi 24501 proto esp enc des 0xAABBCCDDEEFF0011
ip xfrm state  add src 198.51.100.2 dst 198.51.100.1 spi 24501 proto esp enc des 0xAABBCCDDEEFF0022

e uma configuração de adversário no par funciona muito bem.

Agora eu tentei configurar um IP virtual e uma rota para o outro sistema com

ip address add 10.0.0.0 dev em1
ip route add to 10.0.0.2 via 10.0.0.1

e novamente vice-versa do outro lado. Isso novamente funciona bem. Depois alterei a política IPsec e o SA para

ip xfrm policy add src 10.0.0.1 dst 10.0.0.2 dir out tmpl src 198.51.100.1 dst 198.51.100.2 proto esp mode tunnel
ip xfrm state  add src 10.0.0.1 dst 10.0.0.2 spi 24501 proto esp enc des 0xAABBCCDDEEFF0011
ip xfrm state  add src 10.0.0.2 dst 10.0.0.1 spi 24501 proto esp enc des 0xAABBCCDDEEFF0022

Quando agora tento tcpingo par, não recebo resposta e setkey -PDme diz que a política de segurança nunca foi acionada. Agora estou tentando fabricar uma interface virtual funcional para lidar com o túnel IPsec, mas não sei como vinculá-la à interface física e como faço para que o kernel aplique a política de segurança.

É vital para mim que eu possa resolver isso com o iproute2, pois, em última análise, quero fazer isso em um programa C ++ e já tenho as classes apropriadas que eliminam os comandos do Netlink do mesmo estilo que o ipcomando (o que eu posso fazer com ip, eu também pode fazer dentro do meu código). De fato, a primeira parte já funciona no meu programa e eu quero usar as mesmas funções da API Netlink para o resto.

Atualização Eu descobri que o estado precisava ser configurado com os endereços do túnel para que as SAs funcionais fossem

ip xfrm state  add src 10.0.0.1 dst 10.0.0.2 spi 24501 proto esp enc des 0xAABBCCDDEEFF0011
ip xfrm state  add src 10.0.0.2 dst 10.0.0.1 spi 24501 proto esp enc des 0xAABBCCDDEEFF0022

enquanto a política permanece a mesma. Agora a política é acionada e vejo um pacote transformado em uma porta de farejamento. Também o iptables na outra máquina bloqueou o pacote e eu o desabilitei para teste.

Então, a única direção parece funcionar agora, mas ainda não recebi resposta. Também não sei se o problema ainda é de alguma forma a transformação, o roteamento ou a parte da interface. Minha solução preferida ainda seria uma incluindo uma interface virtual, mas não tenho nenhuma idéia de como vinculá-la a uma física, muito menos se a transformação funcionasse dessa maneira.

Marste
fonte

Respostas:

1

Normalmente, o que você usa é um túnel, criado usando ip tunnel add. O dispositivo de encapsulamento fornece um dispositivo virtual que encapsula pacotes IP dentro de outros pacotes IP. Em seguida, o pacote encapsulado pode ser criptografado usando IPsec.

Por exemplo, você pode criar um túnel GRE usando:

ip tunnel add mytunnel mode gre remote 198.51.100.2
ip addr add 10.0.0.1 peer 10.0.0.2/31 dev mytunnel

Em seguida, você pode configurar o IPSec para criptografar pacotes GRE (em geral ou apenas para esse destino).

olav
fonte