
🔥承渊政道: 个人主页
❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法》 《C++知识内容》 《Linux系统与网络知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 《MySQL数据库学习》 《Python知识内容》 《cpolar知识学习》
✨逆境不吐心中苦,顺境不忘来时路!✨ 🎬 博主简介:

在Linux网络学习中,一个常见的问题是:内网主机可以访问互联网,为什么外部用户却往往无法直接访问内网服务? 当我们尝试远程访问本地网站、测试接口或家庭设备时,就会发现,程序启动成功并不意味着外部能够连接.要理解其中的原因,需要弄清地址如何转换、通信如何转发,以及公网请求如何找到内网中的目标服务.NAT、代理服务与内网穿透彼此关联,却并不是同一个概念:NAT 关注地址及必要的端口转换,代理服务代替通信一方转发请求,而内网穿透则围绕"如何让外部访问内网服务"设计访问通路.与此同时,DNS负责域名解析,ICMP为网络诊断提供支持.域名解析成功、网络能够连通,也不等于业务服务一定可用 ,因此还需要结合端口、转发规则与应用响应逐层验证.本文将以 "理解网络转发 → 探索内网穿透 → 掌握解析与诊断 → 完成部署测试" 为主线,首先梳理 NAT、正向代理与反向代理的工作方式,再分析端口映射、反向隧道与中继转发等内网访问方案,随后认识 DNS 查询过程及ICMP的诊断作用.最后以内网服务对外访问为例,完成服务配置、隧道建立与外部访问测试,并结合日志和抓包排查问题,在身份验证、加密传输与最小开放的前提下,将协议原理落实到可验证的网络实践中.

