1、即使使用传输模式,在 L2L 的模型中,Set Peer X.X.X.X 的 IP 地址和原本 IP 包头中的目的地址不相同的话,也会在外层再添加一个新的 IP 包头,这个新的包头就是 set peer X.X.X.X 为目的地址的包头,源地址用发出接口的地址来发出数据包。等于自动转换成了隧道模式。所以必须要做到原始数据包中的目的 IP 地址和 set peer 语句中的 ip 地址一样才能是传输模式,否则会自动转换为隧道模式如 GRE over IPsec 就可以使用传输模式。而且推荐使用传输模式。因为如果是隧道模式 IPsec 将会在原来的最外层 ip 包头的更外层添加一个以 set pe
2、er x.x.x.x 为目的地址和本身发出接口地址为源地址的数据包,如图所示:这个是传输模式,配置了 set peer 为 20.0.0.2 因为匹配最外层 IP 数据包的地址,所以不在更外层添加新的地址。说一下过程,ping R2 的 Loop 接口,路由器首先查看路由表,发现下一条是 tunnel 接口,所以用 tunnel 接口事先定义的源和目的地址来封装数据包。也就是用 10.0.0.1 到 20.0.0.2 来封装数据包,然后送到 S0/0 物理接口,由于在物理接口上有一个 crypto map 路由器查看这个流量是否和 crypo map 的感兴趣流匹配, (感兴趣流定义 perm
3、it gre host 10.0.0.1 host 20.0.0.2)由于与定义的感兴趣流匹配,也就是 GRE 协议的 10.0.0.1 到 20.0.0.2,所以与 set peer对端建立 IKE 阶段 1 2 的协商,由于是传输模式,而且 set peer 的地址同最外层 IP 包头的地址相同,所以不进行再次封装。而是直接插入 AH 头后从物理口送出。这个是隧道模式,可以看到在最外层的数据包的更外层又添加了一个新的匹配 set peer x.x.x.x 的 IP 包头,浪费了资源这个是 set peer 1.1.1.1 符合 IP 包目的地址的数据包分析,可以运行在传输模式,要注意让源地
4、址也要符合对方的目的地址才可以建立连接 可以用 crypto map name local-address interface 来定义封装数据包的源端口。总结:set peer 定义了封装的目的地址。crypto map name local-address interface 定义了封装的源地址,(默认是用出接口的地址)。如果是传输模式那么要求 Set peer 的地址和原始的(也就是最内层的)IP 数据包的目的地相同,否则自动变为隧道模式有一点要注意就是 IPSEC 也是只处理最外部的 IP 包头,比如下图的这种情况,如果要指定感兴趣流,只能制定10.0.0.1 到 20.0.0.2 的流
5、量,因为是在物理接口上绑定的 crypto map而 GRE 的封装发生在进入这个物理口之前。所以 IPsec 不管 GRE 封装里面的原始地址(1.1.1.1 到 2.2.2.2) ,他只能加密外层的(10.0.0.1 到 20.0.0.2)2.0.0.0/32 is subnetted, 1 subnetsS 2.2.2.2 is directly connected, Tunnel0也就是数据包首先到达 tunnel0 接口,然后进行 GRE 封装,添加新的 IP 包头(如下图所示) ,然后送到物理口s0/0,这时在 s0/0 接口上有一个 CRYPTO MAP 查看感兴趣流是否触发加密
6、(感兴趣流为 ip host 1.1.1.1 host 2.2.2.2) ,但是由于最外面封装的是 10.0.0.1 到 20.0.0.2 的 IP 包,所以不会触发加密,所以以明文传输。对于 IPsec over GRE 来说,举一个失败的例子。首先定义 cry map,设置对等体(set peer)为 R2 的物理接口地址(20.0.0.2) 。设置感兴趣流为 1.1.1.1 到2.2.2.2。cry map 绑定在 tun0 接口。 传输集为传输模式。设置静态路由为从 1.1.1.1 到 2.2.2.2 出口为 tun0 接口首先发出一个 ping 包 目的地址为 2.2.2.2 源地址
7、为 1.1.1.1 这个包先到达 tun0 接口,由于 tunnel0 接口上有一个crypto map 所以路由器查看 crypto map,发现这个流量和感兴趣流匹配,虽然是传输模式,但是由于 set peer 的地址(20.0.0.2)和原本数据包的目的地址(2.2.2.2)不匹配,所以用目的地址 20.0.0.2 和源地址送出接口的 IP地址,封装原本的数据包。但是这样封装后,最外层的 IP 包(10.0.0.1 到 20.0.0.2)就不是经过 tunnel0 的数据包了,所以也就不会在触发GRE 的封装了。所以数据包从原本的物理接口送出。也就没有实现 IPsec over GRE。
8、但是有一点比较疑惑就是为什么 set peer 不指定 tunnel0 的接口地址?原因是发出数据包的源地址为物理接口也就是 s0/0 的地址。即使指定 cry map zzz local-address tunnel 0 系统也是认为是发出的源地址为物理接口地址(tunnel source 地址) 。但是这仅限于 cisco 的路由器,如果是别的路由器,tunnel0 接口的 IP 地址(12.12.12.1)为源地址的话。应该是可以完成 IPsec over GRE 的,因为原始的数据包为 1.1.1.1 到 2.2.2.2 触发了 IPsec 的感兴趣流,然后IPsec 将这个数据包再封
9、装一次,源到目的为 12.12.12.1 到 12.12.12.2,然后送到 tunnel 出口,tunnel 出口由事先定义好的,tunnel source 10.0.0.1 tunnel destination 20.0.0.2 再次封装。我的理解数据包应该是这样的,但是我不确定是不是正确IP 包头S10.0.0.1 D20.0.0.2GRE 头 IP 包头 S 12.12.12.1 D 12.12.12.2AH 或者 ESP IP 包头S 1.1.1.1D 2.2.2.2下面说一个 IPsec over GRE 成功的例子,并解释其原理:还是如图所示Crypto Map: “zzz“ i
10、db: Loopback0 local address: 1.1.1.1Crypto Map “zzz“ 10 ipsec-isakmpPeer = 2.2.2.2Extended IP access list 100access-list 100 permit ip host 1.1.1.1 host 2.2.2.2Current peer: 2.2.2.2Security association lifetime: 4608000 kilobytes/3600 secondsPFS (Y/N): NTransform sets=zhang,Interfaces using crypto m
11、ap zzz:Tunnel02.0.0.0/32 is subnetted, 1 subnetsS 2.2.2.2 is directly connected, Tunnel0这是 R1 的关键配置。传输集为传输模式。首先 1.1.1.1 到 2.2.2.2 这个数据包到 tunnel0 接口,由于 tunnel0 接口上有一个 crypto map ,所以系统查看 crypto map 的感兴趣流设置,1.1.1.1 到 2.2.2.2 和一个感兴趣流匹配,所以开始与对等体 2.2.2.2 建立 IKE 阶段 1 的安全链接,又由于是传输模式,set peer 2.2.2.2 和原始数据包中
12、目的地址匹配,且发送的源地址为 loopback0 的地址(和 R2 的配置匹配) 。所以不对数据包进行再次封装,插入 AH 的头后从 tunnel0 口发出,出 tunnel0 的时候tunnel0 口负责对数据包进行再次封装,也就是添加最外层的包头 10.0.0.1 到 20.0.0.2 然后从物理口发出,成功完成了 IPsec over GRE。总结:需要了解数据包封装的先后次序,在那个接口放了 crypto map,数据包进入接口的时候就查看是否和 IPsec的感兴趣流匹配。IPsec 处理完后接口相应的协议再处理,例如绑定在 tunnel 接口,首先 IPsec 对数据包进行封装,如
13、过封装后符合从 tunnel 接口发出的路由,则再用 GRE 封装,完成 IPsec over GRE。所有的协议如 IPsec 和 GRE 总是处理最外层的 IP 包,外层以内的数据包他们不关心。还有就是要注意发出的源地址是否和对端的 set peer 匹配,如果不匹配不能完成 IKE 阶段 1 或者阶段 2 的协商。最后就是要注意 ctypto map zzz local-address tunnel 0 的源地址为 tunnel 完成封装后的物理接口的地址。最后附一个截图,是 IPsce over GRE 的隧道模式的截图GRE 只负责封装画红色框的 IP 包头,而不负责封装最里面的 I
14、P 包头。同理 IPsec 也一样好像说的比较混乱,下面说一下每条命令对包的封装情况:首先 GRE 定义 tunnel source x.x.x.x 这个就是 GRE 封装在最外面的数据包的源地址,然后是定义 tunnel destination y.y.y.y 这个是控制 GRE 封装在最外面的目的地址。如图所示GRE 封装的 IP 包S x.x.x.xD y.y.y.yGRE 头 原始 IP 包S 1.1.1.1D 2.2.2.2所有通过 tunnel 口出去的包都会经过 GRE 的封装,所以可以在路由协议中宣告 tunnel 口的 IP 地址来运行路由协议。12.0.0.0/24 is
15、subnetted, 1 subnetsC 12.12.12.0 is directly connected, Tunnel0如果把这个接口宣告进 ospf 进程则可以运行路由协议。运行后包格式如下图GRE 封装的 IP 包S x.x.x.xD y.y.y.yGRE 头 原始 IP 包S 12.12.12.1D 224.0.0.5IPsec 中Crypto map 中的 set peer x.x.x.x 是最外面的目的地址。Crypto map zzz local-address interface 接口地址为源地址来封装数据包IPsec 封装 IP 包S y.y.y.y(Crypto map
16、 zzz local-address interface 接口的 IP 地址为源)D x.x.x.x(set peer x.x.x.x)ESP 或 AH 原始 IP 包S1.1.1.1D2.2.2.2IPsec Over GRE如果在 tunnel 接口挂上 crypto map 那么感兴趣流被触发后会根据 transform-set 进行封装,封装后的数据会再次查路由表,如果封装后的包(最外层的 IP 地址)下一跳为 tunnel 则发送到 tunnel 口进行 GRE 封装。数据再次抵达tunnel 口后由于与 tunnel 口 crypto map 中的感兴趣流不匹配,因此 ipsec
17、的 crypto map 不会再次进行封装,而只是由 tunnel 口封装 GRE 后发出。R1#show crypto isakmp key Keyring Hostname/Address Preshared Keydefault 0.0.0.0 0.0.0.0 ciscoR1#R1#show crypto map Crypto Map: “zzz“ idb: Loopback1 local address: 11.11.11.11Crypto Map “zzz“ 1 ipsec-isakmpPeer = 22.22.22.22Extended IP access list aaccess
18、-list a permit ip host 1.1.1.1 host 2.2.2.2Current peer: 22.22.22.22Security association lifetime: 4608000 kilobytes/3600 secondsPFS (Y/N): NTransform sets= z, Interfaces using crypto map zzz:Tunnel0R1#show ip route1.0.0.0/24 is subnetted, 1 subnetsC 1.1.1.0 is directly connected, Loopback02.0.0.0/3
19、2 is subnetted, 1 subnetsS 2.2.2.2 is directly connected, Tunnel021.0.0.0/32 is subnetted, 1 subnetsC 21.21.21.1 is directly connected, Loopback222.0.0.0/24 is subnetted, 1 subnetsS 22.22.22.0 is directly connected, Tunnel011.0.0.0/24 is subnetted, 1 subnetsC 11.11.11.0 is directly connected, Loopba
20、ck112.0.0.0/24 is subnetted, 1 subnetsC 12.12.12.0 is directly connected, Tunnel014.0.0.0/24 is subnetted, 1 subnetsC 14.14.14.0 is directly connected, FastEthernet0/0S* 0.0.0.0/0 1/0 via 14.14.14.4在 IPsec Over GRE 情况下物理口收到流量的处理方式和从 loopback 口收到流量的处理方式有所不同。从 loopback 接口中收到流量的方式就是我以上说的处理方式,但是从物理口接受流量的处理方式是:当一个包进入后查询路由表发现下一跳从 tunnel 口发出,数据被送到 tunnel 口,此时路由器发现 tunnel 口有一个 crypto map,于是进行 IPsec 封装,封装后不再重新查询路由表,而是直接从 tunnel 口发出,此时 tunnel 口会继续进行 GRE 的封装,此时导致有两层封装。如图所示虽然目的地址 14.14.14.1 下一跳不是 tunnel 口,但是依然会进行 GRE 的封装,因为没有再次查询路由表,而是依然在 tunnel 口内再次进行 GRE 封装。