我需要使用命令在两个系统之间设置 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 隧道匹配)。