ip-xfrm を使用した IPSEC ESP 経由の GRETAP

ip-xfrm を使用した IPSEC ESP 経由の GRETAP

ISIS を実行するのに適したコマンドを使用して、2 つのシステム間に IPSEC トンネルを設定する必要がありますip xfrm。Web 上の例のおかげで、ISIS の実行を除くすべての用途で機能する XFRM または VTI リンクを作成できます (ESP は IP のみを伝送し、ISIS Hello パケットは LLC/MAC であるため)。

また、システム間に GRETAP または GENEVE トンネルを設定することもでき、ISIS はそれを介して動作します。したがって、可能であれば、このトンネルを ESP を使用して暗号化したいと思います。

GRETAP/GENEVE トンネル インターフェイスの作成方法の詳細は無視して、以下を使用して IPSEC を追加しようとしています (最初の行を除いて、両方のシステムで同じスクリプトを実行します)。

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

これはシステム間の ping には有効ですが、トランジット トラフィックには有効ではありません。また、2 つのシステム間の複数のトンネルには有効ではないと思います。

システム間トラフィックの Tcpdump 結果 (応答システム上):

[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 モニター:

[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

トランジット トラフィックの場合、どちらのシステムでも何も印刷されません。

答え1

上記の問題は、ポリシーがローカル IP アドレスを使用するトラフィックのみに一致することです。リモート ローカル IP に転送されるリレー パケットには一致せず、ISIS パケットにも一致しません。次のポリシーは、パブリック アドレスを使用してカプセル化されたパケットに一致するため、機能します。

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

この方法の制限は、パブリック IP アドレスのみをキーとするため (複数の GRETAP または GENEVE トンネルに一致する)、2 つのシステム間の複数のトンネルをサポートしないことです。

関連情報