NAT、代理服务与内网穿透详解
NAT、代理服务与内网穿透详解从地址转换到公网访问内网服务摘要IPv4 地址数量有限私有地址、NAT、代理服务和内网穿透都是围绕“不同网络之间如何通信”衍生出来的关键技术。本文从 NAT 和 NAPT 的转换过程讲起对比正向代理、反向代理与 NAT 的差异再解释为什么外网通常无法直接访问内网服务以及内网穿透的基本思路。前言很多人在家里或公司写网络程序时都会遇到一个现象局域网内能访问换到外网就访问不了。这背后通常和私有 IP、NAT、路由器出口地址有关。NAT 让大量内网设备能够共享公网出口访问互联网但它也带来了一个副作用外部网络很难主动连接到内网机器。代理服务和内网穿透又是在这个背景下经常出现的概念。它们看起来都像“中间转发”但工作层次、解决的问题和部署方式并不一样。一、为什么需要 NATIPv4 地址是 32 位地址总量有限。为了让更多设备接入网络很多家庭、学校、公司内部都会使用私有 IP 地址例如10.0.0.10 192.168.1.100 172.16.1.20私有 IP 只需要在当前局域网内不冲突不要求全网唯一。公网 IP 则必须在互联网范围内唯一。NAT 的核心作用是让内网私有 IP 在对外通信时转换成公网 IP。内网主机 10.0.0.10NAT 路由器公网服务器 163.221.120.9从公网服务器看请求并不是来自10.0.0.10而是来自 NAT 路由器的公网地址。二、NAT 的地址转换过程假设内网主机10.0.0.10访问外网服务器163.221.120.9NAT 路由器的公网地址是202.244.174.37。出站时源 IP: 10.0.0.10 - 202.244.174.37 目的 IP: 163.221.120.9 - 163.221.120.9入站响应回来时源 IP: 163.221.120.9 - 163.221.120.9 目的 IP: 202.244.174.37 - 10.0.0.10NAT 路由器内部会维护一张转换表。第一次从10.0.0.10发起对外通信时路由器会记录这条映射关系后续响应回来时再根据映射把目标地址改回内网主机地址。可以把它理解成阶段NAT 做的事情内网访问外网把源私有 IP 改成公网出口 IP外网响应回来根据转换表把目的公网 IP 改回内网 IP通信结束删除对应转换关系三、NAPT为什么还要带端口只有 IP 地址转换还不够。考虑一个更常见的情况10.0.0.10 访问 163.221.120.9:80 10.0.0.11 也访问 163.221.120.9:80外网服务器返回数据时目的 IP 都是 NAT 路由器的公网 IP。路由器怎么知道应该转给10.0.0.10还是转给10.0.0.11这就需要 NAPT。NAPT 使用IP port建立映射关系。示例转换表内网连接转换后的公网连接目标服务10.0.0.10:1025202.244.174.37:1025163.221.120.9:8010.0.0.11:1025202.244.174.37:1026163.221.120.9:80可以看到即使两个内网主机使用了相同源端口NAT 路由器也可以在公网侧改成不同端口从而区分不同连接。在 TCP 场景中连接建立时会生成映射表项连接断开后会删除表项。这些关系由 NAT 设备自动维护。四、NAT 的限制NAT 解决了 IPv4 地址不足问题但它也带来一些限制。限制说明外部难以主动访问内部服务映射表通常由内网主动访问外网时生成转换表有维护成本表项创建、查询、销毁都需要开销NAT 设备成为关键节点设备异常可能导致已有连接全部中断端到端连接语义被改变原始源地址在出口处被替换很多“内网服务无法被公网访问”的问题本质上就来自第一条没有映射关系时外部请求到达 NAT 设备NAT 不知道应该转给哪台内网主机。五、代理服务是什么代理服务器也位于客户端和目标服务器之间也会转发请求和响应所以它看起来和 NAT 有点像。但二者关注点不同对比项NAT代理服务器主要目标缓解 IP 地址不足完成地址转换代表一方发起或接收应用请求常见层次网络层附近改 IP/端口更贴近应用层理解具体协议部署位置路由器、防火墙等出口设备独立服务器或软件服务典型用途内网共享公网出口访问控制、缓存、负载均衡、安全隔离NAT 更像网络基础能力代理更像应用转发能力。六、正向代理代理客户端访问目标服务器正向代理位于客户端和目标服务器之间代表客户端向目标服务器发请求。客户端正向代理目标服务器工作流程客户端把请求发送给正向代理正向代理根据配置处理请求例如缓存、过滤、访问控制正向代理把请求转发给目标服务器目标服务器把响应返回给正向代理正向代理再把响应返回给客户端。常见能力能力说明缓存常访问内容可以直接从代理返回内容过滤根据规则过滤请求或响应访问控制限制特定客户端访问特定网站隐藏客户端身份目标服务器看到的是代理地址访问管理企业或公共网络中控制出口访问正向代理的核心视角是服务器不知道真正的客户端是谁客户端知道自己在使用代理。七、反向代理代理后端服务器接收请求反向代理通常部署在 Web 服务前面。客户端访问的是反向代理反向代理再根据规则把请求转发给后端服务器。客户端反向代理后端服务器 A后端服务器 B后端服务器 C在这个过程中客户端只知道反向代理地址并不知道后端真实服务器是谁。反向代理常见用途用途说明负载均衡把请求分发到多个后端服务器安全保护隐藏后端真实地址统一做安全策略缓存加速重复内容可以直接从代理返回内容过滤和重写修改请求头、路径或响应内容动静分离静态资源直接由代理层返回CDN内容分发网络常采用反向代理思想反向代理的核心视角是客户端不知道真正的后端是谁后端服务知道前面有代理层。八、正向代理和反向代理怎么区分很多初学者容易把二者混在一起。可以用一句话区分正向代理代理客户端反向代理代理服务器。对比项正向代理反向代理代理对象客户端服务端客户端是否感知代理通常知道通常只访问代理入口目标服务器看到谁看到代理看到反向代理转来的请求常见用途访问控制、缓存、隐藏客户端负载均衡、安全隔离、缓存、动静分离更通俗地说正向代理像“我不方便直接去买东西让别人替我去买”。商家看到的是代买的人。反向代理像“店家把货提前放到一个统一窗口顾客只找窗口拿货”。顾客不需要知道后面有几个仓库。九、内网穿透解决什么问题NAT 的一个典型限制是外网无法直接访问内网服务。比如你在家里的机器上启动了一个 Web 服务192.168.1.20:8080局域网内其他设备能访问但公网用户无法直接访问这个私有地址。内网穿透要解决的就是让公网用户可以访问内网中的某个服务。常见思路是引入一个公网中转节点公网用户公网中转节点内网穿透客户端内网服务 192.168.1.20:8080关键点在于内网机器主动连接公网中转节点。因为这个连接是从内网主动发起的所以可以穿过 NAT 建立出去。之后公网用户访问中转节点中转节点再通过已经建立的连接把请求转发回内网服务。十、内网打洞的基本理解内网打洞可以理解为让通信双方借助公网节点交换必要信息尝试建立可用的通信路径。它通常需要解决几个问题内网主机没有公网地址NAT 会维护映射表外部请求如果没有对应映射通常无法直接进入需要借助公网节点让内网侧先建立可用通道。在实际使用中内网穿透可能采用中转模式也可能尝试打洞直连。能不能直连取决于 NAT 类型、网络环境和具体实现。对开发者来说最重要的是先理解公网访问内网服务本质上需要一条公网可达的入口以及一条能回到内网服务的转发通道。十一、NAT、代理和内网穿透的关系这三个概念都涉及“中间节点”但目的不同。技术主要解决的问题典型位置NAT/NAPT多台内网主机共享公网出口路由器、防火墙正向代理客户端借代理访问目标服务器客户端侧或出口侧反向代理后端服务通过统一入口对外提供能力服务端入口内网穿透让公网访问内网服务公网中转节点 内网客户端如果用一句话串起来NAT 让内网访问外网更容易代理让请求转发更可控内网穿透让外网访问内网成为可能。十二、常见问题与易错点1. 认为 NAT 只改 IP 不改端口普通地址转换只解释了一部分场景。多个内网主机共享同一个公网地址时通常还需要端口参与映射这就是 NAPT。2. 认为有 NAT 就能从公网访问内网服务默认情况下NAT 映射多由内网主动连接生成。外部主动访问内网服务时如果没有端口映射、穿透通道或其他配置通常无法成功。3. 把 NAT 和代理服务器混为一谈NAT 主要工作在网络转发层面改地址和端口代理服务器更接近应用层理解请求内容能做缓存、过滤、负载均衡等动作。4. 分不清正向代理和反向代理看代理的是谁代理客户端就是正向代理代理服务端就是反向代理。5. 以为内网穿透一定是直连内网穿透不一定意味着双方直接通信。很多实现会通过公网节点中转是否能打洞直连取决于网络环境。总结NAT 是 IPv4 地址不足背景下的重要技术它通过地址转换让大量私有地址设备共享公网出口。NAPT 进一步使用 IP 和端口建立映射解决多台内网主机同时访问同一外部服务的问题。代理服务和 NAT 都有“中转”味道但代理更贴近应用层。正向代理代表客户端访问目标服务器反向代理代表后端服务器接收客户端请求。内网穿透则是在 NAT 限制下为公网访问内网服务建立可用入口和转发通道。