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 tcping
el compañero, no recibo respuesta y setkey -PD
me 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 ip
comando (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.
fuente