STUN
协议的全称是
Simple Traversal of User Datagram Protocol Through Network Address Translators
,主要功能是检测是否位于
NAT
后面,如果位于
NAT
后面,经过
NAT
转换后的地址和端口是什么,另外可以检测
NAT
的类型。
基本思想
在私网内部安装一个
STUN client
,在公网上安装一个
STUN Server
,
STUN
协议定义了一些消息格式,大体上分成
Request/Response
,
client
向
server
发送
request
,
server
发送
response
给
client
。如何检测
STUN client
是否在
NAT
后面呢?原理很简单,
Server
在收到
client
的
UDP
包以后,
Server
将接收到该包的地址和端口利用
udp
传回来给
client
,
client
把这些地址和端口与本机的
ip
地址和端口进行比较,如果不同,说明在
NAT
后面,否则就位于
NAT
后面。为了检测不同类型的
NAT
,
STUN
协议定义了一些消息属性,要求
Server
有不同的动作,比如发送响应的时候使用不同的
IP
地址和端口,或者改变端口等等。
STUN
协议对
NAT
可能有效,但是对防火墙就无能为力了,因为防火墙可能不会打开
UDP
端口。
NAT
分类
STUN
协议将
NAT
粗略分为
4
种类型,即
Full Cone
、
Restricted Cone
、
Port Restricted Cone
和
Symmetric
。举个实际例子来说明这四种
NAT
的区别:
A
机器在私网(
192.168.0.4
)
NAT
服务器(
210.21.12.140
)
B
机器在公网(
210.15.27.166
)
C
机器在公网(
210.15.27.140
)
现在,
A
机器连接过
B
机器,假设是
A
(
192.168.0.4:5000
)
-> NAT
(转换后
210.21.12.140:8000
)
-> B
(
210.15.27.166:2000
)。
同时
A
从来没有和
C
通信过。
则对于不同类型的
NAT
,有下列不同的结果:
Full Cone NAT
:
C
发数据到
210.21.12.140:8000
,
NAT
会将数据包送到
A
(
192.168.0.4:5000
)。因为
NAT
上已经有了
192.168.0.4:5000
到
210.21.12.140:8000
的映射。
Restricted Cone
:
C
无法和
A
通信,因为
A
从来没有和
C
通信过,
NAT
将拒绝
C
试图与
A
连接的动作。但
B
可以通过
210.21.12.140:8000
与
A
的
192.168.0.4:5000
通信,且这里
B
可以使用任何端口与
A
通信。如:
210.15.27.166:2001 -> 210.21.12.140:8000
,
NAT
会送到
A
的
5000
端口上。
Port Restricted Cone
:
C
无法与
A
通信,因为
A
从来没有和
C
通信过。而
B
也只能用它的
210.15.27.166:2000
与
A
的
192.168.0.4:5000
通信,因为
A
也从来没有和
B
的其他端口通信过。该类型
NAT
是端口受限的。
Symmetric NAT
:上面
3
种类型,统称为
Cone NAT
,有一个共同点:只要是从同一个内部地址和端口出来的包,
NAT
都将它转换成同一个外部地址和端口。但是
Symmetric
有点不同,具体表现在:只要是从同一个内部地址和端口出来,且到同一个外部目标地址和端口,则
NAT
也都将它转换成同一个外部地址和端口。但如果从同一个内部地址和端口出来,是到另一个外部目标地址和端口,则
NAT
将使用不同的映射,转换成不同的端口(外部地址只有一个,故不变)。而且和
Port Restricted Cone
一样,只有曾经收到过内部地址发来包的外部地址,才能通过
NAT
映射后的地址向该内部地址发包。
现针对
Symmetric NAT
举例说明:
A
机器连接过
B
机器,假使是
A
(
192.168.0.4:5000
)
-> NAT
(转换后
210.21.12.140:8000
)
-> B
(
210.15.27.166:2000
)
如果此时
A
机器(
192.168.0.4:5000
)还想连接
C
机器(
210.15.27.140:2000
),则
NAT
上产生一个新的映射,对应的转换可能为
A
(
192.168.0.4:5000
)
-> NAT
(转换后
210.21.12.140:8001
)
-> C
(
210.15.27.140:2000
)。此时,
B
只能用它的
210.15.27.166:2000
通过
NAT
的
210.21.12.140: 8000
与
A
的
192.168.0.4:5000
通信,
C
也只能用它的
210.15.27.140:2000
通过
NAT
的
210.21.12.140:8001
与
A
的
192.168.0.4:5000
通信,而
B
或者
C
的其他端口则均不能和
A
的
192.168.0.4:5000
通信。