本文围绕计算机网络中NAT、代理服务器、内网穿透三大技术展开从底层原理到手动部署逐步拆解。一、引言IPv4协议使用32位地址理论上最多支持约43亿个IP。但随着互联网设备爆炸式增长公网IP地址早已入不敷出。为解决这一问题业界提出了多种方案其中最主流、部署最广泛的就是NAT网络地址转换。NAT并非孤立存在——它与代理服务器、内网穿透等技术共同构成了现代网络通信的基础设施层。本文将依次梳理这些技术的工作机制并通过frp实战演示内网穿透的完整部署流程。二、NAT2.1 背景NAT是当前解决IP地址不足的主要手段也是路由器的核心功能之一。其基本思路是在局域网内部使用私有IP在路由器或出口服务器上配置少量全局IP通过地址转换实现内网与外网的通信。私有IP的特点无需全局唯一不同局域网中可以出现相同的私有IP常见私有地址段10.0.0.0/8、172.16.0.0/12、192.168.0.0/16无法直接在公网上路由必须经过NAT转换学校、家庭等采用这种架构每个终端分配私有IP路由器持有一个或多个公网IP。2.2 地址转换NAT的核心操作是替换IP首部中的源地址和目标地址。以上图为例转换流程如下内网主机 10.0.0.10 向外部服务器 163.221.120.9 发送数据包源IP为 10.0.0.10NAT路由器收到数据包后将源地址替换为全局IP 202.244.174.37再转发到互联网外部服务器返回数据时目标IP为 202.244.174.37NAT路由器收到返回数据将目标IP替换回 10.0.0.10转发给内网主机NAT路由器内部维护一张自动生成的地址转换表当 10.0.0.10 首次向外部发送数据时表中就会生成对应的映射关系。2.3 NAPT基础NAT存在一个明显问题如果局域网内多台主机同时访问同一台外部服务器服务器返回的数据包目标IP都是同一个公网IPNAT路由器如何判断该转发给哪台内网主机答案是NAPT——使用IP 端口号建立关联关系。从转换表可以看出内网地址:端口外部目标转换后地址:端口10.0.0.10:1025163.221.120.9:80202.244.174.37:102510.0.0.11:1025163.221.120.9:80202.244.174.37:1026两台内网主机即使使用相同的源端口 1025NAPT也会为它们分配不同的公网端口从而区分不同的会话。这张映射表由NAT路由器自动维护TCP建立连接时生成表项断开连接后删除表项。日常所说的NAT绝大多数场景实际上指的是NAPT。2.4 NAT技术的缺陷NAT虽然解决了地址不足的问题但也带来了一些限制无法从外部主动建立连接NAT 内部的服务器无法被公网客户端直接访问转换表开销NAT 路由器需要维护地址映射表表项的生成与销毁会消耗额外的计算和内存资源单点故障风险通信过程中若 NAT 设备发生故障即使有热备设备接管所有已建立的 TCP 连接也会中断三、代理服务器代理服务器与NAT在表象上有些相似客户端向代理发请求代理转发给真正的服务器服务器返回结果后代理再回传给客户端。3.1 正向代理正向代理位于客户端和目标服务器之间代表客户端向目标服务器发送请求。1工作流程客户端将请求发送给正向代理服务器代理服务器根据配置处理请求代理将处理后的请求转发给目标服务器目标服务器返回响应给代理代理将响应返回给客户端2功能功能说明缓存加速缓存常用资源重复请求直接从缓存返回内容过滤屏蔽广告、阻止恶意网站访问控制限制特定网站的访问时段或权限隐藏身份对外只暴露代理服务器IP保护客户端隐私突破限制借助代理访问受地域限制的资源3应用场景企业网络管理、公共WiFi环境、跨境访问、游戏加速器等3.2 反向代理反向代理服务器位于客户端和Web服务器之间代表服务器接收客户端请求。客户端并不知道实际与哪台后端服务器交互只知道与反向代理通信。应用场景负载均衡根据策略将请求分发到多台后端服务器提升并发处理能力安全防护隐藏后端服务器真实IP降低被直接攻击的风险缓存加速缓存后端响应内容减少后端服务器负载动静分离静态资源由反向代理直接返回动态请求转发给后端内容重写添加/删除请求头、URL重写、用户认证等CDN内容分发网络本质上就是反向代理原理的大规模应用。3.3 NAT与代理服务器的区别对比维度NAT代理服务器工作层次网络层直接替换IP地址应用层理解并转发应用协议解决问题IP地址不足更贴近具体应用加速、安全、控制部署位置通常集成在路由器、防火墙等硬件软件程序部署在服务器上使用范围一般在局域网出口部署局域网、广域网、跨网均可典型代表家用路由器Nginx、Squid、游戏加速器用生活例子来解释托在日本工作的表姐去超市买花王尿不湿再寄回来——超市看到的买家是表姐表姐就是正向代理。后来找表姐代购的人太多表姐干脆囤了一批货在家有人要就直接发——此时表姐充当了反向代理带缓存功能。正向代理侧重请求转发反向代理常作为缓存和负载均衡入口。四、内网穿透4.1 需求前面提到NAT的缺陷之一是无法从外部主动建立连接。这意味着家里的电脑、公司的开发服务器虽然能主动访问外网但外网设备无法主动访问它们。内网穿透又称内网打洞就是为了解决这个问题——让公网用户能够访问位于NAT后面的内网服务。1原理在内网主机和一台具有公网IP的服务器之间建立一条持久的TCP连接外部请求先到达公网服务器再通过这条隧道转发到内网主机。2过程步骤1内网主机上运行frp客户端将本地SSH的22端口映射到公网服务器frps的8888端口建立NAT映射步骤2外部用户直接访问云服务器的8888端口流量通过隧道转发到家里Linux机器的22端口公网服务器起到中转桥梁的作用它必须拥有可被直接访问的公网IP。4.2 frpfrp是一款开源的内网穿透工具支持TCP、UDP、HTTP、HTTPS等多种协议。下面以frp v0.58.1为例演示完整的部署流程。4.2.1 下载与安装远程穿透下载地址_frp下载地址-CSDN博客注意选择与系统架构匹配的版本如果GitHub下载速度慢可以借助Watt Toolkit等工具加速。下载后解压tar -zxvf frp_0.58.1_linux_amd64.tar.gz cd frp_0.58.1_linux_amd64解压后目录中包含两个程序frpsfrp服务端部署在公网服务器上frpcfrp客户端部署在内网主机上4.2.2 服务端配置公网服务器上的配置追求简洁只需指定监听端口即可。创建frps.toml# frps.toml - 公网服务器端配置 bindPort 8888bindPort是frps监听的端口用于接收frpc的连接请求。4.2.3 客户端配置内网主机上创建 frpc.toml# frpc.toml - 内网客户端配置 # 公网服务器上frp服务的IP与端口 serverAddr x.x.x.x # 替换为你的公网服务器IP serverPort 8888 [[proxies]] name ssh-service # 代理名称自定义 type tcp # 代理类型 localIP 127.0.0.1 # 本地服务IP localPort 22 # 内网服务监听的端口SSH默认22 remotePort 8081 # 公网服务器上监听的端口配置含义公网服务器的 8081 端口会被映射到内网主机的 22 端口。4.2.4 启动服务服务端和客户端都可以使用nohup在后台启动# 公网服务器启动frps nohup ./frps -c ./frps.toml /dev/null # 内网主机启动frpc nohup ./frpc -c ./frpc.toml /dev/null 命令说明nohup忽略挂断信号使进程在终端关闭后继续运行 /dev/null将标准输出和标准错误都重定向到/dev/null放入后台运行4.2.5 SSH远程登录测试在任意一台能上网的机器上通过公网服务器的8081端口连接内网SSHssh -p 8081 用户名公网服务器IP如果连接成功说明内网穿透隧道已正常工作。4.2.6 Nginx远程访问测试除了SSH还可以穿透Web服务。先在内网主机上安装Nginx# CentOS安装 sudo yum install nginx # Ubuntu安装 sudo apt install nginx # 启动 nginx # 停止 # nginx -s stopapt安装的Nginx默认首页路径为/var/www/html/默认首页文件为index.nginx-debian.html。在frpc.toml中追加一个代理配置[[proxies]] name nginx-service type tcp localIP 127.0.0.1 localPort 80 remotePort 8082重启frpc后在浏览器访问http://公网服务器IP:8082即可看到内网Nginx的默认页面。