当前位置: 首页 > news >正文

【Linux】【网络】不同子网下的客户端和服务器通信其它方式

【Linux】【网络】不同子网下的客户端和服务器通信其它方式

那么,在 NAT 环境下,应该如何让内网设备做为服务器,使内网设备被外部连接?

1 多拨

部分运营商,支持在多个设备上,通过 PPPoE 登录同一个宽带账号。每个设备都能获取到一个独立的公网 IP4。
如果想让游戏主机等设备获取独立的公网 IP,供外部连接,可以在光猫之后连接交换机。游戏主机连接交换机,直接进行 PPPoE 拨号。无线路由器也连接交换机,家中的其他网络设备经过无线路由器访问 Internet。
在这里插入图片描述

多拨的局限性:

  1. 仅部分运营商支持多拨
  2. 一些运营商已不再为用户分配公网 IP,即使通过多拨,也获取不到公网 IP
  3. 越来越多的设备不再支持 PPPoE。例如Xbox 360 支持 PPPoE,但 Xbox One 之后的版本已不再支持
  4. 设备直接获取公网IP,暴露在公网上,安全性较差。可能需要单独设置防火墙
  5. 需要额外购买交换机,连接在光猫和路由器之间。会改变家庭网络拓扑,操作比较复杂

所以,这种方式不太常用。

2 端口转发、DMZ

上文中介绍的 NAT,路由器会根据内网设备发出的报文,自动形成 NAT 表项。实际上,用户还可以在路由器上手动配置端口映射关系,让内网设备可被外部访问。

其中,DMZ 功能,可以指定一台内网设备为 DMZ 主机。到达路由器上的报文,如果没有匹配 NAT 表项,就会转发到 DMZ 主机。从而使 DMZ 主机可被外部访问。

DMZ 功能能让一台内网设备上的所有端口,都能被公网访问。但这样做也影响了内网设备的安全性,如果没有特殊需要,不建议打开这一功能。

而 端口转发 功能,可以手动设置端口映射关系,让指定内网设备的指定端口,能够被公网访问:

3 UPnP IGD、NAT-PMP

上文中的端口转发功能,需要手动配置端口转发规则,操作起来比较麻烦。而 UPnP IGD 和 NAT-PMP 协议,则能实现自动配置端口转发规则。

UPnP IGD(互联网网关设备协议)和 NAT-PMP(NAT 端口映射协议)分别由微软和 Apple 提出,功能类似,都可以让应用程序告诉路由器需要打开的端口,让路由器自动设置端口转发规则。

UPnP IGD 和 NAT-PMP 的工作,需要应用程序和路由器的配合。首先需要在路由器上打开 UPnP 或 NAT-PMP 功能:

还需要使用支持的应用程序。目前 eMule、BitTorrent 等常见的 P2P 文件共享工具,以及 Synology DiskStation 等 NAS 设备,以及 Xbox 等游戏主机,都已经支持相关协议:

4 光猫改为桥接模式,使用路由器拨号

安装宽带时,运营商附送的光猫,一般会默认打开路由功能。这时光猫同时能作为路由器使用。

但光猫的功能和性能有限,一部分型号的光猫不支持 UPnP IGD 等协议,或者不能手动配置端口转发规则。

所以,可以考虑将光猫修改为桥接模式,通过自己的无线路由器拨号,充分利用路由器上端口转发、UPnP IGD、DMZ 等功能。

正常情况下,光猫改桥接,最简单的方式是拨打运营商的电脑,让运营商远程下发配置。也可以登录光猫的管理页面,自行进行修改,具体需要上网搜索运营商名和光猫型号来查找教程。

5 向运营商申请获取公网 IP

由于 IPv4 地址资源不足,不少运营商已经不再分配公网 IP。

但是,由于 IPv4 地址资源本身已经不足,不一定能够成功申请到公网 IP。另外,拥有公网 IP,家中的路由器能直接被公网访问,如果没有配置好,可能会带来更多安全问题。所以,需要根据自己的实际需要,来决定是否申请公网 IP。

