【Linux】网络编程 —— NAT、内网穿透、代理服务
2026/9/17 0:18:12 网站建设 项目流程

🌈欢迎来到Linux专栏 ~~ 网络编程

  • 🌍博客主页:张小姐的猫~江湖背景
  • 🔥所属专栏:Linux ~ 不破不立
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

网络编程

  • 🌈欢迎来到Linux专栏 ~~ 网络编程
  • 👀NAT 技术背景
    • ♻️NAT ~ IP转换过程
    • 🌟NAPT
    • ❌️NAT技术的缺陷
    • 💥通信过程
  • 🆚内网传统 vs 内网打洞
    • 🐭内网打洞
    • 🐾内网穿透
  • 🗿代理服务器
    • 1️⃣正向代理
    • 2️⃣反向代理
    • 💥代理服务器和NAT
    • 🤔
  • 📢写在最后

👀NAT 技术背景

之前我们讨论了,IPv4协议中,IP地址数量不充足的问题
NAT技术当前解决IP地址不够用的主要手段,是路由器的⼀个重要功能

  • NAT能够将私有IP对外通信时转为全局IP。也就是就是⼀种将私有IP和全局IP相互转化的技术方法
  • 很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP
  • 全局IP要求唯⼀,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的

♻️NAT ~ IP转换过程

私有IP内部,转换的工作都会存在,一旦进入了公网则不需要源IP地址替换了


报文每经过一个路由器,路由器就会自动把报文的SRC,换成自己的WANIP

  • 其实1️⃣源IP、源端口也可能会被替换!

IP地址在内网和公网其实都是唯一的!如何理解?

  • 2️⃣是只在一个内网里是唯一的,但是可能会和其他的内网中的IP地址会出现冲突

🌟NAPT

那么问题来了,如果局域网内,有多个主机都访问同⼀个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的。那么NAT路由器如何判定将这个数据包转发给局域网的哪个主机?

这时候NAPT来解决这个问题了。使⽤IP + port来建立这个关联关系

如果三台电脑都要访问 Internet —— 如果只做简单NAT

192.168.1.10203.0.113.10192.168.1.11203.0.113.10192.168.1.12203.0.113.10

外网服务器返回数据时就会产生问题:

  • 都是发给203.0.113.10,到底该转发给哪台内网主机?于是NAPT使用端口号来区分不同连接。

实际上就把<源地址 + 端口号,路由器的WAN口 + 新端口号>

192.168.1.10:50000203.0.113.10:10001192.168.1.11:50000203.0.113.10:10002

这样即使转换后的src地址一样,但同样可以根据端口号的不同来区分转发到不同的主机!

最终路由器会有一张转化表:

内网 外网------------------------------------------------192.168.1.10:50000←→203.0.113.10:10001192.168.1.11:50000←→203.0.113.10:10002192.168.1.12:60000←→203.0.113.10:10003

这种关联关系也是由NAT路由器自动维护的。例如在TCP的情况下,建立连接时,就会生成这个表项;在断开连接后,就会删除这个表项

那么两个内网主机(有NAT隔离)可以直接通信吗?❌️因为在对应的路由器上还没有对应的转换条目(没有NAT表)!

【NAT】 A ─── Internet ─── NAT ─── B A 主动访问 B ↓ NAT 没有映射 ↓ 不知道交给哪个内网主机 ↓ 不能直接通信

如果目标网络被NAT隔离,且没有NAT映射,那么外部无法主动找到具体的内网主机

服务器不能直接给主机直接发送数据,因为进入到路由器,根本找不到映射 —— 不知道要转发给哪个主机!

❌️NAT技术的缺陷

由于NAT依赖这个转换表,所以有诸多限制:

  • 无法从NAT外部向内部服务器建立连接
  • 转换表的生成和销毁都需要额外开销
  • 通信过程中⼀旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开

💥通信过程

内网 A 访问公网 B

A NAT 路由器 B192.168.1.10:50000公网IP:1.1.1.18.8.8.8:443│ │ │ └──────────────────────────→│───────────────────────→│

A 发出的数据:

源:192.168.1.10:50000目的:8.8.8.8:443

过程:先路由判断,再做 SNAT

① 数据包进入路由器 ↓ ② 查路由表 目的:8.8.8.8→ 应该从 WAN 口出去 ↓ ③ 确定出口接口 ↓ ④ 做 SNAT —— 建立好映射192.168.1.10:500001.1.1.1:30000↓ ⑤ 从 WAN 口发出

