0%

NAT 类型详解

全锥型、IP受限锥型、端口受限锥型、对称型/非锥型是用于描述 NAT 的四种工作模式,在点对点(P2P)连接和 VoIP 通信中,这些 NAT 类型对建立外部连接有重要影响。

1. 全锥型 NAT(Full Cone NAT)

特点: 最宽松的 NAT 类型,允许任何外部主机与内部网络中的主机通信,只要该内部主机先发起了通信。

工作原理:

  • 内部主机发起连接请求时,NAT 会将内部 IP 地址和端口映射到一个外部 IP 地址和端口
  • 映射是静态的,即从同一内部 IP 地址和端口发出的所有流量都会映射到同一外部 IP 地址和端口
  • 任何外部主机,只要知道这个映射的外部 IP 地址和端口,都可以通过该地址和端口直接与内部主机通信

优缺点:

优点: 简单易用,兼容性好,特别是在 P2P 应用中
缺点: 安全性较低,因为任何人只要知道映射,就可以直接访问内部主机

示例:

  • 内部地址 192.168.1.10:12345 发起连接,NAT 将其映射为 203.0.113.5:50000
  • 外部主机 x.x.x.x 可以通过 203.0.113.5:50000 直接与 192.168.1.10:12345 通信

2. IP受限锥型 NAT(IP Restricted Cone NAT)

特点: 对外部主机的访问进行了一定的限制,只有先前与内部主机通信过的外部主机才能继续与之通信。

工作原理:

  • 与全锥型 NAT 类似,内部主机发起的连接会被映射到外部 IP 地址和端口
  • 但是,NAT 只允许外部主机使用与内部主机先前通信时使用的 IP 地址来访问该内部主机
  • 如果外部主机的 IP 地址没有与内部主机通信过,则其发送的任何数据包都会被 NAT 丢弃

优缺点:

优点: 提供了一定的安全性,限制了外部主机的访问
缺点: 可能会影响某些 P2P 或 VoIP 应用的连接能力

示例:

  • 内部地址 192.168.1.10:12345 发起连接,NAT 将其映射为 203.0.113.5:50000
  • 只有之前与 192.168.1.10 通信过的外部主机 x.x.x.x 才能通过 203.0.113.5:50000 继续通信

3. 端口受限锥型 NAT(Port Restricted Cone NAT)

特点: 在受限锥型 NAT 的基础上,进一步限制了外部主机必须使用与内部主机通信时使用的相同端口。

工作原理:

  • 内部主机发起的连接被映射到外部 IP 地址和端口
  • NAT 只允许使用与内部主机通信时相同 IP 地址和端口号的外部主机来访问该内部主机
  • 如果外部主机尝试使用不同的端口号进行通信,NAT 会拒绝该请求

优缺点:

优点: 提供了更高的安全性,进一步限制了外部主机的访问
缺点: 可能对 P2P 应用造成较大限制,增加了建立连接的难度

示例:

  • 内部地址 192.168.1.10:12345 发起连接,NAT 将其映射为 203.0.113.5:50000
  • 只有外部主机 x.x.x.x:60000 才能通过 203.0.113.5:50000 进行通信
  • 如果外部主机 x.x.x.x 使用不同的端口号(例如 70000),通信将被拒绝

4. 对称型 NAT(Symmetric NAT)

特点: 最严格的 NAT 类型,每个内部主机的每个连接都会有不同的映射。即使是同一内部 IP 地址和端口,针对不同的外部主机,也会有不同的外部映射。

工作原理:

  • 内部主机发起的每个连接请求都会生成一个唯一的外部 IP 地址和端口的映射
  • 仅允许外部主机通过该特定的外部 IP 地址和端口组合来访问内部主机
  • 同一内部主机针对不同外部目标的请求会生成不同的外部地址映射

优缺点:

优点: 提供最高的安全性,因为外部主机几乎不可能预测内部主机的映射
缺点: 对 P2P 和 VoIP 等应用不友好,连接建立非常困难,可能需要借助中继服务器

示例:

  • 内部地址 192.168.1.10:12345 发起两个连接,一个指向 8.8.8.8,另一个指向 1.1.1.1
  • NAT 将第一个连接映射为 203.0.113.5:50000,将第二个连接映射为 203.0.113.5:50001
  • 只有 8.8.8.8 可以通过 203.0.113.5:50000 访问内部主机,1.1.1.1 只能通过 203.0.113.5:50001

总结

NAT 类型 开放程度 安全性 P2P 兼容性
全锥型 NAT 最开放 最低 最好
IP受限锥型 NAT 中等 中等 较好
端口受限锥型 NAT 较严格 较高 一般
对称型 NAT 最严格 最高 最差

理解这些 NAT 类型有助于选择合适的网络配置,特别是在需要通过 NAT 进行复杂网络通信时,如游戏、视频通话或点对点文件共享。

年前买了一个大疆的 DJI Mini 4K 无人机玩, 玩了一两周之后发现对于我这种不经常出去玩的人这东西有点浪费. 于是春节回成都之后果断出了.

出掉无人机之后手里有笔闲钱, 那几天刷咸鱼的时候老给我推送 R730 的帖子, 重新点燃了我置办一台服务器的想法.

于是在一个阳光明媚的周末, 在成都一个前辈的手上淘了一个, 去拉了回来.

阅读全文 »

最近项目组很多新项目都使用到了 Git LFS, 解决了 Git 大文件提交容易导致仓库尺寸爆炸的问题.

Git LFS: 简单来说就是用来存储源码仓大文件的, 会把大文件放在"别的地方"存储, 保持源码仓的 Size.

有必要学习一下基础用法.

阅读全文 »

在之前的博客中介绍了一个差分包工具 zstd(虽然说人家的专业是压缩软件,谁让它的差分能力那么出众呢)。

使用 Ztsd 代替 bsdiff/bspatch 差分还原文件

这货很能打,用起来也很爽。但是有个痛点就是制作差分包的时候有文件大小限制:不支持大于 2G 的文件。

但是在使用中经常遇到这种情况,为了彻底不再忍受 bsdiff 那蜗牛般的速度,遂决定通过修改 ztsd 源代码来支持对 2G 文件的支持。

阅读全文 »

最近想写点桌面小工具,语言已经确定了用 Go,于是把市面上常见的几个 UI 库简单对比了一下。

除了对比,也会记录一下我对它们的主观评价,便于下次使用的时候参考。

评价的目标是用于个人使用,会考虑性能、资源消耗、依赖以及上手难度等维度。性能数据只做浅度分析,场景是跑一个 Demo 用例,分析磁盘、内存、CPU的消耗情况。

阅读全文 »

Windows 上编译 GUNC/C++ 代码,需要用到 MinGW-w64 的编译环境。

MinGW-w64 的全称是 Minimalist GNU for Windows 64-bit,其主要目标是提供一个最小化的、可以运行 GNU 工具链的 Windows 环境。它包括了许多常见的 GNU 工具和库,如 GCC(GNU Compiler Collection,GNU 编译器集合)GDB(GNU Debugger,GNU 调试器) 等,以及一个 Windows 兼容的 POSIX API 实现。这些工具允许开发者在 Windows 上编写、编译和调试 C/C++ 等编程语言的代码,同时也能运行许多在 Unix 系统上编写的脚本和工具。

MinGW-w64MinGW 的升级版,MinGW 是一个 GNU 编译器链,它提供了 CC++ 编译器,以及一些其他工具,如 makegdb 等。MinGW-w64MinGW 的一个分支,它提供了与 MinGW 相同的功能,但同时支持 64 位32 位 的编译。

阅读全文 »

最近有个需求:有一个系统应用,在某个业务时执行了一些 shell 命令,操作系统中的网络接口。随着版本迭代需求演进,要把这些 shell 命令迁移到 framework 中执行。

想当然的认为没什么难度,但属实是踩了一坑。

阅读全文 »

Go 的模块默认从 GOPROXY 环境变量获取。这个变量默认指向 https://proxy.golang.org/

很遗憾正常情况国内是无法访问的。

好在国内和国外有一些镜像站,可以配置之后使用。

阅读全文 »