HTML/JavaScript

2017年5月17日星期三

【Cisco】【安全】【CCNA】IPsec NAT Traversal(NAT-T)

IPsec NAT Traversal

IPsec NAT Traversal

介绍

本文的大部分内容来自RFC5996 2.23. NAT Traversal1IPsec NAT Transparency2,若存在不准确表述和理解请告知,谢谢。

NAT(PAT)是一种解决IP地址短缺的技术手段,负责将内部地址翻译成公网地址,因为修改了源地址,公网在回复数据包的时候会将数据包发送到NAT网关,网关需要将目的地址翻译成内部地址将数据包路由到正确设备上。

AH封装(AH Encapsulation)

Transport mode and Tunnel mode

    AH Transport
    +--------------------++---------++-------------+
    |Original IPv4 Header||AH Header||Original Data|
    +--------------------++---------++-------------+
    AH Tunnel 
    +-------------------------++---------++--------------------++-------------+
    |New IPv4 Header for IPsec||AH Header||Original IPv4 Header||Original Data|
    +-------------------------++---------++--------------------++-------------+

AH 提供源认证和完整性校验,但是不提供加密服务,所以数据包会计算一个哈希值填写在AH Header中,但是数据包经过NAT 设备之后,会修改报文中的源IP地址,对端收到数据包之后进行反向哈希计算,因为报文被修改而导致哈希值不匹配,所以会导致校验失败而丢弃。

ESP封装(ESP Encapsulation)

Transport mode

    ESP Transport
    +--------------------++----------++-------------++-----------++-------+
    |Original IPv4 Header||ESP Header||Original Data||ESP Trailer||ESP ICV|
    +--------------------++----------++-------------++-----------++-------+

当用户传递数据包是TCP或UDP报文的时候,TCP会强制计算伪头部(Pseudo Header)3 。伪头部计算的内容是,Source Address 、Destination Address 、Reserved 、Protocol、TCP Length。

正常情况下,TCP报文通过NAT设备,转换源地址,NAT设备会重新计算一次伪头部,将重新计算的值填在TCP Checksum 中。但是因为ESP数据包是被加密的,这部分关键数据因为加密而无法获得。因此NAT设备无法获取信息计算校验和,从而导致接收方TCP 校验失败而丢弃包。

说明: Changing the IP addresses in the IP header means the IP header checksum must be calculated. Since both UDP or TCP also have checksums, and these checksums are computed over a pseudo header that contains the IP source and destination address as well, they too must be recalculated each time a translation is made.4

Tunnel mode

    ESP Tunnel
    +-------------------------++----------++--------------------++-------------++-----------++-------+
    |New IPv4 Header for IPsec||ESP Header||Original IPv4 Header||Original Data||ESP Trailer||ESP ICV|
    +-------------------------++----------++--------------------++-------------++-----------++-------+

只有ESP tunnel mode 可以应用在NAT-T的环境中。在通过NAT转换的时候修改的是外部的源IP地址(New IPv4 Header for IPsec),在进行完整性校验的时候校验的也是内部的数据Original IPv4 Header + Original Data 。所以不会修改TCP的校验和,TCP也就能正常通过校验。

ESP 数据包NAT转发

NAT可以大致分为两类,一种是静态一对一的NAT转换,另外一种是多对一转换。在一对一的转换中ESP数据包转发并没有任何问题,但是结合实际情况,使用较多的是多对一转换方式,PAT方式。

PAT是以传输层端口号来进行工作的,但是由于ESP没有传输层端口号,所以ESP在PAT环境中转发的时候就需要使用到NAT-T的方式,来进行工作。

出于这个原因,IPSec将使用UDP封装ESP 数据包。当IPSec 检测到数据包沿途转发中存在NAT设备的时候,IPSec 将采用4500端口重新封装数据包。另外需要注意的是即使IKE初次建立的时候 启动器(initiator)可以直接使用IKE和ESP的端口4500,不管NAT是否存在 。 这种编码效率稍低,但对于NAT设备来说更容易处理。

Original Date       
+--------------------++-------------+       
|Original IPv4 Header||Original Data|
+--------------------++-------------+   

