【网络层协议】NAT技术内网穿透
IP地址数量限制
我们知道,IP地址(IPv4)是一个4字节32位的整数,那么一共只有2^32也就是接近43亿个IP地址,而TCP/IP协议栈规定,每台主机只能有一个IP地址,这就意味着,一共只有不到43亿台主机能接入互联网吗?
实际上,由于一些特殊的IP地址(主机号全0代表网络号,主机号全1代表广播地址,127.*用于本地环回测试)的存在,IP地址实际数量要比这个数更小一些,并且IP地址并不是按主机台数分配的,每张网卡都需要配置一个或多个IP地址,这就导致了一个很尴尬的问题:IP地址不够用了!这时候有三种方式来解决:
- 动态分配IP地址:只给接入网络的设备分配IP地址,因此即使同一MAC地址的设备,每次接入网络分配到的IP地址也不一定是相同的。
- NAT(Net Address Transimision):也就是网络地址转换,这是我们今天要重点学习的。
- IPv6:这并不是IPv4的简单升级,两者是互不兼容的协议,用16字节128位的整数表示一个IP地址,理论上能够给沙漠中的每一粒沙子都分配一个IP地址,但目前尚未普及。
私有IP与公网IP
如果一个组织内部组建局域网,IP地址只用于局域网内通信,而不连接互联网,那么理论上可以使用任意的IP地址,但如果想要接入Internet,就必须遵守RFC 1918对于组建局域网的私有IP地址的限制:
- 10.*:前8位是网络号,共16,777,216个地址(大家在学校的时候,IP地址应该都是10开头的)
- 172.16.*到172.31.*:前12位是网络号,共1,048,576个地址
- 192.168.*:前16位是网络号,共65,536个地址(大家在家里的时候,IP地址应该都是192.168开头的)
- 包含在以上范围的,都成为私有IP,其余的则是公网IP
大家可能觉得奇怪,不是要讲解决IPv4地址数量不足的问题吗,怎么扯到了私有IP和公网IP了,事实上,这是NAT技术能解决地址数量不足的一个很关键的要素:如果私有IP地址只在局域网内使用,那么不同局域网就可以出现重复的私有IP了,那么可用的IP数量就大大增加了!
那么问题来了,局域网中的主机怎么和公网进行通信呢?所以NAT技术实际上做的就是:在子网内的主机需要与外网进行通信时,路由器将IP报文首部的IP地址进行替换,经过一次次路由,最终数据包中的源IP地址成为一个公网IP,可以在公网中访问目标公网IP了。
NAT技术
前面提到了路由器将IP报文首部的IP地址替换,那么这个替换过程长啥样呢?让我们接着往下学,首先了解一下关于路由器的一些相关知识:
- 一个路由器可以配置至少两个IP地址,一个WAN口(广域网接口)IP,一个或一个以上的LAN口(局域网接口)IP。
- 路由器LAN口连接的主机都从属于这个路由器的某个子网中。
- 子网内的主机IP地址不能重复,但不同路由器的子网间可以出现重复的IP地址。
- 每个家用路由器实际上又作为运营商路由器子网中的一个节点,并且这样的运营商路由器可能有很多级,最外层的出入口运营商路由器的WAN口IP就是一个公网IP了。
现在再回过头表述一下什么是NAT技术:子网主机需要和外网通信时,家路由器将IP报头首部的源IP地址替换为自己的WAN口IP,这样主机替换,最终数据包中的源IP地址称为一个公网IP。
所以现在我们也就大概能够理解为什么我们的宽带欠费后,运营商可以让我们上不了网了,因为我们的每台主机其实都是在内网中,要想访问公网,那就必须先通过NAT转化为公网IP,而运营商路由器识别出欠费,直接不帮我们进行NAT,也就自然断网了。
通过前面的学习,我们解决了一个问题:局域网内的主机如何向公网的服务器发送请求。但是还有一个很重要的问题:服务器要怎么把响应返回给服务器呢?
按照我们前面的说法,局域网中有那么多的内网主机发送到服务器的请求的IP都是相同的(出入口运营商服务器的WAN口IP),服务器返回请求的目的IP都是运营商出入口NAT路由器,那NAT路由器怎么判定要把数据包交给哪个局域网的主机呢?
这个时候NAPT(网络地址端口转换)闪亮登场了,NAT路由器在进行源IP替换时,会将报文的源IP+port与自己替换的WAN口IP+port的映射关系存到一张转化表里,这很重要,因为:内网IP在局域网中唯一,port在主机上唯一;公网IP在公网中唯一,port在路由器上唯一。两个唯一值存在一张表里,就意味着两者互为键值!建立起这张转换表后,公网就可以访问到内网了!
(这个关联表是由NAT服务器自动维护的,对于TCP,在建立连接时生成表项,断开连接后删除表项)
内网穿透
在学习了NAT技术后,我们就可以开始学习内网穿透了。首先,什么是内网穿透?其实内网穿透就是:一台局域网中的主机,通过一个在公网的主机,访问另一个局域网中的主机。
那么内网穿透的原理是什么呢?其实我们学习了NAT和NAPT后,就非常容易理解了:

当客户机与服务器建立好转换表后,只要服务器1能够给服务器2提供这样的服务:服务器2发来的某个端口的数据全部转发到客户机,就可以实现让服务器2通过公网访问客户机了。
内网穿透的价值在于,可以通过它实现远程办公/跨区域、部门的协作。那么为了更好地理解内网穿透的过程,接下来我们一起来做一个实验!部署实现一下内网穿透~
部署与测试内网穿透
首先,说一下我的实验环境:
- 客户机:Ubuntu 20.04虚拟机(VMware设置为NAT模式)
- 服务器1:阿里云服务器(因为我们需要公网IP)
- 服务器2:Windows上的xterminal(SSH客户端软件)
- 转发功能:通过frp实现的,因为它用起来很简单
frp下载:下载的是linux amd64
Release v0.58.1 · fatedier/frp
https://github.com/fatedier/frp/releases/tag/v0.58.1 简单讲讲实验步骤:
- 在客户机上部署、安装、配置frpc(frp的客户端),然后把本地ssh 22号端口映射到frps的xxx端口(如6000)
- 在云服务器1上部署配置frps(frp的服务器),设置让xxx端口(如7000)与客户机上的frpc进行通信
- 服务器2此时通过云服务器1的7000端口就能访问到客户机的ssh服务了!
我们下载好这个压缩包之后,解压就能得到:
![]()
其中frps和frpc分别是frp的服务器和客户端,而.toml文件则是对服务器/客户端的配置信息。
frpc.toml:

- serverAddr和serverPort分别是frps的IP和port
- localPort和remotePort表示将本机的22号端口(ssh专用)映射到frps主机的6000号端口(也可以自己设置)——其实就是frps服务器会将6000号端口收到的请求都转发到frpc的22号端口,收到应答后再转发回给请求方。
frps.toml:

- frps上的配置信息比较简单,只要设置好要与frpc进行通信的端口即可
启动frps:

启动frpc:
值得一提的是,我们直接运行frpc并不会使用.toml文件中的配置,必须加-c选项显式指定。

此时我们可以发现frps这边显示连接成功了(我还配置了nginx,不过步骤类似,所以只和大家说ssh的操作):

接下来我们通过Xterminal来访问云服务器的6000端口,如果和我们设想一样的话,应该就能ssh登录客户机:

可以看到,XTerminal启动后,直接就是在客户机的~下:

我们在这下面新建一个文件,可以看到确实多了个文本文件:

