GRETAP sobre IPSEC ESP usando ip-xfrm

GRETAP sobre IPSEC ESP usando ip-xfrm

Necesito configurar un túnel IPSEC entre dos sistemas usando ip xfrmcomandos, adecuados para ejecutar ISIS. Gracias a los ejemplos en la web, puedo crear un enlace XFRM o VTI que funcione para todo excepto, por supuesto, para ejecutar ISIS (porque ESP solo transporta IP y los paquetes ISIS Hello son LLC/MAC).

También puedo configurar un túnel GRETAP o GENEVE entre los sistemas, e ISIS trabaja en eso. Entonces me gustaría (si es posible) cifrar este túnel usando ESP.

Ignorando los detalles sobre cómo se crea la interfaz del túnel GRETAP/GENEVE, estoy intentando agregar IPSEC usando lo siguiente (ejecutando el mismo script en ambos sistemas, excepto la primera línea).

GW=1 # (or 2, for the other system)

GW1_PUBIP=172.22.0.5
GW2_PUBIP=172.23.0.6
PRIVNET=192.168.12 # address prefix on the GRETAP or GENEVE link
SPI=0x1234
AUTHKEY=0x0123456789ABCDEF0123456789ABCDEF
ENCKEY=0xFEDCBA9876543210FEDCBA9876543210
if [[ $GW == 1 ]]; then
    LOC_PUB=$GW1_PUBIP REM_PUB=$GW2_PUBIP LOC_PRI=$PRIVNET.2 REM_PRI=$PRIVNET.3
else
    LOC_PUB=$GW2_PUBIP REM_PUB=$GW1_PUBIP LOC_PRI=$PRIVNET.3 REM_PRI=$PRIVNET.2
fi 
PUBIP=$(ifconfig eth0 | grep inet | tr -s ' ' | cut -d' ' -f3) # trigger guard
if [[ $PUBIP == $LOC_PUB ]]; then # trigger guard
    ip xfrm state flush
    ip xfrm policy flush
    ip xfrm state add src $LOC_PUB dst $REM_PUB proto esp spi $SPI mode tunnel auth sha256 $AUTHKEY enc aes $ENCKEY
    ip xfrm state add src $REM_PUB dst $LOC_PUB proto esp spi $SPI mode tunnel auth sha256 $AUTHKEY enc aes $ENCKEY
    ip xfrm policy add src $LOC_PRI dst $REM_PRI dir out tmpl src $LOC_PUB dst $REM_PUB proto esp spi $ID mode tunnel
    ip xfrm policy add src $REM_PRI dst $LOC_PRI dir in tmpl src $REM_PUB dst $LOC_PUB proto esp spi $SPI mode tunnel
    ip xfrm policy add src $REM_PRI dst $LOC_PRI dir fwd tmpl src $REM_PUB dst $LOC_PUB proto esp spi $SPI mode tunnel
    ping -c 5 $REM_PRI
fi

Esto funciona para pings entre sistemas, pero no para tráfico de tránsito. Además, dudo que funcione para múltiples túneles entre dos sistemas.

Resultados de Tcpdump para el tráfico sistema-sistema (en el sistema que responde):

[root@90c8710c0faa /]# tcpdump -nevi eth0 esp
dropped privs to tcpdump
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:26:48.206545 02:42:64:b4:1e:61 > 02:42:ac:17:00:06, ethertype IPv4 (0x0800), length 166: (tos 0x0, ttl 63, id 2297, offset 0, flags [DF], proto ESP (50), length 152)
    172.22.0.5 > 172.23.0.6: ESP(spi=0x00001234,seq=0xb), length 132
14:26:48.206589 02:42:ac:17:00:06 > 02:42:64:b4:1e:61, ethertype IPv4 (0x0800), length 166: (tos 0x0, ttl 64, id 5677, offset 0, flags [none], proto ESP (50), length 152)
    172.23.0.6 > 172.22.0.5: ESP(spi=0x00001234,seq=0x9), length 132

Monitor XFRM:

[root@90c8710c0faa /]# ip xfrm monitor all
Async event  (0x10)  replay update 
    src 172.23.0.6 dst 172.22.0.5  reqid 0x0 protocol esp  SPI 0x1234

Para el tráfico de tránsito, ninguno de los dos imprime nada en ninguno de los sistemas.

Respuesta1

El problema con lo anterior es que la política solo coincide con el tráfico que utiliza las direcciones IP locales. No coincide con los paquetes retransmitidos que se reenvían a la IP local remota y no coincide con los paquetes ISIS. Lo siguiente funciona, ya que las políticas coinciden con los paquetes encapsulados, utilizando las direcciones públicas.

GW=1 # or 2, for the other system

GW1_PUBIP=172.22.0.5 # ifconfig eth0  | grep inet | tr -s ' ' | cut -d' ' -f3
GW2_PUBIP=172.23.0.6
PRIVNET=192.168.12 # address prefix on the GRETAP link
SPI=0x1234
AUTHKEY=0x0123456789ABCDEF0123456789ABCDEF
ENCKEY=0xFEDCBA9876543210FEDCBA9876543210 
if [[ $GW == 1 ]]; then
    LOC_PUB=$GW1_PUBIP REM_PUB=$GW2_PUBIP LOC_PRI=$PRIVNET.2 REM_PRI=$PRIVNET.3
else
    LOC_PUB=$GW2_PUBIP REM_PUB=$GW1_PUBIP LOC_PRI=$PRIVNET.3 REM_PRI=$PRIVNET.2
fi  
PUBIP=$(ifconfig eth0 | grep inet | tr -s ' ' | cut -d' ' -f3)
if [[ $PUBIP == $LOC_PUB ]]; then # trigger guard
    ip xfrm state flush
    ip xfrm policy flush
    ip xfrm state add src $LOC_PUB dst $REM_PUB proto esp spi $SPI mode tunnel auth sha256 $AUTHKEY enc aes $ENCKEY
    ip xfrm state add src $REM_PUB dst $LOC_PUB proto esp spi $SPI mode tunnel auth sha256 $AUTHKEY enc aes $ENCKEY
    ip xfrm policy add src $LOC_PUB dst $REM_PUB dir out tmpl src $LOC_PUB dst $REM_PUB proto esp spi $SPI mode tunnel
    ip xfrm policy add src $REM_PUB dst $LOC_PUB dir in tmpl src $REM_PUB dst $LOC_PUB proto esp spi $SPI mode tunnel
    ip xfrm policy add src $REM_PUB dst $LOC_PUB dir fwd tmpl src $REM_PUB dst $LOC_PUB proto esp spi $SPI mode tunnel
    ping -c 5 $REM_PRI
fi

Una limitación de esto es que no admitirá múltiples túneles entre dos sistemas, ya que solo ingresa las direcciones IP públicas (que coincidirían con múltiples túneles GRETAP o GENEVE).

información relacionada