Not Enabled NAT-T       
+-------------------------++----------++--------------------++-------------++-----------++-------+
|New IPv4 Header for IPsec||ESP Header||Original IPv4 Header||Original Data||ESP Trailer||ESP ICV|
+-------------------------++----------++--------------------++-------------++-----------++-------+

Enabled NAT-T       
+-------------------------++----------++----------++--------------------++-------------++-----------++-------+
|New IPv4 Header for IPsec||UDP Header||ESP Header||Original IPv4 Header||Original Data||ESP Trailer||ESP ICV|
+-------------------------++----------++----------++--------------------++-------------++-----------++-------+
                                       ^           ^                                   ^            ^         
                                       |           |                                   |            |         
                                       |           +------------Encrypted -------------+            |               
                                       |                                                            |         
                                       +----------------------Authenticate--------------------------+         

For NAT devices
+-------------------------++----------++----+
|New IPv4 Header for IPsec||UDP Header||Data|
+-------------------------++----------++----+

NAT Traversal实现

  • IKE启动器(initiator )和响应者(responder )都必须在其IKE_SA_INIT数据包中包含通知类型为NAT_DETECTION_SOURCE_IP和NAT_DETECTION_DESTINATION_IP的有效载荷。 这些有效载荷可用于检测主机之间是否存在NAT, IKE_SA_INIT数据包中有效负载的位置恰好在Ni(Nonce)和Nr(Nonce)有效载荷之后(在可选的CERTREQ(Certificate Request)有效载荷之前)。

     Type Payload: Notify (41) - NAT_DETECTION_SOURCE_IP
        Next payload: Notify (41)
        0... .... = Critical Bit: Not Critical
        Payload length: 28
        Protocol ID: IKE (1)
        SPI Size: 0
        Notify Message Type: NAT_DETECTION_SOURCE_IP (16388)
        Notification DATA: ac69e386514bfd7f1ea2d768ae8dc90d0a20c6bd
    Type Payload: Notify (41) - NAT_DETECTION_DESTINATION_IP
        Next payload: NONE / No Next Payload  (0)
        0... .... = Critical Bit: Not Critical
        Payload length: 28
        Protocol ID: IKE (1)
        SPI Size: 0
        Notify Message Type: NAT_DETECTION_DESTINATION_IP (16389)
        Notification DATA: 1d87902599a1773c12e606834bf1c1310df3b556
    
  • NAT_DETECTION_SOURCE_IP通知相关联的数据是SPI的SHA-1摘要, IP地址和发送此数据包的端口。可能会有多个NAT_DETECTION_SOURCE_IP消息有效负载。

  • NAT_DETECTION_DESTINATION_IP通知相关联的数据是SPI发送的SHA-1摘要(按照它们出现在标题中的顺序),发送此数据包的IP地址和端口。

  • NAT_DETECTION_SOURCE_IP或NAT_DETECTION_DESTINATION_IP通知的响应者(responder )可以将提供的值与SPI的SHA-1哈希进行比较。源或接收者ip地址,地址和端口,如果不匹配,那么将启用NAT Traversal。这种情况下NAT_DETECTION_SOURCE_IP散列值与接收到的NAT_DETECTION_SOURCE_IP有效载荷不匹配, 如果不支持NAT穿越,响应者(responder )可能会拒绝连接 。NAT_DETECTION_DESTINATION_IP散列的情况下, 这意味着接收NAT_DETECTION_DESTINATION_IP有效载荷的系统在NAT后面,该系统应该开始发送如[UDPENCAPS rfc3948]中定义的keepalive数据包; 或者,如果不支持NAT穿越,则可以拒绝连接。

  • IKE启动器(initiator )必须检查NAT_DETECTION_SOURCE_IP或NAT_DETECTION_DESTINATION_IP有效载荷(如果存在), 并且如果它们不匹配外部分组中的地址, 必须通过UDP端口4500隧道与该IKE SA相关联的所有将来的IKE和ESP数据包。

  • 通过UDP端口4500隧道IKE数据包, IKE头部有四个八位字节零前缀,结果紧随UDP头. 通过UDP端口4500隧道传输ESP数据包, ESP头部紧随UDP头。 由于ESP头的前四个八位字节包含SPI, 并且SPI不能有效地为零,总是可以区分ESP和IKE消息。

  • 即使没有检测到NAT,实现也必须处理接收的UDP封装的ESP数据包。

  • 在传输模式NAT穿越的情况下,流量选择器必须包含一个IP地址,然后将其用作原始IP地址。 这在RFC 5996 中 第2.23.1节中有更详细的说明。

