
Preciso configurar um túnel IPSEC entre dois sistemas usando ip xfrm
comandos, adequados para executar o ISIS. Graças a exemplos na web, sou capaz de criar um link XFRM ou VTI que funciona para tudo, exceto, é claro, para executar o ISIS (porque o ESP carrega apenas IP e os pacotes ISIS Hello são LLC/MAC).
Também sou capaz de configurar um túnel GRETAP ou GENEVE entre os sistemas, e o ISIS trabalha nisso. Então, eu gostaria (se possível) criptografar esse túnel usando ESP.
Ignorando detalhes sobre como a interface do túnel GRETAP/GENEVE é criada, estou tentando adicionar IPSEC usando o seguinte (executando o mesmo script em ambos os sistemas, exceto na primeira linha).
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
Isto funciona para pings entre os sistemas, mas não para tráfego de trânsito. Além disso, duvido que funcione para vários túneis entre dois sistemas.
Resultados do Tcpdump para tráfego sistema-sistema (no sistema de resposta):
[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 tráfego de trânsito, ambos não imprimem nada em nenhum dos sistemas.
Responder1
O problema acima é que a política corresponde apenas ao tráfego que usa os endereços IP locais. Ele não corresponde aos pacotes retransmitidos que são encaminhados para o IP local remoto e não corresponde aos pacotes ISIS. O seguinte funciona, pois as políticas correspondem aos pacotes encapsulados, usando os endereços públicos.
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
Uma limitação disso é que ele não suporta vários túneis entre dois sistemas, uma vez que ele codifica apenas os endereços IP públicos (o que corresponderia a vários túneis GRETAP ou GENEVE).