所以对于内网访问公网,可以简单记:
先路由,确定出口;再 SNAT,修改源地址

返回数据时,B返回

源:8.8.8.8:443目的:1.1.1.1:30000

进入NAT路由器:

① 收到数据包 ↓ ② 查 NAT/连接跟踪表1.1.1.1:30000↓ 对应:192.168.1.10:50000↓ ③ 做 DNAT 修改目的地址:1.1.1.1:30000192.168.1.10:50000↓ ④ 查路由表 发现192.168.1.0/24从 LAN 口出去 ↓ ⑤ 发给 A

先根据 NAT 状态还原目的地址,再根据新的目的地址查路由

DNAT 通常影响后续的路由选择;SNAT 通常依赖前面的路由选择结果

🆚内网传统 vs 内网打洞

🐭内网打洞

内网打洞 = 两个内网主机先主动向外发消息,让NAT记录映射,然后再利用这个映射互相通信

以后两个路由器进行通信就不再需要经过路由器了,把数据转发到对方的出口路由器就行 —— 因为出去和服务器进行通信时就已经产生了NAT表了,说明是可以映射回来的

云服务器收到的客户端IP本质是:运营商出口路由器的WANIP

🐾内网穿透

公司和云服务器使用了frpc把本地的22号端口映射到frps的8888端口,也就是将来发送给8888的请求都会转发到22号端口 ——frps干的

  • 那么我们居家办公访问8888号端口 = 访问22号端口了

内网穿透和内网打洞的区别:

核心原理都是利用路由器形成的NAT转化表,把我们的内网服务暴露出去的特征

  • 内网穿透必须强依赖于一款服务器(服务器一直要进行工作),让用户访问8888的端口等同于访问内网主机

  • 内网打洞借鉴云服务器做出入口路由器地址的交换,从而摒弃云服务器

内网穿透是一直在用,内网打洞则是用一会!

🗿代理服务器

1️⃣正向代理

正向代理(ForwardProxy)是⼀种常见的网络代理方式,它位于客户端和目标服务器之间,代表客户端向目标服务器发送请求。正向代理服务器接收客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端。通过这种方式,正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制等

工作原理

  • 客户端将请求发送给正向代理服务器
  • 正向代理服务器接收请求,并根据配置进行处理,如缓存查找、内容过滤等
  • 正向代理服务器将处理后的请求转发给目标服务器
  • 目标服务器处理请求,并将响应返回给正向代理服务器
  • 正向代理服务器将响应返回给客户端
  • Nginx

2️⃣反向代理

反向代理服务器是⼀种网络架构模式,其作为Web服务器的前置服务器,接收来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客户端。这种架构模式可以提升网站性能、安全性和可维护性等

基本原理
反向代理服务器位于客⼾端和Web服务器之间,当客户端发起请求时,它首先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的Web服务器,并将Web服务器的响应返回给客户端。在这个过程中,客户端并不知道实际与哪个Web服务器进行了交互,它只知道与反向代理服务器进行了通信

我们买的云服务器就是在图中右侧的任意一个,反向代理服务器的公网IP会转给内部的某个机器 —— 给我们的错觉是有一个公网服务器的IP,所以能理解无法绑定公网IP,因为真正的IP并没有给到我们

举例子:

💥代理服务器和NAT

路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程。代理服务器看起来和NAT设备有⼀点像。客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端

代理服务器是最大的中间人!

🤔

对信息进行渲染 就是谷歌的页面了

上面的代理客户端jw服务器(几百台,部署代理 —— 机场)都是有专门的人来做的

对于jw服务器:我的客户端怎么知道有几百台服务器呢?机场会给我一下配置文件——代理服务器的地址,代理商就会给你这个配置文件的下载链接

  • 我们的主机按这个链接进行配置后,就会自动下载远程的服务器的密钥和登录信息 —— 后续就可以访问了

对信息进行渲染 就是谷歌的页面了

上面的代理客户端jw服务器(几百台,部署代理 —— 机场)都是有专门的人来做的

对于jw服务器:我的客户端怎么知道有几百台服务器呢?机场会给我一下配置文件——代理服务器的地址,代理商就会给你这个配置文件的下载链接

  • 我们的主机按这个链接进行配置后,就会自动下载远程的服务器的密钥和登录信息 —— 后续就可以访问了

📢写在最后

接下来登场的是 IO 模型

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询