配置(关键配置)

拓扑图如下:
 +-----+12.1.1.1          +-----+23.1.1.2          +-----+34.1.1.3          +-----+45.1.1.4          +-----+
 |  R1 |-------F0/0-------|  R2 |-------F0/1-------|  R3 |-------F0/0-------|  R4 |-------F0/1-------|  R5 |
 +-----+          12.1.1.2+-----+          23.1.1.3+-----+          34.1.1.4+-----+          45.1.1.5+-----+

 R1:Server
 R2:Gateway
 R3:Internet
 R4:NAT Device
 R5:Client

由于没能使用IKEv2完成实验,所以如下部分只列举IKEv1 的配置命令。

R1配置:
!
interface FastEthernet0/0
 ip address 12.1.1.1 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 12.1.1.2
R2配置:
!
interface FastEthernet0/0
 ip address 12.1.1.2 255.255.255.0
!         
interface FastEthernet0/1
 ip address 23.1.1.2 255.255.255.0
 crypto map ikev1-map
!
crypto isakmp policy 10
 authentication pre-share
crypto isakmp key ccie43413 address 34.1.1.4       
!
crypto ipsec transform-set ikev1-transform-set esp-des esp-md5-hmac 
 mode tunnel
!
crypto map ikev1-map 10 ipsec-isakmp 
 set peer 34.1.1.4
 set transform-set ikev1-transform-set 
 match address vpn
!
ip access-list extended vpn
 permit ip host 12.1.1.1 host 45.1.1.5
!
ip route 0.0.0.0 0.0.0.0 23.1.1.3
!
R3配置:
!
interface FastEthernet0/0
 ip address 34.1.1.3 255.255.255.0
!
interface FastEthernet0/1
 ip address 23.1.1.3 255.255.255.0
!
R4配置:
!
interface FastEthernet0/0
 no switchport
 ip address 34.1.1.4 255.255.255.0
 ip nat outside
!
interface FastEthernet0/1
 no switchport
 ip address 45.1.1.4 255.255.255.0
 ip nat inside
!
ip nat inside source list 1 interface FastEthernet0/0 overload
ip nat inside source static udp 1.1.1.1 4500 interface FastEthernet0/0 4500
ip nat inside source static udp 1.1.1.1 500 interface FastEthernet0/0 500
!
access-list 1 permit 45.1.1.0 0.0.0.255
!
ip route 0.0.0.0 0.0.0.0 34.1.1.3
!
R5配置:
!
crypto isakmp policy 10
 authentication pre-share
crypto isakmp key ccie43413 address 23.1.1.2       
!
crypto ipsec transform-set ikev1-transform-set esp-des esp-md5-hmac 
 mode tunnel
!
crypto map ikev1-map 10 ipsec-isakmp 
 set peer 23.1.1.2
 set transform-set ikev1-transform-set 
 match address vpn
!
ip access-list extended vpn
 permit ip host 45.1.1.5 host 12.1.1.1
!
interface FastEthernet0/1
 ip address 45.1.1.5 255.255.255.0
 crypto map ikev1-map
!
ip route 0.0.0.0 0.0.0.0 45.1.1.4
!

附录

Frame 12: 174 bytes on wire (1392 bits), 174 bytes captured (1392 bits) on interface 0
Ethernet II, Src: ca:08:15:0c:00:06 (ca:08:15:0c:00:06), Dst: ca:07:1f:8c:00:06 (ca:07:1f:8c:00:06)
Internet Protocol Version 4, Src: 34.1.1.4, Dst: 23.1.1.2
User Datagram Protocol, Src Port: 1025, Dst Port: 4500
    Source Port: 1025
    Destination Port: 4500
    Length: 140
    [Checksum: [missing]]
    [Checksum Status: Not present]
    [Stream index: 1]
UDP Encapsulation of IPsec Packets
Encapsulating Security Payload
    ESP SPI: 0x7fd1fc5d (2144468061)
    ESP Sequence: 2

NAT-T Capturing packets

参考文献

没有评论:

发表评论