GRETAP über IPSEC ESP mit ip-xfrm

GRETAP über IPSEC ESP mit ip-xfrm

Ich muss mit Befehlen einen IPSEC-Tunnel zwischen zwei Systemen einrichten ip xfrm, der für die Ausführung von ISIS geeignet ist. Dank Beispielen im Internet kann ich entweder eine XFRM- oder eine VTI-Verbindung erstellen, die für alles funktioniert, außer natürlich für die Ausführung von ISIS (weil ESP nur IP überträgt und ISIS Hello-Pakete LLC/MAC sind).

Ich kann auch einen GRETAP- oder GENEVE-Tunnel zwischen den Systemen einrichten, und ISIS funktioniert darüber. Daher möchte ich (wenn möglich) diesen Tunnel mit ESP verschlüsseln.

Ich ignoriere die Details zur Erstellung der GRETAP/GENEVE-Tunnelschnittstelle und versuche stattdessen, IPSEC wie folgt hinzuzufügen (indem ich mit Ausnahme der ersten Zeile dasselbe Skript auf beiden Systemen ausführe).

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

Dies funktioniert für Pings zwischen den Systemen, aber nicht für Transitverkehr. Außerdem bezweifle ich, dass es für mehrere Tunnel zwischen zwei Systemen funktionieren würde.

Tcpdump-Ergebnisse für System-zu-System-Verkehr (auf dem antwortenden System):

[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

XFRM-Monitor:

[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

Für den Transitverkehr wird auf beiden Systemen nichts gedruckt.

Antwort1

Das Problem bei dem oben Gesagten ist, dass die Richtlinie nur auf Datenverkehr mit lokalen IP-Adressen zutrifft. Sie trifft nicht auf weitergeleitete Pakete zu, die an die lokale Remote-IP weitergeleitet werden, und sie trifft nicht auf ISIS-Pakete zu. Folgendes funktioniert, da die Richtlinien auf die gekapselten Pakete unter Verwendung der öffentlichen Adressen zutreffen.

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

Eine Einschränkung hierbei besteht darin, dass mehrere Tunnel zwischen zwei Systemen nicht unterstützt werden, da nur die öffentlichen IP-Adressen als Schlüssel verwendet werden (was für mehrere GRETAP- oder GENEVE-Tunnel gelten würde).

verwandte Informationen