¿Qué necesito para agregar un adaptador IPsec virtual?

8

Estoy tratando de configurar una conexión IPsec manualmente desde la consola con iproute2. Lo que necesito es una interfaz virtual (en el mejor de los casos, una dirección IP virtual también podría ser suficiente) que IPsec transforma todo ingreso (ESP / TUNNEL MODE) y lo transfiere a eth0 (en mi sistema llamado em1). En el otro conjunto, un compañero toma el paquete de su propio eth lo descifra y lo entrega a una interfaz virtual al otro lado. Entonces quiero establecer un túnel IPsec "normal".

No tengo ningún problema con la política y la SA, y configurarlo fue fácil usando las direcciones de Ethernet normales de los sistemas en modo transporte, es decir

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

y una configuración adversaria en el par funciona bastante bien.

Ahora intenté configurar una IP virtual y una ruta al otro sistema con

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

y nuevamente viceversa en el otro lado. Esto nuevamente funciona bien. Luego modifiqué la política de IPsec y 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

Cuando ahora trato con tcpingel compañero, no recibo respuesta y setkey -PDme dice que la política de seguridad nunca se activó. Ahora estoy tratando de fabricar una interfaz virtual que funcione para manejar el túnel IPsec, pero no sé cómo vincularlo a la interfaz física y cómo consigo que el núcleo aplique la política de seguridad.

Es vital para mí que pueda resolver esto con iproute2, ya que finalmente quiero hacerlo desde un programa C ++ y ya tengo las clases apropiadas que eliminan los comandos de Netlink del mismo estilo que el ipcomando (con lo que puedo hacer ip, yo también puede hacerlo dentro de mi código). De hecho, la primera parte ya funciona fuera de mi programa y quiero usar las mismas funciones de API de Netlink para el resto.

Actualización descubrí que era necesario configurar el estado con las direcciones del túnel para que las SA funcionaran

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

mientras que la política sigue siendo la misma. Ahora se activa la política y veo un paquete transformado en un puerto de rastreo. También iptables en la otra máquina bloqueó el paquete y lo deshabilité para probar.

Entonces, la única dirección parece funcionar ahora, pero todavía no obtengo respuesta. Tampoco sé si el problema todavía es de alguna manera la transformación, el enrutamiento o la parte de la interfaz. Mi solución preferida seguiría siendo una que incluye una interfaz virtual, pero no tengo idea de cómo vincularla a una física, y mucho menos si la transformación funcionaría de esa manera.

Marste
fuente

Respuestas:

1

Normalmente lo que usa es un túnel, creado usando ip tunnel add. El dispositivo de túnel le proporciona un dispositivo virtual que encapsula los paquetes IP dentro de otros paquetes IP. Luego, el paquete encapsulado se puede cifrar con IPsec.

Por ejemplo, puede crear un 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

Luego puede configurar IPSec para encriptar paquetes GRE (ya sea en general o solo a ese destino).

olav
fuente