目录
- 一、NAT技术背景
-
- [1.1NAT IP转换过程](#1.1NAT IP转换过程)
- 1.2NAPT
- 1.3NAT技术的缺陷
- 二、代理服务器
- 三、内⽹穿透
- 四、内⽹打洞
- 五、DNS快速了解
- 六、ICMP协议快速了解
- 七、⼿动部署并测试内⽹穿透
一、NAT技术背景
1.NAT 技术产生的背景
NAT(Network Address Translation,网络地址转换)是一种通过修改IP数据包中的地址信息,实现不同网络地址空间之间通信的技术.
NAT技术的产生,主要是为了解决IPv4地址资源不足的问题.
1.1 IPv4 地址资源不足
IPv4 使用 32 位地址,理论上可以提供约 43 亿个 IP 地址.
随着互联网、企业网络、移动终端和物联网设备快速发展,IPv4 地址需求持续增长,公网 IPv4 地址逐渐成为稀缺资源.
如果每台联网设备都需要一个独立公网 IP 地址,将难以满足互联网规模化发展的需求.
1.2 私有 IP 地址无法直接在公网路由
为了提高 IPv4 地址利用率,RFC1918规定了三个私有IPv4地址段:
| 私有地址范围 | CIDR 表示 |
|---|---|
| 10.0.0.0 -- 10.255.255.255 | 10.0.0.0/8 |
| 172.16.0.0 -- 172.31.255.255 | 172.16.0.0/12 |
| 192.168.0.0 -- 192.168.255.255 | 192.168.0.0/16 |
这些地址可以在不同的企业或家庭网络中重复使用,但不能作为全球互联网中的可路由地址.
因此,需要一种技术将私有IP地址转换成公网IP地址,使内网设备能够访问互联网.
NAT 正是为解决这一问题而广泛应用的技术.
2.NAT 技术发展历程
| 时间 | 关键发展 |
|---|---|
| 1994 年 | RFC 1631 首次正式提出 NAT 方案,缓解 IPv4 地址不足问题 |
| 1996 年 | RFC 1918 明确私有 IPv4 地址空间 |
| 2001 年 | RFC 3022 系统描述传统 NAT,包括 Basic NAT 和 NAPT |
| 之后 | NAT 广泛应用于家庭路由器、企业网关和运营商网络 |
| 现代网络 | CGNAT、NAT64 等技术用于 IPv4 地址共享及 IPv4/IPv6 互通场景 |
3.NAT 的基本工作原理
NAT通常部署在私有网络与公网之间的边界设备上,例如路由器、防火墙或运营商网关.

以最常见的 NAPT(网络地址端口转换)为例:
- 内网主机
192.168.1.10:51520发起访问请求. - NAT 网关将其源地址及端口转换为
203.0.113.5:40001. - NAT 网关记录转换映射关系,并将数据包转发至互联网.
- 外部服务器返回响应时,NAT 网关根据映射关系将数据转发回对应的内网主机.
通过这种机制,多台内网设备可以共享同一个公网 IP 地址访问互联网.
4.NAT 的主要类型
| 类型 | 转换方式 | 典型场景 |
|---|---|---|
| 静态 NAT | 固定 IP 一对一映射 | 内网服务器地址映射 |
| 动态 NAT | 从公网地址池动态分配映射 | 企业网络 |
| NAPT/PAT | 多个私有 IP 通过不同端口共享公网 IP | 家庭路由器、企业出口 |
| CGNAT | 运营商级地址转换,多个用户共享公网 IPv4 地址 | 宽带、移动运营商 |
其中,NAPT/PAT是日常网络中最常见的NAT实现形式.
5.NAT 的优势与局限性
主要优势:
- 节约公网 IPv4 地址资源.
- 允许多个终端共享公网 IP 访问互联网.
- 降低企业内部地址规划对公网地址分配的依赖.
- 对内部网络结构提供一定程度的地址隐藏.
主要局限性:
- 破坏传统 IP 网络的端到端地址透明性.
- 增加数据包转换、连接状态维护及故障排查的复杂度.
- 对 P2P、VoIP、网络游戏等需要端到端通信的应用产生影响.
- NAT 穿透可能需要 STUN、TURN、ICE、端口映射等机制.
- NAT 本身不能替代防火墙等安全控制措施.
6.总结
NAT 技术是在 IPv4 地址资源不足的背景下发展起来的网络地址转换技术,其核心思想是通过地址复用和地址转换,实现私有网络与公网之间的通信,从而提高 IPv4 地址利用率.
虽然IPv6的发展从根本上扩大了IP地址空间,但由于IPv4网络仍然广泛存在,NAT依然是现代网络架构中的重要技术,在家庭网络、企业网络、云计算和运营商网络中发挥着重要作用.
1.1NAT IP转换过程

核心规律是:请求出去时,修改源IP;响应回来时,修改目标IP.
1.图中的设备分别承担什么角色?
左侧是内网,客户端 A、B、C 分别使用 10.0.0.10、10.0.0.11 和 10.0.0.12.这些是私有IP,不能作为公网中的可路由地址直接使用.
中间的 NAT 路由器连接内网和公网:内网接口地址是 10.0.0.1,公网接口地址是 202.244.174.37.
右侧是互联网,以及客户端要访问的 Web 服务器,地址为 163.221.120.9.
2.一次请求如何完成往返?
以客户端 A 访问 Web 服务器为例,数据包地址的变化如下:
| 阶段 | 源 IP:谁发出的 | 目标 IP:发给谁 |
|---|---|---|
| ① 客户端 A 发出请求,尚未经过 NAT | 10.0.0.10 |
163.221.120.9 |
| ② 请求经过 NAT,进入公网 | 202.244.174.37 |
163.221.120.9 |
| ③ 服务器发送响应,尚未回到 NAT | 163.221.120.9 |
202.244.174.37 |
| ④ 响应经过 NAT,进入内网 | 163.221.120.9 |
10.0.0.10 |
第一步:客户端发起请求。
客户端 A 要访问服务器,因此数据包的源 IP 是自己的地址 10.0.0.10,目标 IP 是服务器地址 163.221.120.9.由于服务器位于外部网络,请求先交给网关处理.
第二步:NAT 修改请求的源 IP。
路由器把源 IP 从 10.0.0.10 换成公网地址 202.244.174.37,目标 IP 保持不变,同时维护相应的转换记录.这样,服务器看到的请求来源是路由器的公网 IP,而不是客户端的私有 IP.
第三步:服务器向公网 IP 返回响应。
服务器将响应发往 202.244.174.37.此时,响应数据包的源IP是服务器地址,目标IP是NAT路由器的公网地址.
第四步:NAT 将响应转回客户端。
路由器根据转换记录,把响应的目标 IP 从 202.244.174.37 改回 10.0.0.10,再转发给客户端 A.至此,一次请求和响应完成.
3.多台设备共享一个公网 IP,如何区分?
图中主要展示 IP 地址变化,省略了端口细节.多台设备共享一个公网IP时,通常使用 NAPT/PAT,即同时利用 IP 地址和端口进行转换.
例如,以下是两条示意映射:
text
客户端 A:10.0.0.10:50000 ↔ 202.244.174.37:40001
客户端 B:10.0.0.11:50000 ↔ 202.244.174.37:40002
虽然两台设备对外使用同一个公网IP,但映射后的端口不同,路由器便能结合协议、端口等信息及转换记录,把返回的数据送给正确的设备和连接.
可以把它理解为公司总机与分机:公网 IP 像总机号码,内网设备像各个分机;NAT 保存对应关系,让对外通信共用一个号码,同时让返回的信息找到正确的接收方.
1.2NAPT
那么问题来了,如果局域⽹内,有多个主机都访问同⼀个外⽹服务器,那么对于服务器返回的数据中,⽬的IP都是相同的.那么NAT路由器如何判定将这个数据包转发给哪个局域⽹的主机?这时候NAPT来解决这个问题了.使⽤IP+port来建⽴这个关联关系.

这种关联关系也是由NAT路由器⾃动维护的.例如在TCP的情况下,建⽴连接时,就会⽣成这个表项;在断开连接后,就会删除这个表项.
1.3NAT技术的缺陷
**NAT 的核心代价是:节省了公网IP地址,却增加了端到端通信的复杂度,让连接依赖中间网关保存的转换状态.**结合前面的图,下面主要讨论多台设备共享一个公网IP的 NAPT/PAT 场景.
1.外部设备难以主动访问内网
图中客户端 A 可以先向服务器发起请求,NAT 建立映射后,服务器的响应就能返回.但外部设备主动发起一个新连接时,如果没有对应的映射或转发规则,NAT通常无法确定应该把数据交给哪台内网主机.因此,在内网部署服务器或提供远程访问服务,往往需要额外配置端口转发等机制.
这也增加了 P2P、音视频通话等应用建立直连的难度,可能需要 ICE、STUN 等穿透机制;直连无法建立时,还可能需要TURN服务器中继,增加部署成本,并可能增加通信延迟.
2.部分协议不能仅靠"修改 IP 首部"正常工作
有些协议不仅在 IP 首部中使用地址,还会在应用层数据中携带 IP 地址和端口,例如主动模式 FTP、SIP.只修改数据包首部,并不会自动修正应用数据中的私有地址,因此可能需要应用层网关(ALG)或协议自身提供的穿透机制.
此外,NAT的地址改写会与某些安全协议冲突.例如,IPsec AH 会保护 IP 地址等首部信息,地址被修改后会影响完整性验证;但这不意味着所有 IPsec 都无法使用,ESP 可以通过 NAT-T 的 UDP 封装穿越 NAT.
3.通信依赖转换表,状态丢失可能导致连接中断
前面图中的映射是:
text
10.0.0.10:1025 ↔ 202.244.174.37:1025
10.0.0.11:1025 ↔ 202.244.174.37:1026
这些记录相当于 NAT 的"分发依据".如果长时间没有流量,映射可能因超时被清除;应用有时需要发送保活报文来维持映射.
如果 NAT 设备重启、故障,或者流量切换到没有同步转换状态的另一台网关,已有连接也可能中断.因此,NAT场景下的多出口和高可用设计,需要额外考虑状态同步与流量路径.
4.存在处理能力、连接表和端口资源限制
NAT 需要查找映射、改写数据包并维护状态,会增加处理和存储开销.连接规模较大时,它可能成为性能瓶颈;但不能简单认为"用了 NAT,网络就一定明显变慢",实际影响取决于设备能力和负载.
对于PAT,可用公网端口也是有限资源.大量设备共享地址时,端口分配资源可能耗尽,导致新连接无法建立;这一问题在运营商级地址共享场景中尤其需要考虑.
5.故障排查、用户识别和审计更复杂
从外部看,多个用户可能都使用同一个公网 IP,仅凭这个 IP 无法区分具体是哪台内网设备发起的访问.排查时往往需要关联源端口、协议、时间戳以及NAT映射日志.
共享地址还可能带来"连带影响":某个用户触发网站的IP限流或封禁,同一公网IP下的其他用户也可能受到影响.
6.隐藏内网地址不等于提供完整安全保护
NAT 不等于防火墙,更不等于加密。 它可以隐藏内部地址,常见的状态机制也会限制没有映射的入站流量,但地址转换本身不能替代访问控制、恶意流量检测或数据加密.
家庭路由器往往同时具有 NAT 和防火墙功能,容易让人把两者混为一谈;实际上,"修改地址"和"决定是否允许通信"是不同的功能.
可以把 NAT 理解为前面提到的"公司总机":它让很多人共用一个对外号码,但外部找人需要转接,总机要记住对应关系,还可能遇到容量不足或记录丢失的问题.
因此,NAT 是用网络复杂度换取 IPv4 地址利用率,而不是没有代价地扩展地址空间.
二、代理服务器
代理服务器(Proxy Server)是客户端与目标服务器之间的"中间服务",负责代为转发请求和响应.
1.代理服务器如何工作?
可以把代理理解为"代办员":你告诉它需要什么,它替你联系目标网站,再把结果交给你.
以普通 HTTP 正向代理为例,请求和响应的路径是:
text
请求:客户端 → 代理服务器 → 目标网站
响应:客户端 ← 代理服务器 ← 目标网站
客户端先向代理提交访问请求;代理向目标网站转发请求,收到网站响应后,再把响应转交客户端.
沿用前面图片中的地址,假设有一台能够直接访问公网的代理,其内网监听地址为 10.0.0.1:8080,公网地址为 202.244.174.37.一次访问可以表示为:
| 通信阶段 | 源地址 | 目标地址 |
|---|---|---|
| 客户端连接代理 | 10.0.0.10:50000 |
10.0.0.1:8080 |
| 代理连接网站 | 202.244.174.37:40001 |
163.221.120.9:80 |
2.正向代理与反向代理
正向代理:替客户端访问外部服务
text
公司员工 → 公司代理服务器 → 外部网站
它站在客户端一侧。例如,公司让员工通过统一代理访问外部网站,便于集中实施访问策略.显式正向代理通常需要在客户端配置代理地址,也可能通过自动配置完成.
反向代理:替后端服务器接待访问者
text
┌→ 后端服务器 A
用户 → 反向代理服务器 ────┼→ 后端服务器 B
└→ 后端服务器 C
它站在服务端一侧.用户访问网站入口,反向代理再把请求分配给实际处理业务的服务器,可以用于请求转发和负载均衡.
记忆方式是:正向代理帮用户"往外访问",反向代理帮网站"接待用户".
3.代理服务器与 NAT 的区别
以下主要比较普通 NAT/PAT 与显式 HTTP 代理:
| 对比点 | NAT/PAT | HTTP 代理 |
|---|---|---|
| 核心操作 | 改写 IP 地址及必要的端口 | 接收并转发 HTTP 请求、响应 |
| 客户端连接的目标 | 目标服务器 | 代理服务器 |
| TCP 连接关系 | 通常不终止并重新建立 TCP 连接 | 客户端侧、服务器侧是不同连接 |
| 是否理解网页请求 | 地址转换本身不需要理解 | 可以解析 HTTP 请求 |
| 客户端设置 | 通常不需要应用单独配置 | 显式代理通常需要配置 |
因此,两者都可能让外部看到中间设备的地址,但实现机制不同,不能把代理理解成"更高级的地址转换表"。
另外,代理不只有HTTP代理.SOCKS5 代理可以中继 TCP 连接和 UDP 数据,不必理解其中的 HTTP 等应用内容. 所以,"所有代理都解析网页内容"也不准确.
4.有什么作用,又有哪些限制?
缓存可以减少重复访问。 支持缓存的 HTTP 代理,可以保存符合缓存规则的响应,在后续请求中复用,减少网络传输和服务器负担;但不是所有内容都允许缓存,也不是所有代理都启用缓存.
代理不等于匿名。 HTTP 代理可以通过 Forwarded 等请求头传递原始客户端地址,因此目标服务器不一定完全不知道请求来自谁.
代理也不等于能够读取加密内容。 访问 HTTPS 网站时,HTTP 代理常通过 CONNECT 建立隧道;如果没有额外的TLS解密机制,代理只是转发加密数据,不能直接读取其中的网页正文.
从这种中间转发结构也可以推知:代理增加了一个需要维护的节点,其带宽、处理能力和可用性会影响经过它的通信;缓存或负载分配可能改善性能,但不能笼统认为"用了代理就一定更快".
2.1正向代理
1.概述
正向代理是一种代表客户端访问目标服务器的网络代理方式。 它位于客户端和目标服务器之间:客户端先将访问请求发送给代理服务器,由代理服务器代为联系目标服务器,再将响应返回客户端.
可以把正向代理理解为"代办员":客户端告诉代理自己要访问什么,代理负责获取结果并转交给客户端.
text
请求:客户端 → 正向代理服务器 → 目标服务器
响应:客户端 ← 正向代理服务器 ← 目标服务器
正向代理代理的是"客户端",重点是帮助客户端访问外部资源,并对这些访问进行统一管理. 例如,企业可以让员工通过代理服务器访问互联网,统一实施访问控制、内容过滤和缓存策略.

2.工作原理
以图中多台客户端通过正向代理访问外部网站为例,下面说明普通 HTTP 请求的处理过程.
1.客户端发送请求
客户端配置代理地址后,将访问请求发送给正向代理服务器,并在请求中说明需要访问的目标网站.
例如,客户端A要访问某个网站,它先联系代理,由代理代为访问,而不是自己直接与网站服务器建立连接.
2.代理接收并处理请求
代理服务器收到请求后,按照配置执行相应检查和处理,例如检查客户端是否具有访问权限、目标网站是否被禁止,以及是否存在可以直接使用的有效缓存.
如果有效缓存能够满足请求,代理可以直接返回内容,不必每次都访问目标服务器;如果请求不符合访问策略,则可以拒绝转发.
3.代理向目标服务器转发请求
对于允许访问、且不能由缓存直接满足的请求,代理通过自身与目标服务器之间的连接进行转发.
在这一过程中,客户端与代理之间、代理与目标服务器之间是两段不同的连接.这与 NAT 主要改写原有数据包地址和端口的机制不同.
4.目标服务器返回响应
目标服务器处理请求后,将网页、图片或其他资源返回给代理服务器.
在网络连接层面,目标服务器通常看到的是代理的出口IP地址,而不是客户端的内网IP地址.
5.代理将响应返回客户端
代理收到响应后,再将内容返回给发起请求的客户端.对于符合缓存规则的内容,代理还可以保存副本,供后续请求使用.
完整的返回路径是"目标服务器 → 代理服务器 → 客户端",而不是目标服务器直接把响应发送给客户端。
3.功能特点
1.缓存功能
代理可以保存允许缓存的资源.当其他客户端请求相同资源,且缓存仍然有效时,可以直接从缓存获取,减少重复传输和外部网络访问.
例如,多名员工下载同一份允许缓存的文件,后续请求可能直接由代理提供.
需要注意,不是所有内容都能缓存,使用代理也不一定提高速度.缓存是否命中、代理处理能力以及网络路径都会影响实际效果.
2.内容过滤
代理可以根据规则检查并过滤其能够识别的请求或响应,例如限制访问特定网站、阻止某些文件类型下载,或者拦截已知恶意资源.
但内容过滤有适用边界:对于没有进行额外解密的 HTTPS 隧道,代理不能直接读取其中的网页正文,也不能像处理明文 HTTP 一样过滤正文内容.
3.访问控制
代理可以根据用户身份、客户端地址、访问时间和目标网站等条件,决定是否允许访问.
例如,企业可以要求员工通过身份验证后使用代理,并针对不同部门设置不同的访问权限.
访问控制关注的是 "谁可以在什么条件下访问哪些资源",内容过滤则更关注请求或响应中的具体内容.
4.隐藏客户端的直接网络地址
客户端通过代理访问网站时,网站在连接层面通常接触到的是代理的出口地址,因此代理可以减少客户端直接网络地址的暴露.
不过,隐藏 IP 地址不等于完全匿名.代理可能传递原始客户端信息,网站也可能通过登录账号、Cookie 等方式识别用户.
5.请求分流与负载分担
在配置了多台正向代理或多个出口的系统中,可以分担客户端访问流量,减少单台代理的压力.
这里需要区分原图中的表述:"将访问某个网站的请求分配给该网站的多台后端服务器",更典型的是反向代理的负载均衡功能,而不是正向代理的基本作用. 正向代理主要围绕客户端的访问需求和出口策略进行处理.
4.应用场景
| 应用场景 | 具体作用 |
|---|---|
| 企业网络管理 | 统一管理员工的互联网访问,设置身份验证、访问权限和网站访问策略。 |
| 学校、图书馆等公共网络 | 对公共终端的网络访问进行集中管理,限制不适当的资源访问。 |
| 内容过滤与上网保护 | 根据规则限制部分网站或资源,辅助家庭、学校等场景下的上网管理;实际效果受加密方式和过滤能力影响。 |
| 减少重复下载、改善访问效率 | 对允许缓存的公共资源进行复用,减少重复传输;是否加速取决于缓存命中率和网络条件。 |
| 跨地区、海外业务访问 | 通过指定代理出口访问业务系统或外部资源,满足出口管理和网络连通需求,但不保证所有目标都可访问,也不改变目标系统的访问权限要求。 |
总结:正向代理的核心是"替客户端访问目标服务器"。缓存、过滤和访问控制等能力建立在这一转发机制之上,是否具备以及如何生效,取决于代理的实现、配置和所处理的流量类型。
2.2反向代理
1.概述
反向代理是一种代表后端服务器接收客户端请求的网络代理方式。 它部署在网站或服务的入口位置,先接收客户端的访问请求,再根据配置将请求转发给后端服务器,最后把后端服务器的响应返回客户端.
可以把反向代理理解为"公司的前台":客户只需要联系前台,由前台把业务交给合适的工作人员处理,再将结果反馈给客户.
text
请求:客户端 → 反向代理服务器 → 后端服务器
响应:客户端 ← 反向代理服务器 ← 后端服务器
反向代理代理的是"服务器",重点是统一接收外部访问,并管理这些请求如何进入后端系统.
客户端通常只需要正常访问网站,不需要单独配置代理地址,也不必知道实际由哪台后端服务器处理请求.

2.工作原理
结合图中的结构,多台客户端通过互联网访问反向代理服务器,反向代理后面连接着多台 Web 服务器.一次典型的请求处理过程如下.
1.客户端访问网站
用户在浏览器中输入网站域名,请求到达网站对外提供的入口,也就是反向代理服务器.
从用户角度看,自己正在访问网站,并不需要关心网站内部有多少台服务器.
2.反向代理接收并处理请求
反向代理收到请求后,根据配置进行处理,例如检查访问权限、匹配请求路径、查找缓存,以及选择负责处理请求的后端服务器.
如果存在能够直接使用的有效缓存,反向代理可以直接返回响应,不必再次访问后端.
3.反向代理选择后端并转发请求
对于需要后端处理的请求,反向代理按照路由规则或负载均衡策略选择服务器,并将请求转发过去.
例如,下面是一种可能的分配结果:
text
用户 A 的请求 → 反向代理 → 后端服务器 1
用户 B 的请求 → 反向代理 → 后端服务器 2
用户 C 的请求 → 反向代理 → 后端服务器 3
通常,一次请求会转发给某一台选定的后端服务器,而不是同时发送给所有服务器. 图中连接多台服务器的箭头,表示代理可以选择不同的处理目标.
4.后端服务器处理请求
被选中的后端服务器执行具体业务,例如查询数据库、处理订单或生成页面,然后把处理结果返回给反向代理.
在这种典型架构中,后端服务器并不直接向客户端发送响应.
5.反向代理返回响应
反向代理收到后端响应后,可以按配置进行响应头调整、压缩或缓存等处理,再将结果返回客户端.
因此,完整的通信过程是:
text
客户端 → 反向代理 → 选中的后端服务器
客户端 ← 反向代理 ← 选中的后端服务器
3.功能特点
1.负载均衡
反向代理可以把不同请求分配给多台后端服务器,避免所有请求都集中在一台服务器上.
常见策略包括轮询、按权重分配,以及根据连接数选择服务器等.合理分配请求有助于利用多台服务器的处理能力,也便于通过增加后端服务器扩展系统.
如果配置了健康检查,还可以在发现某台后端异常后,暂时停止向它分配新请求.不过,多台后端并不代表整个系统自动具备高可用性,反向代理入口本身也需要考虑故障问题.
2.安全防护
反向代理可以作为统一的访问入口,在请求进入后端之前实施访问控制、限流或请求检查,减少后端直接暴露在互联网中的机会.
例如,后端服务器可以使用内网地址,并通过网络访问规则限制为仅允许代理访问.
需要注意,仅隐藏后端 IP 地址并不等于安全防护已经完成.只有配合访问限制等措施,才能减少外部绕过代理、直接访问后端的风险.
3.缓存加速
反向代理可以保存符合缓存规则的后端响应.当后续请求能够使用这些缓存时,就可以直接返回结果,减少后端处理和重复传输.
例如,访问频繁、更新较少的公共页面或图片,适合在正确配置下进行缓存.
缓存不是对所有内容都适用。 涉及个人信息、用户登录状态或实时数据的响应,需要设置恰当的缓存规则,避免返回过期内容或混用不同用户的数据.
4.请求过滤与重写
反向代理可以根据规则对请求或响应进行检查和调整,例如添加或删除请求头、修改转发路径,以及拒绝不符合要求的请求.
例如,对外访问路径是:
text
/api/users
转发到后端时,可以按配置修改为:
text
/users
这可以让网站对外保持统一的访问方式,同时适配不同后端服务的接口结构.
5.动静分离
动静分离是将静态资源和需要业务处理的动态请求分开处理.
例如:
| 请求类型 | 常见处理方式 |
|---|---|
| 图片、CSS、JavaScript 等静态资源 | 由入口服务器直接提供,或转发给专门的静态资源服务、CDN |
| 登录、订单、数据库查询等动态请求 | 转发给后端应用服务器处理 |
这样可以减少应用服务器处理静态资源的负担,让它更专注于业务逻辑.
动静分离并不要求所有静态文件都存放在反向代理服务器上,关键是根据资源类型采用合适的处理路径.
4.应用场景
| 应用场景 | 具体作用 |
|---|---|
| 网站负载均衡 | 将大量访问分配给多台后端服务器,分担处理压力,支持系统扩展。 |
| 统一访问入口 | 通过一个域名,根据路径等规则将请求转发到不同业务服务,例如用户服务、订单服务。 |
| 网站安全防护 | 在入口集中实施访问控制、限流和请求检查,配合网络规则限制后端直接暴露。 |
| 缓存与动静分离 | 缓存可复用的响应,让静态资源与动态业务分别处理,减少后端负担。 |
| CDN 内容分发 | 在分布式边缘节点接收用户请求,优先返回可用缓存,必要时再访问源站获取内容。 |
其中,Web CDN 的常见工作方式包含反向代理和缓存机制,但 CDN 不只是"一台反向代理服务器",还涉及多个边缘节点、请求调度和内容分发等能力.
5.与正向代理的区别
| 对比点 | 正向代理 | 反向代理 |
|---|---|---|
| 代表谁 | 客户端 | 后端服务器 |
| 主要解决什么问题 | 帮助客户端访问外部资源,统一管理出口访问 | 接收外部请求,统一管理后端服务入口 |
| 客户端是否需要配置 | 显式正向代理通常需要配置 | 通常不需要单独配置代理 |
| 典型场景 | 企业上网管理、客户端访问代理 | 网站负载均衡、入口安全控制、缓存加速 |
一句话区分:正向代理替客户端"向外访问",反向代理替服务器"接待访问".
2.3NAT和代理服务器
路由器往往都具备NAT设备的功能,通过NAT设备进⾏中转,完成⼦⽹设备和其他⼦⽹设备的通信过程.代理服务器看起来和NAT设备有⼀点像.客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后,代理服务器⼜把结果回传给客户端.
那么NAT和代理服务器的区别有哪些呢?
- 从应⽤上讲, NAT设备是⽹络基础设备之⼀,解决的是IP不⾜的问题.代理服务器则是更贴近具体应⽤,⽐如通过代理服务器进⾏翻墙,另外像迅游这样的加速器,也是使⽤代理服务器.
- 从底层实现上讲NAT是⼯作在⽹络层,直接对IP地址进⾏替换.代理服务器往往⼯作在应⽤层.
- 从使⽤范围上讲NAT⼀般在局域⽹的出⼝部署,代理服务器可以在局域⽹做,也可以在⼴域⽹做,也可以跨⽹.
- 从部署位置上看NAT⼀般集成在防⽕墙, 路由器等硬件设备上代理服务器则是⼀个软件程序,需要部署在服务器上.
代理服务器是⼀种应⽤⽐较⼴的技术.
- 翻墙: ⼴域⽹中的代理.
- 负载均衡: 局域⽹中的代理.
代理服务器⼜分为正向代理和反向代理.
代购例⼦
花王尿不湿是⼀个很经典的尿不湿品牌, 产⾃⽇本.
我⾃⼰去⽇本买尿不湿⽐较不⽅便, 但是可以让我在⽇本⼯作的表姐去超市买了快递给我. 此时超市看到的买家是我表姐, 我的表姐就是 "正向代理".
后来找我表姐买尿不湿的⼈太多了, 我表姐觉得天天去超市太⿇烦, ⼲脆去超市买了⼀⼤批尿不湿屯
在家⾥, 如果有⼈来找她代购, 就直接把屯在家⾥的货发出去, ⽽不必再去超市. 此时我表姐就是"反向代理".
正向代理⽤于请求的转发(例如借助代理绕过反爬⾍).
反向代理往往作为⼀个缓存.
三、内⽹穿透

四、内⽹打洞

五、DNS快速了解
5.1DNS背景
TCP/IP中使⽤IP地址和端⼝号来确定⽹络上的⼀台主机的⼀个程序.但是IP地址不⽅便记忆.于是⼈们发明了⼀种叫主机名的东西,是⼀个字符串,并且使⽤hosts⽂件来描述主机名和IP地址的关系.

最初, 通过互连⽹信息中⼼(SRI-NIC)来管理这个hosts⽂件的.
- 如果⼀个新计算机要接⼊⽹络, 或者某个计算机IP变更, 都需要到信息中⼼申请变更hosts⽂件.
- 其他计算机也需要定期下载更新新版本的hosts⽂件才能正确上⽹.
这样就太麻烦了,于是产⽣了DNS系统.
- ⼀个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系.
- 如果新计算机接⼊⽹络,将这个信息注册到数据库中.
- ⽤户输⼊域名的时候,会⾃动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址.
⾄今, 我们的计算机上仍然保留了hosts⽂件.在域名解析的过程中仍然会优先查找hosts⽂件的内容.
5.2域名简介
域名(Domain Name)是互联网中便于人们记忆和使用的网络名称,例如 example.com 和 www.example.com. 访问网站时,计算机通常通过DNS查询域名对应的IP地址,再连接提供服务的服务器.
可以把域名理解为联系人姓名,IP地址理解为电话号码,DNS理解为查询联系方式的系统.
1.为什么需要域名?
IP 地址方便计算机进行网络寻址,但不方便用户记忆.域名让人们可以通过有含义的名称访问服务,而不必记住一串数字.
同时,域名将服务名称与服务器地址分开管理.网站迁移、更换服务器后,可以调整域名的解析记录,用户仍然使用原来的域名访问.
text
服务器迁移前:www.example.com → 原服务器地址
服务器迁移后:www.example.com → 新服务器地址
用户使用的域名不变。
2.域名的组成与层级
域名由多个部分组成,各部分之间用英文句点 . 分隔.从右向左看,层级由高到低,名称逐渐具体.
以 www.example.com 为例:
text
. 根域
│
com 顶级域
│
example.com 二级域
│
www.example.com 三级域
| 层级 | 示例 | 含义 |
|---|---|---|
| 根域 | . |
域名树的起点,通常不在日常输入中显示 |
| 顶级域 | com |
根域下面的一级域 |
| 二级域 | example.com |
com 下面的域 |
| 三级域 | www.example.com |
example.com 下面的子域 |
包含根域结尾点的写法是:
text
www.example.com.
日常访问时,最后这个点通常省略.
"子域名"是相对概念。 例如,www.example.com、mail.example.com、api.example.com 都是 example.com 的子域名,可以分别用于网站、邮件和接口服务.
另外,www 不是域名必须包含的部分 .example.com 本身也可以配置为网站地址;它与 www.example.com 是不同名称,是否提供相同内容取决于配置.
3.常见的顶级域类型
| 类型 | 常见示例 | 说明 |
|---|---|---|
| 通用顶级域 | .com、.org、.net |
用于不同类型的网站和组织,不能仅凭后缀判断网站的实际用途 |
| 国家和地区代码顶级域 | .cn、.uk、.jp |
分别对应特定国家或地区 |
域名后缀并不能直接说明服务器部署在哪里,也不能证明网站是否可靠.
5.域名、IP 地址和 DNS 的关系
三者承担不同角色:
text
域名:用户使用的名称
↓
DNS:查询相关记录
↓
IP 地址:计算机建立网络通信时使用的地址
需要注意,域名与 IP 地址不是简单的一对一关系.
一个域名可以对应多个 IP 地址,例如由多台服务器提供服务;多个域名也可以对应同一个 IP 地址,例如同一台服务器承载多个网站.此外,DNS不只保存IP地址,还可以保存邮件服务器、别名等信息.
5.域名不等于网址
日常所说的"网址"通常指 URL(统一资源定位符),域名只是其中的一部分.
例如:
text
https://www.example.com/docs/index.html
└─┬─┘ └──────┬──────┘└──────┬───────┘
协议 域名 资源路径
| 部分 | 内容 | 作用 |
|---|---|---|
| 协议 | https |
指定访问方式 |
| 域名 | www.example.com |
标识要访问的主机或服务 |
| 路径 | /docs/index.html |
指定该服务中的资源 |
一句话总结:域名解决"名称怎么记",DNS解决"名称对应什么信息",IP地址用于网络寻址,而 URL 进一步说明如何访问某个具体资源.
5.3域名解析过程


如上图所示,域名结构是树状结构,树的最顶端代表根服务器,根的下⼀层就是由我们所熟知的.com、.net、.cn等通⽤域和.cn、.uk等国家域组成,称为顶级域.⽹上注册的域名基本都是⼆级域名,⽐如http://baidu.com、http://taobao.com等等⼆级域名,它们基本上是归企业和运维⼈员管理.接下来是三级或者四级域名,这⾥不多赘述.
5.4使⽤dig⼯具分析DNS过程
安装 dig ⼯具
bash
yum install bind-utils 1
之后就可以使⽤ dig 指令查看域名解析过程了.
bash
dig www.baidu.com
结果形如
bash
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41628
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 1057 IN CNAME www.a.shifen.com. www.a.shifen.com.
40 IN A 115.239.210.27
www.a.shifen.com. 40 IN A 115.239.211.112
;; Query time: 0 msec
;; SERVER: 100.100.2.136#53(100.100.2.136)
;; WHEN: Wed Sep 26 00:05:25 CST 2018
;; MSG SIZE rcvd: 90
结果解释
- 开头位置是 dig 指令的版本号
- 第⼆部分是服务器返回的详情,重要的是status参数,NOERROR表⽰查询成功.
- QUESTION SECTION 表示要查询的域名是什么.
- ANSWER SECTION 表示查询结果是什么.这个结果先将 www.baidu.com 查询成了
www.a.shifen.com,再将www.a.shifen.com查询成了两个ip地址. - 最下⾯是⼀些结果统计,包含查询时间和 DNS 服务器的地址等.
更多 dig 的使⽤⽅法, 参⻅https://www.imooc.com/article/26971?block_id=tuijian_wz
关于DNS缓存:
在Windows系统中,可以使⽤ ipconfig /displaydns 命令来查看系统级别的DNS缓存.
浏览器的缓存,⼤家可以⾃⾏搜索⼀下,看看能不能找到.
六、ICMP协议快速了解
ICMP协议是⼀个 ⽹络层协议,⼀个新搭建好的⽹络,往往需要先进⾏⼀个简单的测试,来验证⽹络是否畅通;但是IP协议并不提供可靠传输.如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因.
6.1ICMP功能
ICMP(Internet Control Message Protocol,互联网控制消息协议 )用于在 IP 网络中传递差错信息和网络诊断信息,帮助设备判断通信过程中发生了什么.
它常见的功能有:
-
检测目标是否可达
ping通常发送 ICMP 回显请求(Echo Request),再等待回显应答(Echo Reply),以观察目标是否响应以及往返时间. -
报告通信错误
例如,路由器发现无法到达目标网络时,可以返回"目标不可达"消息,帮助发送方定位问题.
-
辅助追踪网络路径
traceroute或tracert利用IP包生存时间(TTL)逐跳递减的机制,借助路由器返回的 ICMP"超时"消息,显示经过的节点. -
辅助路径 MTU 发现
当数据包过大、无法通过某段链路时,相关ICMP消息可以帮助发送方调整数据包大小.
例如,执行:
bash
ping 8.8.8.8
如果收到应答,说明当前设备通过该方式收到了目标的响应,并能看到大致的往返延迟.如果没有应答,也不能直接断定目标不可达:对方或中间网络可能禁止了ICMP回显.
ICMP 有IPv4使用的ICMP和IPv6使用的ICMPv6.ICMPv6除了差错报告与诊断,还承担邻居发现等IPv6网络的重要功能.

6.2ICMP的报⽂格式
ICMP报文封装在IP数据包的数据部分.不同类型的 ICMP 报文格式有所不同,但都有一个共同的开头:
text
0 8 16 31
+-------------------+-------------------+-----------------------------------+
| 类型 Type | 代码 Code | 校验和 Checksum |
+-------------------+-------------------+-----------------------------------+
| |
| 报文其余内容:由 Type 和 Code 决定 |
| |
+---------------------------------------------------------------------------+
| 字段 | 长度 | 作用 |
|---|---|---|
| Type(类型) | 8 位 | 表示报文的主要类别,如回显请求、目标不可达 |
| Code(代码) | 8 位 | 进一步说明该类型下的具体情况 |
| Checksum(校验和) | 16 位 | 用于检测报文传输过程中是否出错 |
| 其余内容 | 可变 | 随报文类型变化,可能包含标识符、序号或触发错误的原始数据包内容 |
以 ICMPv4 的 Ping 回显请求和应答为例,其格式是:
text
0 8 16 31
+-------------------+-------------------+-----------------------------------+
| Type | Code = 0 | Checksum |
+-------------------+-------------------+-----------------------------------+
| 标识符 Identifier | 序号 Sequence |
+---------------------------------------+-----------------------------------+
| |
| 数据 Data(可变长度) |
| |
+---------------------------------------------------------------------------+
- Type :回显请求为
8,回显应答为0. - Identifier:帮助发送方区分不同的Ping会话.
- Sequence:帮助发送方区分同一会话中的不同请求.
- Data:请求中携带的数据;应答通常会将这些数据带回.
而对于差错报告报文,后续内容一般包含触发错误的原始IP数据包的一部分,方便发送方识别是哪次发送出现了问题.
以上 Ping 的类型编号针对 ICMPv4 .ICMPv6 的共同开头同样包含 Type、Code 和 Checksum,但回显请求和应答的类型编号分别是 128 和 129.
6.3ping命令
ping 是一个网络诊断命令,通常通过发送 ICMP 回显请求并等待回显应答,检查目标是否响应,并测量数据包的往返时间.
基本用法:
bash
ping 目标地址或域名
例如:
bash
ping 8.8.8.8
或:
bash
ping www.example.com
不同系统的默认行为有所区别:
- Windows :默认发送4次;使用
ping -n 4 8.8.8.8指定发送 4 次. - macOS / Linux :通常持续发送,按
Ctrl + C停止;使用ping -c 4 8.8.8.8指定发送4次.
输出中常见的信息有:
- time:请求和应答的往返时间,通常以毫秒(ms)表示.
- TTL:收到的数据包剩余的生存时间,可辅助排查网络路径.
- packet loss:丢包率,即发送的请求中没有收到应答的比例.
例如,time=20 ms 表示这一次请求和应答的往返时间约为20毫秒.没有收到应答不一定表示目标无法访问:目标设备或防火墙也可能禁止ICMP回显.

注意:此处 ping 的是域名,⽽不是url! ⼀个域名可以通过DNS解析成IP地址.
• ping命令不光能验证⽹络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live,⽣存周期).
• ping命令会先发送⼀个 ICMP Echo Request给对端.
• 对端接收到之后,会返回⼀个ICMP Echo Reply.