ok,本篇文章到这里也接近尾声了,最后再给大家梳理下流程:服务器1是一台云服务器,有自己的公网IP,服务器2是windows机器用的是内网IP,而客户机是虚拟机用的也是内网IP。frp为我们做的事情是:启动frps(服务器)后,启动frpc(客户端)与frps连接,此时由于内网主机主动通过NAT技术与公网主机建立了连接,那么通过NAPT技术我们就可以实现公网主机访问内网主机了,并且frps会把发到6000号端口的数据都转发到frpc的22号端口,接下来另一台内网主机(ssh客户端)就可以通过访问云服务器的6000号端口来ssh登录客户机了!
相关文章:
【网络层协议】NAT技术内网穿透
IP地址数量限制 我们知道,IP地址(IPv4)是一个4字节32位的整数,那么一共只有2^32也就是接近43亿个IP地址,而TCP/IP协议栈规定,每台主机只能有一个IP地址,这就意味着,一共只有不到43亿…...
SQL中的索引是什么
在 SQL 中,索引(Index) 是一种用于加速数据检索的数据库对象,通过建立特定的数据结构(如 B树、哈希表等),帮助数据库系统快速定位目标数据。以下是关于索引的详细分类、工作原理、使用场景和最佳…...
TensorFlow面试题及参考答案
目录 什么是 TensorFlow 的计算图?详细描述 TensorFlow 计算图的组成结构(节点、边、会话) 它与动态图(Eager Execution)的区别是什么?TensorFlow 静态计算图与动态图(Eager Execution)的区别及适用场景是什么? 解释张量(Tensor)的概念及其在 TensorFlow 中的作用…...
go-zero学习笔记
内容不多,只有部分笔记,剩下的没有继续学下去,包括路由与处理器、日志中间件、请求上下文 文章目录 1、go-zero核心库1.1 路由与处理器1.2 日志中间件1.3 请求上下文 1、go-zero核心库 1.1 路由与处理器 package mainimport ("github…...
在Ubuntu 22.04 中安装Docker的详细指南
这里写目录标题 前言一、安装 Docker1. 卸载旧版本(如有)2. 更新系统并安装依赖工具3. 添加 Docker 官方 GPG 密钥4. 设置 Docker 仓库5. 安装 Docker Engine6. 验证安装 二、配置 Docker 镜像加速1. 修改 Docker 配置文件2. 重启 Docker 服务3. 验证加速…...
十亿级流量削峰实战:LinkedBlockingQueue缓冲池的工程化实现
《十亿级流量削峰实战:LinkedBlockingQueue缓冲池的工程化实现》 本文将以电商秒杀系统为背景,深度解析如何通过LinkedBlockingQueue构建百万QPS级异步缓冲系统,包含容量计算模型、拒绝策略选择、监控埋点方案等完整实施细节,并提…...
深入理解 C++11 智能指针:独占、共享与弱引用的完美管理
文章目录 std::unique_ptr(独占式智能指针)std::shared_ptr(共享式智能指针)std::weak_ptr(弱引用智能指针)示例展示:智能指针的原理内存泄漏**什么是内存泄漏,内存泄漏的危害****如…...
AI Agent开发大全第四课-提示语工程:从简单命令到AI对话的“魔法”公式
什么是提示语工程?一个让AI“听话”的秘密 如果你曾经尝试过用ChatGPT或者其他大语言模型完成任务,那么你一定遇到过这样的情况:明明你的问题是清晰的,但答案却离题万里;或者你认为自己提供的信息足够详尽,可结果还是不理想。问题出在哪?很多时候并不是因为AI不够聪明,…...
大模型架构记录 【综述-文字版】
名词解释: Prompt :提示词,是一个非常关键的概念,它指的是用户输入的文本或指令,用于引导语言模型生成相应的回答或执行特定任务。 Prompt Engineering:(提示工程) 是一种通过设计…...
WebSocket:开启实时通信的新篇章
在当今的互联网应用中,实时交互已经成为不可或缺的一部分。无论是实时的在线聊天、股票行情更新,还是多人在线游戏,都需要一种高效的双向通信机制。而这正是 WebSocket 的用武之地。 本文将带你深入了解 WebSocket,探索其工作原理…...
【论文笔记】Transformer
Transformer 2017 年,谷歌团队提出 Transformer 结构,Transformer 首先应用在自然语言处理领域中的机器翻译任务上,Transformer 结构完全构建于注意力机制,完全丢弃递归和卷积的结构,这使得 Transformer 结构效率更高…...
使用CSS3实现炫酷的3D翻转卡片效果
使用CSS3实现炫酷的3D翻转卡片效果 这里写目录标题 使用CSS3实现炫酷的3D翻转卡片效果项目介绍技术要点分析1. 3D空间设置2. 核心CSS属性3. 布局和定位 实现难点和解决方案1. 3D效果的流畅性2. 卡片内容布局3. 响应式设计 性能优化建议浏览器兼容性总结 项目介绍 在这个项目中…...
SpringSecurity——基于角色权限控制和资源权限控制
目录 基于角色权限控制 1.1 自定义 UserDetailsService 1.2 加载用户角色 1.3. 给角色配置能访问的资源(使用切面拦截,使用注解) 总结 资源权限控制 2.2. 需要有一个用户;(从数据库查询用户) 2.2 基…...
红宝书第十一讲:超易懂版「ES6类与继承」零基础教程:用现实例子+图解实现
红宝书第十一讲:超易懂版「ES6类与继承」零基础教程:用现实例子图解实现 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、ES6类的核心语法:把事物抽象成“模板” 想象你要设…...
通信基本概念
系列文章目录 文章目录 系列文章目录前言一、消息、信息和信号1.消息的定义2.信号的定义3.信息的定义4.消息、信息和信号的关系5.通信的目标 二、通信系统的组成模型1.一般通信系统模型2.各部分说明3.模拟通信系统模型4.数字通信系统模型4.数字通信的特点数字通信的优点数字通信…...
Python为Word文档添加书签并打包成exe
背景简述 由于一些工作场景,需要从多个Word文档中找到出现的关键词,并阅读关键词的上下文内容。文件可能几十个,手动操作太要命了。所以python尝试处理。 目录 背景简述思路第一步、功能实现结果验证 第二步、打包成exe2-1、基础准备2-2、打…...
ROS导航工具包Navigation
一,安装 Navigation工具包包含在 navigation 元功能包中。你可以通过以下命令安装: sudo apt-get install ros-noetic-navigation 如果你使用的是其他ROS版本(如Melodic),将 noetic 替换为对应的版本名称(…...
BigEvent项目后端学习笔记(二)文章分类模块 | 文章分类增删改查全流程解析(含优化)
📖 模块概述 文章分类模块包括 新增文章分类、文章分类列表、获取文章分类详情、更新文章分类、删除文章分类 功能。本篇对于原项目进行了代码优化,将原先写在 Controller 层的业务逻辑代码迁移至了 Service 层。 🛠️ 技术实现要点 分组校…...
资金管理策略思路
详细描述了完整交易策略的实现细节,主要包括输入参数、变量定义、趋势判断、入场与出场条件、止损与止盈设置等多个方面。 输入参数(Input): EntryFrL (.6):多头入场的前一日波动范围的倍数。 EntryFrS (.3)࿱…...
UI-TARS与Midscene.js自动化探索
结合 Midscene.js 和 UI-TARS 大模型 实现 UI 页面自动化的可实施方案,涵盖环境配置、核心流程、代码示例及优化建议: 一、环境配置与工具集成 安装 Midscene.js 方式一:通过 Chrome 插件快速安装(适用于浏览器自动化场景&#x…...
关于 URH(Universal Radio Hacker) 的详细介绍、安装指南、配置方法及使用说明
URH:开源无线电协议分析工具 一、URH简介 URH 是一款开源的 无线电协议分析工具,专注于解码、分析和逆向工程无线通信协议(如 Wi-Fi、蓝牙、RFID、LoRa、Zigbee 等)。它支持信号捕获、协议树构建、数据可视化及自定义脚本扩展&a…...
工业软件的破局与重构:从技术依赖到自主创新的未来路径
工业软件作为现代工业的“神经与大脑”,不仅是制造业数字化转型的核心工具,更是国家工业竞争力的战略制高点。近年来,中国工业软件市场在政策驱动与技术迭代中迅猛发展,但核心技术受制于人的困境仍待突破。如何实现从“跟跑”到“…...
C++ 介绍STL底层一些数据结构
c 标准模板库中,set和map的底层实现通常基于红黑树,然们都是平衡二叉搜索树(Balanceed Binary Serach Tree)的一种,这种结构保证了 插入,删除,查找的时间复杂度为O(log n)比普通二叉搜索树更高效。 set set<T>…...
CAJ转PDF:复杂的转换背后有哪些挑战?
CAJ转PDF:复杂的转换背后有哪些挑战? CAJ文件格式作为中国学术期刊的标准格式,广泛应用于学术文献的存储和分享,尤其是在中国知网(CNKI)中。然而,这种专有格式也带来了许多使用上的不便&#x…...
LeetCode Hot 100 - 子串 | 560.和为K的子数组、239.滑动窗口最大值、76.最小覆盖子串
560.和为K的子数组 前缀和哈希表 要查找的子数组为连续的,可以由两个前缀和计算得出,满足题目的条件为preSum[i] - preSum[j-1] k,所以我们可以用哈希表记录前缀和出现的次数,在遍历到位置 i 时计算出preSum[i] - k ,查看哈希表中是否有对…...
AI比人脑更强,因为被植入思维模型【18】万物系统思维模型
把事物看成链,看成网,看成生态。 定义 万物系统思维模型是一种将宇宙万物视为一个相互关联、相互作用的整体系统的思维方式。它强调从系统的角度去认识、分析和解决问题,认为系统中的各个要素之间存在着复杂的相互关系,这些关系不…...
常见中间件漏洞攻略-Tomcat篇
一、 CVE-2017-12615-Tomcat put方法任意文件写入漏洞 第一步:开启靶场 第二步:在首页抓取数据包,并发送到重放器 第三步:先上传尝试一个1.txt进行测试 第四步:上传后门程序 第五步:使用哥斯拉连接 二、后…...
小智物联网开发:为小智安装“机械臂“(其实就是加个舵机进行语音控制)
小智物联网开发:打造专属智能助手,开启智能生活新纪元 在物联网蓬勃发展的今天,小智物联网开发正引领着一股创新浪潮,为我们的生活和工作带来前所未有的便利与智能体验。今天,就让我们一起深入探索小智物联网开发的魅…...
【Dive Into Stable Diffusion v3.5】2:Stable Diffusion v3.5原理介绍
【Dive Into Stable Diffusion v3.5】系列博文: 第1篇:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练第2篇:Stable Diffusion v3.5原理介绍 目录 1 前言1.1 扩散模型的原理1.2 损失函数1.3 加噪流程1.4 推理流程1.5 negative pr…...
线段树与扫描线 —— 详解算法思想及其C++实现
目录 一、线段树(Segment Tree) 基本概念 结构 操作 示例代码 二、扫描线(Sweep Line) 基本概念 应用场景 示例代码(矩形面积并集) 三、总结 一、线段树(Segment Tree) 基本…...