6 PCP

对于运行 NAT 的家庭路由器,通过 UPnP IGD 或 NAT-PMP 协议,可以方便地将端口映射到公网。

但是,由于 IPv4 地址的不足,电信运营商也开始使用 NAT,不再为用户分配公网 IP。那么是否有一种类似 UPnP IGD 或者 NAT-PMP 的协议,运行在运营商的路由器上,能直接在运营商路由器上创建端口转发规则?

PCP 就是这样一种协议:

Port Control Protocol (PCP) - RFC6887
该协议由 NAT-PMP 发展而来,运行在运营商的路由器上。用户的应用程序可通过 PCP 协议,申请在运营商路由器上打开端口。

PCP 需要运营商的配合,选用支持的网络设备,并打开 PCP 功能,才能正常工作。根据 V2EX 网友的测试,国内已有运营商支持该协议,能通过 PCP 使 eMule 获得 High ID:

介绍一个可能有助于 CGN NAT 端口映射的工具 - V2EX

7 服务器中转

通过第三方服务器中转的方式,让内网设备供外部访问。

这种方式虽然需要第三方服务器的参与,浪费资源,但成功率最高,所以应用范围也很普遍。例如常见的游戏加速器,就可以通过第三方服务器中转的方式,为游戏主机提供更高的 NAT 类型:
网易UU加速盒
也有不少开源的反向代理工具,可以搭建在自己的服务器上,使内网服务可在公网访问:
fatedier/frp
ehang-io/nps

服务器中转需要额外的服务器,且需要消耗服务器上的流量。所以这种方式往往需要用户额外付费,例如购买游戏加速器会员,或者自行购买虚拟服务器,并在服务器上搭建反向代理应用。

而对于微信语音、视频通话等应用,默认也会使用其他 NAT 穿透技术,来节省微信服务器的流量费用,降低成本。当其他 NAT 穿透方式不可用时,则采用服务器中转的方式,保证能够正常通话。

8 NAT 打洞

NAT 打洞的工作过程
NAT 打洞,就可以 使两台内网设备能够直接通信,不需要第三方服务器的中转、不需要对路由器进行特殊设置、也不需要运营商的配置。微信语音、腾讯会议、Skype 通信等消耗流量较大的应用,都会利用 NAT 打洞实现内网设备间的直接通信。

我们以 PC 1、PC 2 两台主机的通信为例。两台主机均位于 NAT 路由器之后,各自的 IP 地址都是内网地址,无法互相通信:
在这里插入图片描述
1 在两台主机能够直接通信之前,需要一台第三方服务器:
在这里插入图片描述
2 PC 1、PC 2 首先需要给服务器发送一个报文。经过 NAT 路由器后,报文的源 IP 和源端口号被转换,同时在路由器上形成 NAT 表项:
在这里插入图片描述
3 报文到达服务器后,服务器记录下 PC 1、PC 2 两侧报文的源 IP 和源端口号,也就是 PC 1、PC 2 两侧的公网 IP 和外部端口号。然后,服务器将两台设备的公网 IP、外部端口号发送给对方。

4 这样,PC 1、PC 2 都能相互知道对方的公网 IP 和外部端口号

5 经历了上述步骤,NAT 打洞成功,两台设备就可以不依赖第三方路由器,直接进行通信。

当然,上述过程只是一个简化的描述,不完全描述。如果想要进一步详细了解 NAT 打洞的过程,建议参考文末的 RFC 文档链接。

可以看出,NAT 打洞可以在无需路由器特殊配置、无需运营商配合的情况下,实现两个内网设备的相互通信。另外,对于多层 NAT 的网络环境(例如运营商和家庭路由器各进行一级 NAT),NAT 打洞也能正常处理。