6.4traceroute命令
traceroute 是网络诊断命令,用于查看数据包从本机到目标地址大致经过哪些路由节点,并测量到各节点的往返时间.
在 macOS 或 Linux 上:
bash
traceroute www.example.com
在 Windows 上,对应命令是:
cmd
tracert www.example.com
它的工作原理是逐步增大 IP 数据包的 TTL(生存时间).当 TTL 在某个路由器处减至零时,路由器通常会返回 ICMP"超时"报文;通过重复探测,命令便能逐跳显示路径.
例如:
text
1 192.168.1.1 1.2 ms 1.0 ms 1.1 ms
2 10.0.0.1 5.4 ms 5.1 ms 5.3 ms
3 * * *
4 203.0.113.10 20.1 ms 19.8 ms 20.3 ms
- 每行代表一跳,后面的时间通常是多次探测的往返时间.
*表示该次探测在等待时间内没有收到应答,可能是路由器不回复或限制了 ICMP 报文,不一定代表网络中断.- 不同系统或选项可能使用 UDP、ICMP 或 TCP 发送探测包;中间路由器通常通过ICMP超时报文回应.
如果目标能够正常访问,但中间某一跳显示 *,通常说明该节点没有回应探测,并不影响后续节点转发数据.

七、⼿动部署并测试内⽹穿透

