Linux网络学习【从NAT与代理服务理解网络转发、探索内网穿透原理、再到认识DNS与ICMP、最后动手部署并测试内网穿透】


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

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

参考:RFC 1631、RFC 3022.

3.NAT 的基本工作原理

NAT通常部署在私有网络与公网之间的边界设备上,例如路由器、防火墙或运营商网关.

以最常见的 NAPT(网络地址端口转换)为例:

  1. 内网主机 192.168.1.10:51520 发起访问请求.
  2. NAT 网关将其源地址及端口转换为 203.0.113.5:40001.
  3. NAT 网关记录转换映射关系,并将数据包转发至互联网.
  4. 外部服务器返回响应时,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

结果解释

  1. 开头位置是 dig 指令的版本号
  2. 第⼆部分是服务器返回的详情,重要的是status参数,NOERROR表⽰查询成功.
  3. QUESTION SECTION 表示要查询的域名是什么.
  4. ANSWER SECTION 表示查询结果是什么.这个结果先将 www.baidu.com 查询成了
    www.a.shifen.com,再将www.a.shifen.com查询成了两个ip地址.
  5. 最下⾯是⼀些结果统计,包含查询时间和 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 网络中传递差错信息和网络诊断信息,帮助设备判断通信过程中发生了什么.

它常见的功能有:

  1. 检测目标是否可达

    ping 通常发送 ICMP 回显请求(Echo Request),再等待回显应答(Echo Reply),以观察目标是否响应以及往返时间.

  2. 报告通信错误

    例如,路由器发现无法到达目标网络时,可以返回"目标不可达"消息,帮助发送方定位问题.

  3. 辅助追踪网络路径

    traceroute 或 tracert 利用IP包生存时间(TTL)逐跳递减的机制,借助路由器返回的 ICMP"超时"消息,显示经过的节点.

  4. 辅助路径 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超时报文回应.

如果目标能够正常访问,但中间某一跳显示 *,通常说明该节点没有回应探测,并不影响后续节点转发数据.


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

frp下载

我们做两个测试

(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是⼀个特殊的设备⽂件,向它写⼊的内容都会被丢弃,读取它则会⽴即返回⽂件结束.因此,这个操作的作⽤是忽略命令的所有输出信息.

🚀真正的勇者不是流泪的人,而是含泪奔跑的人!


敬请期待下一篇文章内容


每日心灵鸡汤: 只要还有机会,就别放弃自己!

当你发现还有书可以读,有试可以考,从某种程度上来讲就一直幸福.说明你还有机会,有机会改变自己,有机会改变命运.请你一定,一而再,再而三地救自己于水火之中,哪怕千难万难,也要敢于全力以赴,敢于去拼命,调整自己,约束自己,成长自己.

相关推荐
最强小杰1 小时前
minimax-m3 突然报 HTTP 529 怎么办?连续重试为何更难恢复,退避时间该怎么算?
网络·网络协议·http·ai
重生之小比特1 小时前
【Linux系统】17 库制作与原理(下)
linux·运维·服务器
weixin_450907281 小时前
[ZYNQ Linux] VCU使用
linux·zynq
程序员清风1 小时前
AI 编程助手的权限边界:文件、命令、密钥与人工确认
运维·服务器·网络
wacsii1 小时前
【Linux进程(二)】深入 Linux 内核:进程状态切换与底层数据结构的秘密
linux·服务器
R&L_201810012 小时前
LINUX CPU 热点分析
linux
栉甜2 小时前
Vue2学习内容(上)
前端·javascript·vue.js·学习
别讲概念2 小时前
JavaEE(5)网络原理初识
网络·java-ee·智能路由器
shangjian0072 小时前
K8S学习-基础组件
学习·容器·kubernetes