这个NAT打洞我有尝试实现 ,完成了1,2,3,4 步骤 但是5 两台主机还是无法互相访问,抓包发现双方数据都发送出去了 但是对端收不到,怀疑我这边

  1. 环境以及互联网直接太过复杂 路由器转发或者发送时路线可能不同
  2. 分配的IP和端口一直在变化 无法进行ping
  3. 路由表和NAT表我没有权限去修改
  4. 可能存在别的问题
    目前暂时无法解决,下一篇文章大概写一下我的做法 希望有大佬指点一下

文章转自:
https://sspai.com/post/68037

相关文章:

【Linux】【网络】不同子网下的客户端和服务器通信其它方式

【Linux】【网络】不同子网下的客户端和服务器通信其它方式 那么,在 NAT 环境下,应该如何让内网设备做为服务器,使内网设备被外部连接? 1 多拨 部分运营商,支持在多个设备上,通过 PPPoE 登录同一个宽带账…...

【C++/数据结构】栈

零.导言 栈是一种数据结构&#xff0c;在后续的学习中可能经常使用&#xff0c;因此我们今天就来学习如何实现栈&#xff0c;以更好地使用它。 一.栈的实现 栈的形式如下&#xff1a; #include<iostream> #include<cassert>using namespace std;typedef int Stack…...

Qt 对象树详解:从原理到运用

1. 什么是对象树&#xff1f; 对象树是一种基于父子关系的对象管理机制。在 Qt 中&#xff0c;所有继承自 QObject 的类都可以参与到对象树中。 当一个对象被设置为另一个对象的父对象时&#xff0c;子对象会被添加到父对象的内部列表中&#xff0c;形成一种树状结构。 Qt 提…...

【软路由】ImmortalWrt 编译指南:从入门到精通

对于喜欢折腾路由器&#xff0c;追求极致性能和定制化的玩家来说&#xff0c;OpenWrt 无疑是一个理想的选择。而在众多 OpenWrt 衍生版本中&#xff0c;ImmortalWrt 以其更活跃的社区、更激进的特性更新和对新硬件的支持而备受关注。 本文将带你深入了解 ImmortalWrt&#xff0…...

【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】

智能音频眼镜&#xff0c;作为一款将时尚元素与前沿科技精妙融合的智能设备&#xff0c;这种将音频技术与眼镜形态完美结合的可穿戴设备&#xff0c;不仅解放了用户的双手&#xff0c;更为人们提供了一种全新的音频交互体验。新立电子FPC在智能音频眼镜中的应用&#xff0c;为音…...