我们做两个测试
(1)ssh远程登录(2)nginx远程访问
bash
sudo yum install nginx # centos 安装
sudo apt install nginx # ubuntu 安装
#启动
$ nginx
#暂停
# nginx -s stop
frpc.toml : 客⼾端配置样例
bash
#配置公⽹服务器上frp服务的IP与端⼝
serverAddr = "x.x.x.x"
serverPort = 8888
[[proxies]]
name = "ssh-serivce" #名称
type = "tcp" #代理类型
localIP = "127.0.0.1" #本地IP
localPort = 22 #内⽹服务监听的端⼝
remotePort = 8081 #需要在公⽹服务器上监听的端⼝,
#其他⼈未来可以通过这个端⼝访问我们的本地的22号服务
#也就是说8081端⼝会映射到22号端⼝
服务器端配置⽂件也可以进⾏复杂配置,但是我们追求简单,服务器只需要配置bind端⼝号就可以服务器和客户端都可以这样在后台启动.
&> /dev/null :这是重定向操作,⽤于将命令的标准输出(stdout)和标准错误(stderr)都重定向到 /dev/null ./dev/null是⼀个特殊的设备⽂件,向它写⼊的内容都会被丢弃,读取它则会⽴即返回⽂件结束.因此,这个操作的作⽤是忽略命令的所有输出信息.

🚀真正的勇者不是流泪的人,而是含泪奔跑的人!
敬请期待下一篇文章内容
每日心灵鸡汤: 只要还有机会,就别放弃自己!
当你发现还有书可以读,有试可以考,从某种程度上来讲就一直幸福.说明你还有机会,有机会改变自己,有机会改变命运.请你一定,一而再,再而三地救自己于水火之中,哪怕千难万难,也要敢于全力以赴,敢于去拼命,调整自己,约束自己,成长自己.
