测试当前网络的 NAT 类型

2023-02-20

假设你已经有了 nami

还没有的话,先安装 nami:

https://github.com/txthinking/nami

安装 stuntman

nami install stuntman

一行命令测试当前网络的 NAT 类型

stunclient stun.stunprotocol.org --mode behavior
stunclient stun.stunprotocol.org --mode filtering

为什么输出的不是 Full Cone 或 Symmetric 类似的字符串

你可能经常看到 NAT 类型分为 Full-cone NAT,Address-restricted-cone NAT,Port-restricted cone NAT,Symmetric NAT。

其实严格意义来说不准确。很多 NAT 是以上类型的组合,所以最好参考 NAT 行为而不是使用以上名字。

回到上面测试命令的输出,如果非要对号以上名字: Full Cone 应该是 Endpoint-Independent Mapping,Endpoint-Independent Filtering。 Symmetric 应该是 Address- and Port-Dependent Mapping,Address-Dependent Filtering 或 Address and Port-Dependent Filtering

哪个好

简单讲

复制一段释义:

Full Cone NAT:所有来自同一个内部 Tuple X 的请求均被 NAT 转换至同一个外部 Tuple Y,而不管这些请求是不是属于同一个应用或者是多个应用的。除此之外,当 X-Y 的转换关系建立之后,任意外部主机均可随时将 Y 中的地址和端口作为目标地址和目标端口,向内部主机发送 UDP 报文,由于对外部请求的来源无任何限制,因此这种方式虽然足够简单,但却不那么安全

Symmetric NAT:这是一种比所有 Cone NAT 都要更为灵活的转换方式:在 Cone NAT 中,内部主机的内部 Tuple 与外部 Tuple 的转换映射关系是独立于内部主机所发出的 UDP 报文中的目标地址及端口的,即与目标 Tuple 无关;在 Symmetric NAT 中,目标 Tuple 则成为了 NAT 设备建立转换关系的一个重要考量:只有来自于同一个内部 Tuple、且针对同一目标 Tuple 的请求才被 NAT 转换至同一个外部 Tuple,否则的话,NAT 将为之分配一个新的外部 Tuple ;打个比方,当内部主机以相同的内部 Tuple 对 2 个不同的目标 Tuple 发送 UDP 报文时,此时 NAT 将会为内部主机分配两个不同的外部 Tuple,并且建立起两个不同的内、外部 Tuple 转换关系。与此同时,只有接收到了内部主机所发送的数据包的外部主机才能向内部主机返回 UDP 报文,这里对外部返回报文来源的限制是与 Port Restricted Cone 一致的。不难看出,如果说 Full Cone 是要求最宽松 NAT UDP 转换方式,那么,Symmetric NAT 则是要求最严格的 NAT 方式,其不仅体现在转换关系的建立上,而且还体现在对外部报文来源的限制方面。