第2章 windows故障排除(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第2章开始带你入门了&#xff0c;这里给出了几个windows重要的工具&#xff0c;说实话&#xff0c;好多我也是第一…...

深度学习笔记——线性回归的从0开始实现

记录学习到的知识&#xff1a; 语义分割是将标签或类别与图片的每个像素关联的一种深度学习算法。 它用来识别构成可区分类别的像素集合。 图像分割是一个端到端图像分析过程&#xff0c;它将数字图像分成多个片段&#xff0c;并对每个区域中包含的信息进行分类。三种图像分割…...

配置Spring Boot中的Jackson序列化

配置Spring Boot中的Jackson序列化 在开发基于Spring Boot的应用程序时&#xff0c;Jackson是默认的JSON序列化和反序列化工具。它提供了强大的功能&#xff0c;可以灵活地处理JSON数据。然而&#xff0c;Jackson的默认行为可能无法完全满足我们的需求。例如&#xff0c;日期格…...

AWS跨账号服务全解析:安全共享资源的最佳实践

在复杂的云环境中,企业常常需要将不同业务部门、项目或环境分配到独立的AWS账户中,以实现资源隔离和权限管控。然而,跨账户的资源共享与协作需求也随之而来。AWS为此提供了丰富的跨账号服务,允许不同账户之间安全、高效地共享资源。本文将深入解析这些服务,并结合实际场景…...

Rust~String、str、str、String、Box<str> 或 Box<str>

Rust语言圣经中定义 str Rust 语言类型大致分为两种&#xff1a;基本类型和标准库类型&#xff0c;前者由语言特性直接提供&#xff0c;后者在标准库中定义 str 是唯一定义在 Rust 语言特性中的字符串&#xff0c;但也是几乎不会用到的字符串类型 str 字符串是 DST 动态大小…...

SpringBoot五:JSR303校验

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 松散绑定 意思是比如在yaml中写的是last-name&#xff0c;这个和lastName意思是一样的&#xff0c;-后的字母默认是大写的 JSR303校验 就是可以在字段增加…...

Oracle 数据库基础入门(四):分组与联表查询的深度探索(上)

在 Oracle 数据库的学习进程中&#xff0c;分组查询与联表查询是进阶阶段的重要知识点&#xff0c;它们如同数据库操作的魔法棒&#xff0c;能够从复杂的数据中挖掘出有价值的信息。对于 Java 全栈开发者而言&#xff0c;掌握这些技能不仅有助于高效地处理数据库数据&#xff0…...

基于SpringBoot的绿城郑州爱心公益网站设计与实现现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

创建一个简单的spring boot+vue前后端分离项目

一、环境准备 此次实验需要的环境&#xff1a; jdk、maven、nvm和node.js 开发工具&#xff1a;idea或者Spring Tool Suite 4&#xff0c;前端可使用HBuilder X&#xff0c;数据库Mysql 下面提供maven安装与配置步骤和nvm安装与配置步骤&#xff1a; 1、maven安装与配置 1…...

标签使用笔记

文章目录 文件夹结构可以有多个功能吗?标签是如何保存的 标签做成对外接口保存、修改查询删除标签列表标签表设计标签和分类的区别 虽然大体知道怎么设计做&#xff0c;但是整理出来更清晰&#xff0c;那么整理下。 一般来说有两种索引就够。 1、标题文字索引。 # 用于搜索文章…...

Unity图集使用事项

一. 图集布局算法 紧密填充是一种常见的图集布局算法&#xff0c;它的主要目标是尽可能地减少图集的空间浪费。该算法会根据图像的形状和大小&#xff0c;将它们紧密地排列在图集中&#xff0c;以确保最小化空白区域的存在。这样可以有效地利用内存&#xff0c;并减少图集的尺…...

Flutter 学习之旅 之 flutter 在 Android 端读取相册图片显示

Flutter 学习之旅 之 flutter 在 Android 端读取相册图片显示 目录 Flutter 学习之旅 之 flutter 在 Android 端读取相册图片显示 一、简单介绍 二、简单介绍 image_picker 三、安装 image_picker 四、简单案例实现 五、关键代码 代码说明&#xff1a; 一、简单介绍 Fl…...

RagFlow专题二、RagFlow 核心架构(数据检索、语义搜索与知识融合)

深入解析 RagFlow 核心架构:数据检索、语义搜索与知识融合 在前一篇文章中,我们对 RagFlow 的核心理念、与传统 RAG 的区别以及其适用场景进行了深入探讨。我们了解到,RagFlow 通过动态优化检索、增强生成质量以及实时知识管理,使得大模型在复杂任务中的表现更加稳定和高效…...

解决各大浏览器中http地址无权限调用麦克风摄像头问题(包括谷歌,Edge,360,火狐)后续会陆续补充

项目场景&#xff1a; 在各大浏览器中http地址调用电脑麦克风摄像头会没有权限&#xff0c;http协议无法使用多媒体设备 原因分析&#xff1a; 为了用户的隐私安全&#xff0c;http协议无法使用多媒体设备。因为像摄像头和麦克风属于可能涉及重大隐私问题的API&#xff0c;ge…...

【SpringBoot+Vue】博客项目开发二:用户登录注册模块

后端用户模块开发 制定参数交互约束 当前&#xff0c;我们使用MybatisX工具快速生成的代码中&#xff0c;包含了一个实体类&#xff0c;这个类中包含我们数据表中的所有字段。 但因为有些字段&#xff0c;是不应该返回到前端的&#xff0c;比如用户密码&#xff0c;或者前端传…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...