内网穿透利器 n2n 搭建指南
1. n2n 简介
上文实验分析了 FRP 和 Zerotier 的利弊,本文再介绍另一种内网穿透方案,n2n。
n2n 是 C/S 架构的内网穿透服务,不同于 FRP 的 反向代理,它的原理是类似 Zerotier 的先打孔,打孔失败再尝试转发。关于打孔本文不会展开介绍,只说一点,国内网络打孔成功率不低,成功后两个客户端之间的通信无需经过服务端转发。
与 FRP 相比,n2n 的优势在于它能打孔;因此速度和用户容量全面优于 FRP,延迟大致持平。
与 Zerotier 相比,n2n 的优势在于:
1.Zerotier 是商业产品,以后的收费策略未可知。n2n 是开源的。
2.Zerotier 只有不开源的 moon 服务器能搭建,根服务器在美国;n2n 全开源,根服务器可以自行搭建。
3.n2n 服务端,客户端均轻量,结构比 Zerotier 更简单。实施时只需要配好配置文件和脚本传给客户,客户每次运行脚本即可连接,对小白客户的实施也比 Zerotier 容易。
4.n2n 打孔速度比 Zerotier 快,Zerotier 常常出现第一次连接需要等待的卡顿感。
n2n 的 缺点在于,不提供 Windows 编译版本,没有官方图形界面,本文会提供编译好的 n2n 3.0。
前提还是需要一台云服务器,选用主流云服务器即可。本文仍举例星露谷物语联机为应用场景。
2. 安装 n2n 服务端
下载 n2n,https://github.com/ntop/n2n/releases/tag/3.0
这里简单说一下怎么看安装包的名字,先看扩展名,代表系统类型,.rpm 是 redhat 类系统,如 CentOS,.deb 是 debian 类系统,如 Ubuntu。
再看文件尾,代表 CPU 架构,x86_64 代表 32位/64位 通用,i386 代表 32位,amd64 代表 64位,arm 代表 arm 架构(如树莓派,手机)。
github 上开源项目的 release 一般都会提供针对几个主流 linux 系统编译的可运行文件,其他的系统请用源代码自行编译。(😡难道 windows 不是主流系统?)
可以用这几条命令查看自己的系统架构,linux 发行版 等信息。
uname -m
lsb_release -a
cat /etc/*release*
比如我的是 Ubuntu 20.04.5 LTS x86_64,因此选择 n2n_3.0.0-1038_amd64.deb。
用 apt 来安装 deb 包。
apt install n2n_3.0.0-1038_amd64.deb
等待安装完毕,systemctl 里面就多了 supernode 和 edge 两个服务,也就是 n2n 的服务端和客户端。这条命令可以看到服务端此时并未开启。
systemctl status supernode
3. 安装 n2n 客户端,第一次连接
先对云服务器上的服务端进行配置。
vim /etc/n2n/supernode.conf
-p=7984
-F=FeigeGarden
-p 是端口号,随意填写,这一步做完后还需要在云服务器的防火墙面板放行 7984 端口(UDP)。
-F 是服务器的名字,客户端连接时要核对。
然后用该命令启动 n2n 服务端,并查看其状态。
systemctl start supernode
systemctl status supernode
可以看到 supernode.service 的启动命令是 /usr/sbin/supernode /etc/n2n/supernode.conf -f
。
然后在本地PC上安装 n2n 客户端,如果是 linux 系统,则安装步骤和安装服务端一模一样。
下面介绍的是 windows 系统,n2n 并未提供 windows 系统的编译版本,因此需要用 Visual Studio 编译源码。
本文提供 EasyN2N 作者编译好的 n2n-3.0,n2n-keygen 工具。以及 windows 系统还需要额外安装的虚拟网卡 tap-windows-9.23.3。
https://pan.baidu.com/s/103fC4QAkz4uvjj9mippgxA?pwd=fgtc
在 本地PC 下载后解压,先安装虚拟网卡 tap-windows-9.23.3,不赘述。
然后用 n2n-keygen 生成公钥
.\n2n-keygen.exe -F FeigeGarden
这里的 -F FeigeGarden 就是刚才服务端的配置文件 supernode.conf 中的 -F 服务器名。
可以看到一串加密后的乱码,这就是我们连接服务器的凭证。
在 本地PC 的 edge.exe 同目录下创建一个 edge.conf 文件。
-l 172.7.76.71:7984
-P OjWvhPvHc9Qo5tPthq9vEZfGvq3fn7+498fDDS0Oyqm
-c StardewValley
-l 是云服务器的 IP 和 端口。
-P 是 公钥,刚才 n2n-keygen 生成的密文,用来验证服务器名。
-c 是 community,可以理解为房间名,不同房间网络不互通。
在 本地PC 调出 cmd(管理员权限),运行客户端,尝试第一次连接。
C:\prohos\pro\n2n\edge C:\prohos\pro\n2n\edge.conf
出现如下画面证明连接成功,红圈内为 虚拟局域网IP 10.219.185.106,关闭此窗口则连接断开。
完成第一次连接后,只要给每个小伙伴的 本地PC 都安装上客户端,写好配置文件运行成功,就可以进行联机了,只要星露谷房主记住自己的虚拟局域网IP 10.219.185.106,其他成员填写这个 IP 加入游戏即可。
4. 配置用户权限
虽然已经可以成功联机,但是这样配置的服务器仅有一个验证凭据 -P,太单薄。我们还需要用用户名密码的方式强化下 n2n 服务器的访问权限。
在云服务器上修改配置文件,/etc/n2n/supernode.conf,加入这一行
-c=/etc/n2n/community.list
然后创建 /etc/n2n/community.list,如下所示是仅允许 StardewValley 和 borderlands2 两个房间名,以及各个房间允许的用户,lengyu,sister1,sister2,friend5,friend6。其他所有连接请求全部拒绝。更多 community.list 支持的规则请参阅 n2n 官方文档。 https://github.com/ntop/n2n/blob/dev/doc/Communities.md
StardewValley
* lengyu nZaltWogB+Vv6dAUEiNjGfzrCyD2SBsdH+CDdtPRI4y
* sister1 iqgGLHRzTNbcL6ui6QrTANlfUPQ3jMniTwPSxFQqur8
* sister2 6lhQQhfx9fUHcy10fLDomOoRvHbkG-Q9oPajSErt76C
* friend5 2h-xsXFw0XQol7Ef0H14LSI+rvBlrPLjOVf9s7Ov6aO
* friend6 j9CeNWBnJJ5i0-Hy811rHHJHkkY+8Frv39OEFexv2a0borderlands2
* lengyu nZaltWogB+Vv6dAUEiNjGfzrCyD2SBsdH+CDdtPRI4y
* sister1 iqgGLHRzTNbcL6ui6QrTANlfUPQ3jMniTwPSxFQqur8
* sister2 6lhQQhfx9fUHcy10fLDomOoRvHbkG-Q9oPajSErt76C
用户名后面那串乱码是密码,是加密过的密文。现在说如何 明文->密文。
首先构思一对 用户名/密码,并且把它记录下来,例如:
lengyu
asTT-=3
然后使用 n2n-keygen 工具,生成密文
n2n-keygen lengyu asTT-=3
即可得到这样的结果
* lengyu nZaltWogB+Vv6dAUEiNjGfzrCyD2SBsdH+CDdtPRI4y
把这个结果贴到 community.list 中去。写完 community.list 之后,重启 n2n 服务端。
systemctl restart supernode
服务端配置完成,接下来修改客户端的 edge.conf。
-l 172.7.76.71:7984
-P OjWvhPvHc9Qo5tPthq9vEZfGvq3fn7+498fDDS0Oyqm
-c StardewValley
-I lengyu
-J asTT-=3
-A5
-k 23!->?gh
前三行没有任何变化。
-I 用户名
-J 明文密码
-A5 加密算法,A5 代表 Speck-CTR
-k 加密密钥,给加密算法使用的,可随意填写
这样调出 cmd(管理员权限),运行客户端 edge 就可以连接上 n2n 服务端了。
C:\prohos\pro\n2n\edge C:\prohos\pro\n2n\edge.conf
5. 编写批处理脚本(windows)
每次都调出 cmd(管理员权限) 输命令未免太过麻烦,对于小白用户来说也很劝退。我们可以写一个批处理脚本来干这个活,还是放在 edge.exe 的同目录下。
%1 start "" mshta vbscript:CreateObject("Shell.Application").ShellExecute("%~s0","::","%~dp0","runas",1)(window.close)&&exit
%~dp0\edge %~dp0\edge.conf
pause
这样,小伙伴们就可以啥都不用知道,每次联机之前双击这个脚本即可加入房间。
6. 杂谈
遗憾的是,本文并未采用实验的方式给出 n2n 和 FRP,Zerotier 的足够直观的性能对比。个人做过一些不太严谨的实验,得出的结论是:如果是以游戏联机为目标,可以首先尝试 n2n。另外,游戏的 主机/房主 还可以在路由器上打开 DMZ主机 功能,能够有效降低延迟;某些游戏会在检测网卡时优先选用物理网卡,导致联不上,这时需要手动修改跃点数来提高虚拟网卡的优先级。
PS:Steam上某些游戏就是采用打孔的方式联机的,官方服务器负担很小,比如枪火重生。
除了联机游戏,n2n 对于个人而言,还有个应用场景,就是遥控家里的智能设备,我家里的树莓派 同时配置了动态域名,n2n 客户端 和 Shadowsocks 服务端,这使得我身在千里之外也可以随时遥控家里的智能设备。一台自己做的电视盒子(CoreELEC),也同样配备了 n2n 客户端。
另外,n2n 有个独特的优势,它还是个分布式软件,服务端可以组成一个集群,这个神奇的优势在某些场景下可能让它脱颖而出。想不到一个服务端+客户端都不超过 2MB 的软件这么有志气。
翻看官方 github 页面还可以找到第三方的 windows GUI,docker 镜像,Android 版 n2n 等。
相关文章:

内网穿透利器 n2n 搭建指南
1. n2n 简介 上文实验分析了 FRP 和 Zerotier 的利弊,本文再介绍另一种内网穿透方案,n2n。 n2n 是 C/S 架构的内网穿透服务,不同于 FRP 的 反向代理,它的原理是类似 Zerotier 的先打孔,打孔失败再尝试转发。关于打孔本…...

phpcms头像上传漏洞引发的故事
目录 关键代码 第一次防御 第一次绕过 第二次防御 第二次绕过 第三次防御 第三次绕过 如何构造一个出错的压缩包 第四次防御 第四次绕过 本篇文章是参考某位大佬与开发人员对于文件包含漏洞的较量记录下的故事,因为要学习文件包含漏洞,就将大佬…...

二叉树|二叉树理论基础、二叉树的递归遍历
代码随想录 (programmercarl.com) 树和二叉树 1.树的基本概念 1.1树的定义 1.2树的逻辑表示方法 1.3树的基本术语 1.4树的性质 1.5树的基本运算 1.6树的存储结构 2.二叉树的概念和性质 2.1二叉树的定义 2.2二叉树的性质 2.3二叉树与树、森林之间的转换 3.二叉树的…...
JavaScript 语法-对象
对象 JavaScript 中的对象是一组键值对的集合,其中每个键都是字符串,每个值可以是任意类型。 对象是由一些属性和方法组成的集合,属性可以用来存储数据,方法可以用来操作数据。 属性和方法使用“.”来访问 // 创建一个对象 let …...
代码随想录阅读笔记-哈希表【四数之和】
题目 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a b c d 的值与 target 相等?找出所有满足条件且不重复的四元组。 注意:答案中不可以包…...
JVM学习——双亲委派机制
简而言之就是为了防止与Java固有全类名重复,而导致系统崩坏所设立的机制。 当类加载器接收到加载类的任务时,首先会向上请求,一直请求到引导类加载器,如果引导类加载器无法加载,就会逐层返回让类加载器自己执行&#…...

【Paper Reading】6.RLHF-V 提出用RLHF的1.4k的数据微调显著降低MLLM的虚幻问题
分类 内容 论文题目 RLHF-V: Towards Trustworthy MLLMs via Behavior Alignment from Fine-grained Correctional Human Feedback 作者 作者团队:由来自清华大学和新加坡国立大学的研究者组成,包括Tianyu Yu, Yuan Yao, Haoye Zhang, Taiwen He, Y…...
Aloudata 倾力打造,《Data Fabric 白皮书 2.0》正式发布
数字经济时代,越来越多企业开始寻求全新的数据管理范式,以更有效地管理、利用不断增长的数据资产。在此背景下,Data Fabric 的概念应运而生,被视为面向未来的数据管理解决方案。 距离第一版白皮书问世已经过去一年多时间ÿ…...
docker内部无法使用ping等网络工具解决方案
通常docker内部没有网络,所以我们先离线安装需要的依赖包,然后再使用sh脚本容器内部访问宿主机同网络端其他服务器ip,实现监测远程ip telnet包依赖于netbase包,但是netbase包没有安装。你需要先安装netbase包,然后再尝试安装teln…...

后端工程师快速使用vue和Element
文章目录 Vue1 Vue概述2 快速入门3 Vue指令3.1 v-bind和v-model3.2 v-on3.3 v-if和v-show3.4 v-for3.5 案例 4 生命周期 Element快速使用1 Element介绍2 快速入门3 当前页面中嵌套另一个页面案例代码案例截图 Vue 1 Vue概述 通过我们学习的htmlcssjs已经能够开发美观的页面了…...

自学rabbitmq入门到精通
交换机的fault (发布与订阅模式) 因为消息是由生产者发送给excahnge,exchange发送给队列, 然后由队列发送给消费者的。 展示使用图形化界面使用fanout模式。 创建交换机 然后创建三个队列,绑定对应的交换机ÿ…...

由浅到深认识C语言(13):共用体
该文章Github地址:https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn…...

python爬虫(9)之requests模块
1、获取动态加载的数据 1、在开发者工具中查看动态数据 找到csdn的门户的开发者工具后到这一页面。 2、加载代码 import requests headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36…...

phpstudy自定义安装mysql8.3并启动
phpstudy自定义安装mysql8.3并启动 先去官网:https://dev.mysql.com/downloads/下载压缩包文件 然后按下面的图片一步一步操作 选择版本,选择第一个压缩包文件,下载 下载完成后,解压到phpstudy环境目录下,如下图 然后进入mysq…...
Netty 学习资料
Netty 学习资料 搜集了一下Java网络库Netty的学习资料,整理如下,有空花时间研究一下。 1、Netty学习手册 《尚硅谷 Netty 核心技术及源码剖析》课程学习手册 本课程不适合零基础的学员,需要掌握常用的设计模式和数据结构 掌握 Java 的面向对…...
【概率论中的两种重要公式:全概率和贝叶斯】
贝叶斯公式(Bayes’ Theorem)是概率论中的一条重要定理,用于计算条件概率。它描述了在已知某一事件发生的条件下,另一事件发生的概率。贝叶斯公式如下所示: P ( A ∣ B ) P ( B ∣ A ) ⋅ P ( A ) P ( B ) P(A|B) \…...
python中的闭包
一、闭包 1、作用域 在Python代码中,作用域分为两种情况:全局作用域 与 局部作用域 2、变量的作用域 在全局定义的变量 > 全局变量 在局部定义的变量 > 局部变量 3、全局变量与局部变量的访问范围 ① 在全局作用域中可以访问全局变量&#…...
成功解决RuntimeError: OpenSSL 3.0‘s legacy provider failed to load
报错 RuntimeError: OpenSSL 3.0s legacy provider failed to load. This is a fatal error by default, but cryptography supports running without legacy algorithms by setting the environment variable CRYPTOGRAPHY_OPENSSL_NO_LEGACY. If you did not expect this er…...
【 React 】React 组件之间如何通信?
相关文章: React Context的使用方法 react Provider Consumer 使用方法 1. 是什么 我们将组件间通信可以拆分为两个词: 组件通信 组件是vue中最强大的功能之一,同样组件化是React的核心思想 相比vue,React的组件更加灵活和多样…...

汇总全网免费API,持续更新(新闻api、每日一言api、音乐。。。)
Public&FreeAPI 网址:apis.whyta.cn (推荐) UomgAPI 网址:https://api.uomg.com 教书先生 网址:https://api.oioweb.cn/ 山海API https://api.shserve.cn/ 云析API铺 https://api.a20safe.com/ 韩小韩…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...