网络编程—NAT、代理服务与内网穿透
本文围绕计算机网络中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的默认页面。

相关新闻

Java 修饰符终极指南:从 public 到 volatile,一文掌握 12 种修饰符的底层原理

Java 修饰符终极指南:从 public 到 volatile,一文掌握 12 种修饰符的底层原理

面试官:Java 修饰符有几个?我答出 7 个后,他追问了 volatile 和 transient 从访问权限到 JVM 指令,从内存可见性到序列化,这篇带你彻底吃透 Java 修饰符我们之前聊过 数据类型(值长什么样)和 变…

2026/10/25 13:59:17 阅读更多 →
头歌实践教学平台:Spark大数据编程(二十六~三十)

头歌实践教学平台:Spark大数据编程(二十六~三十)

二十六、Spark 的设计与运行原理任务描述 本关任务:根据相关知识内容完成右侧习题。相关知识 为了完成本关任务,你需要掌握:Spark 基本概念 Spark 运行架构 Spark 运行流程 Spark 计算框架优势二十七、Scala Option任务描述 本关任务&#xf…

2026/10/25 11:56:11 阅读更多 →
深入掌握seq命令:从数字序列生成到Linux运维实战应用

深入掌握seq命令:从数字序列生成到Linux运维实战应用

1. 从“seq”说起:一个被低估的文本生成利器如果你在Linux或macOS的命令行里待过一段时间,大概率见过或用过seq这个命令。它的名字是“sequence”(序列)的缩写,功能也如其名——生成一个数字序列。乍一看,这…

2026/10/24 22:29:49 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/25 22:36:10 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/26 3:16:46 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →