使用 ip-xfrm 透過 IPSEC ESP 的 GRETAP

使用 ip-xfrm 透過 IPSEC ESP 的 GRETAP

我需要使用命令在兩個系統之間建立 IPSEC 隧道ip xfrm,適合運行 ISIS。借助網絡上的示例,我能夠創建適用於所有內容的 XFRM 或 VTI 鏈接,當然,運行 ISIS 除外(因為 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,但不適用於中轉流量。另外,我懷疑它是否適用於兩個系統之間的多個隧道。

系統間流量的 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 隧道相符)。

相關內容