基于UDP实现NAT穿透

目标场景

应用场景

  有两个分别处于不同内网的客户端(客户端1:10.168.1.103、客户端2:14.10.12.155)分别通过各自的NAT网关(NAT网关A:172.128.58.1、NAT网关B:172.168.56.2)进行转换以访问外网。我们的目的是希望实现客户端1和客户端2的P2P通信。

技术方法

译自论文 Autonomous NAT Traversal.

单向IP获取

  使服务器了解客户端IP地址的关键思想是,服务器定期向一个固定的、已知的IP地址发送消息。最简单的方法是使用ICMP将请求消息ECHO到一个未分配的IP地址,比如1.2.3.4。由于没有分配1.2.3.4,没有默认路由的路由器将不会路由ICMP请求,而会直接返回的不可到达的消息。作为发送到1.2.3.4的消息的结果,NAT将启用响应此请求的应答路由。然后连接客户端将伪造这样的答复。具体地说,客户机将发送一条指示TTL_EXPIRED的ICMP消息作为响应(如上图所示)。

  服务器侦听到(假的)ICMP应答,就在收到应答后启动到ICMP应答中指定的发送方IP的连接。如果客户端使用一个全球可路由的IP地址,这是完全没有问题的,如果客户端侦听一个预先商定的端口,TCP或UDP都可以用来建立双向连接。在没有预先商定的端口的情况下,在大多数情况下,端口号可以作为ICMP回显响应有效负载的一部分进行通信,而NAT实现通常不会对相应的ICMP回显请求的有效负载进行检查。

NAT到NAT的连接

  如果客户端和服务器都在NAT之后,则会出现更多的复杂情况。在这种情况下,由于客户端的NAT实现所施加的限制,客户端通常无法向服务器传输假ICMP响应。避免这个问题的一个可能的想法是,客户机将与服务器发送的相同的消息(除了ttl1)发送到它的NAT。如果NAT接受了伪造的发送方IP地址,理论上它可能会生成所需的ICMP响应并将其转发到外部网络。然而,在实践中,我们没有找到使用TTL为1生成必要的ICMP消息的nat。

  即使客户端能够传输伪造的ICMP响应,下一步(客户端和服务器都知道其他IP地址,现在打算建立TCP或UDP连接)仍然很复杂。原因是NAT系统可以更改出站消息的源端口号。如果没有第三方,客户机和服务器都必须猜测它们各自的NAT实现选择的(可能是随机的)匹配的源端口号和目标端口号。根据NAT实现的类型(完全锥、受限锥、端口受限、对称),可能可以通过多条条消息找到正确的端口。

用UDP代替ICMP ECHO

  将ICMP回显请求发送到固定的已知IP地址的一种替代方法是让发送方采用UDP数据包发送到固定的、已知的IP地址和端口。在这种情况下,客户端将再次伪造ICMP TTL_EXPIRED消息,只是这次使用UDP格式。这种变化的主要缺点是发送方在伪造ICMP响应时必须猜测外部UDP发送方端口号。由于某些NAT会随机更改这些端口号,服务器可能不得不使用多个发送方端口发送UDP包,以便给客户端足够的机会正确猜测。

  这种技术的主要优点是服务器不再需要使用原始套接字发送,这可能会减少服务器所需的特权。需要注意的是,服务器仍然需要能够侦听ICMP应答,这需要Linux上的原始套接字。在全锥NAT的情况下,使用UDP数据包而不是ICMP ECHO请求还具有建立端口映射的优势,可以将其用作与对等方联系的另一种方法。

  这两种方法的另一个区别是可以嵌入响应中的有效载荷的大小。对于ICMP ECHO请求,有效负载可以是包大小允许的最大值,因此仅受相应物理网络的MTU的限制。而格式良好的ICMP UDP TTL exceeded应答只能包含32位的有效载荷:ICMP TTL exceeded响应包含原始IP包的前64位有效载荷。在这64位中,必须包含16位UDP校验和字段和16位UDP数据包长度(对于不跟踪UDP包来源信息的NAT来说是不可验证的),因此可以用来向服务器传输32位信息(除了发送方的IP地址)。但在我们的方法中,这些有效负载大小中的任何一个都足够了,因为除了IP地址之外,我们只传输一个端口号。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值