「NAT」- STUN,Session Traversal Utilities for NAT,

问题描述

NAT 穿越技术除了使用 NAT ALG 之外,还有一种思路是利用 Cone NAT 的特性,通过事先建立 NAT 映射表项在 NAT 设备上“打洞”,通过 NAT 映射表项在私网之间建立连接;

解决方案

STUN,在 RFC3489 中定义,作为一个完整的 NAT 穿透解决方案,英文全称是 Simple Traversal of UDP Through NATs,即简单的用 UDP 穿透 NAT;

在新的 RFC5389 修订中把 STUN 协议定位于为穿透 NAT 提供工具,而不是一个完整的解决方案,英文全称是 Session Traversal Utilities for NAT,即 NAT 会话穿透效用。RFC5389 与 RFC3489 除了名称变化外,最大的区别是支持 TCP 穿透;

原理简述

在讲述 STUN 原理前,需要再次强调:如果外部主机以 NAT 映射表中的公网 IP+Port 为目标发送数据,数据是否会被转发?—— 数据是会被转发的,原因在于 NAT 并不强制检查源地址,即针对源地址的检查是配置的;

STUN(Session Traversal Utilities for NAT)的主要作用是获取 NAT 设备上的“打洞信息”(即私网 IP+端口与 NAT 后的公网 IP+端口的映射关系),NAT 穿越的数据通道需要使用其他方式建立;

STUN 采用客户端 / 服务器通信模式,通过 STUN Client 与 STUN Server 之间的报文交互,可以发现 NAT 设备的存在,并确定 NAT 设备分配的 IP 地址和端口号;

应用场景

SDWAN 场景下,可以通过 STUN 将 NAT 后的设备互联,建立数据通道;

1)STUN Client 向 STUN Server 发送 STUN 绑定请求报文(Binding Request);
2)STUN Server 收到 STUN 绑定请求报文后,获取该报文中的源 IP 地址和源端口;并构建 STUN 绑定响应报文(Binding Response)发送给客户端;
3)STUN Client 收到 STUN 绑定响应报文后,根据该报文获取 IP 地址和端口,与之前发送的 STUN 绑定请求报文中的源 IP 地址和源端口比较,如果不一致,则 STUN Client 前面存在 NAT 设备;
4)STUN Client 之间通过 BGP 学习对端的 NAT 信息(NAT 前的 IP 地址和端口、NAT 后的 IP 地址和端口);
5)STUN Client 使用本端 NAT 前的 IP 地址和端口与对端 NAT 前的 IP 地址和端口,构建 STUN 绑定请求报文发送给对端;同时 STUN Client 使用本
6)端 NAT 前的 IP 地址和端口与对端 NAT 后的 IP 地址和端口,构建 STUN 绑定请求报文发送给对端。对端 STUN Client 也同样进行相应的操作;
7)对端 STUN Client 收到 STUN 绑定请求报文后,向本端 STUN Client 发送 STUN 绑定响应报文。本端 STUN Client 也同样进行相应的操作;
8)完成以上报文交互后,STUN Client 之间成功建立可 NAT 穿越的数据通道;