【网络层协议】NAT技术内网穿透

news2025/3/26 1:51:58

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/frphttps://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登录客户机了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解 C++11 智能指针:独占、共享与弱引用的完美管理

文章目录 std::unique_ptr(独占式智能指针)std::shared_ptr(共享式智能指针)std::weak_ptr(弱引用智能指针)示例展示:智能指针的原理内存泄漏**什么是内存泄漏,内存泄漏的危害****如…

AI Agent开发大全第四课-提示语工程:从简单命令到AI对话的“魔法”公式

什么是提示语工程?一个让AI“听话”的秘密 如果你曾经尝试过用ChatGPT或者其他大语言模型完成任务,那么你一定遇到过这样的情况:明明你的问题是清晰的,但答案却离题万里;或者你认为自己提供的信息足够详尽,可结果还是不理想。问题出在哪?很多时候并不是因为AI不够聪明,…

大模型架构记录 【综述-文字版】

名词解释: Prompt :提示词,是一个非常关键的概念,它指的是用户输入的文本或指令,用于引导语言模型生成相应的回答或执行特定任务。 Prompt Engineering:(提示工程) 是一种通过设计…

【论文笔记】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类的核心语法:把事物抽象成“模板” 想象你要设…

Python为Word文档添加书签并打包成exe

背景简述 由于一些工作场景,需要从多个Word文档中找到出现的关键词,并阅读关键词的上下文内容。文件可能几十个,手动操作太要命了。所以python尝试处理。 目录 背景简述思路第一步、功能实现结果验证 第二步、打包成exe2-1、基础准备2-2、打…

ROS导航工具包Navigation

一,安装 Navigation工具包包含在 navigation 元功能包中。你可以通过以下命令安装: sudo apt-get install ros-noetic-navigation 如果你使用的是其他ROS版本(如Melodic),将 noetic 替换为对应的版本名称&#xff08…

资金管理策略思路

详细描述了完整交易策略的实现细节,主要包括输入参数、变量定义、趋势判断、入场与出场条件、止损与止盈设置等多个方面。 输入参数(Input): EntryFrL (.6):多头入场的前一日波动范围的倍数。 EntryFrS (.3)&#xff1…

工业软件的破局与重构:从技术依赖到自主创新的未来路径

工业软件作为现代工业的“神经与大脑”,不仅是制造业数字化转型的核心工具,更是国家工业竞争力的战略制高点。近年来,中国工业软件市场在政策驱动与技术迭代中迅猛发展,但核心技术受制于人的困境仍待突破。如何实现从“跟跑”到“…

常见中间件漏洞攻略-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…

英伟达黄仁勋2025GTC演讲深度解析:液冷GPU、AI工厂、机器人AI…...

目录 一、技术产品与架构升级:从芯片到算力工厂1. 新一代GPU与计算架构2. AI工厂与算力操作系统 二、AI技术演进:从生成式到物理AI1. AI发展的三大阶段2. 推理算力需求爆炸式增长 三、生态合作与行业落地1. CUDA生态与开源工具2. 跨行业合作案例 四、未来…

嵌入式项目:利用心知天气获取天气数据实验方案

【实验目的】 1、利用心知天气服务器获取指定位置天气数据 2、将天气数据解析并可视化显示到OLED屏幕 【实验原理】 【实验步骤】 官网注册

Ubuntu下用QEMU模拟运行OpenBMC

1、前言 在调试过程中,安装了很多依赖库,具体没有记录。关于kvm,也没理清具体有什么作用。本文仅记录,用QEMU成功的将OpenBMC跑起来的过程,做备忘,也供大家参考。 2、环境信息 VMware Workstation 15 Pro…

专题|Python贝叶斯网络BN动态推理因果建模:MLE/Bayes、有向无环图DAG可视化分析呼吸疾病、汽车效能数据2实例合集

原文链接:https://tecdat.cn/?p41199 作为数据科学家,我们始终在探索能够有效处理复杂系统不确定性的建模工具。本专题合集系统性地解构了贝叶斯网络(BN)这一概率图模型在当代数据分析中的创新应用,通过开源工具bnlea…

Java单例模式中的饿汉模式和懒汉模式

Java单例模式中的饿汉模式和懒汉模式 一、单例模式的显著特点单一实例全局访问 二、饿汉模式:急切的实例创建者三、懒汉模式:延迟的实例构建者1. 不考虑线程安全的初始版本2. 引入同步机制解决线程安全问题3. 优化性能:避免重复进入同步块4. …

理解操作系统(一)冯诺依曼结构和什么是操作系统

认识冯诺依曼系统 操作系统概念与定位 深⼊理解进程概念,了解PCB 学习进程状态,学会创建进程,掌握僵⼫进程和孤⼉进程,及其形成原因和危害 1. 冯诺依曼体系结构 我们常⻅的计算机,如笔记本。我们不常⻅的计算机&am…

Git的认识安装及创建配置本地仓库

目录 Git的作用安装Git创建Git仓库配置本地仓库git config user.name/email(添加配置)以及git config --unset.name/email(删除配置)git config --global user.name/email以及git config --global --unset user.name/email(name和email适用于当前机器的所有Git仓库中) 感谢各位…