这就是一篇记录文章，纪念一下花了三四个小时折腾的成果，顺便写一些细节性问题。前言国内的技术帖多半是亡了，转载来转载去，不标明出处也就算了，还不统一一下格式。要不直接一股脑复制过来看也不看就发布了；有一些好一点的还稍微排了一下版，但是代码部分能不能把人家的行数给删一下（在这就不点名哪个**DN了嗷。感谢好友SweetCandy1提供的云服务器w0.关于项目说实在的，如果是没有Linux和网络相关知识的小白来说，建议去van一会Hacknet2（dogeLinux对于习惯于Windows环境臭打游戏的大概是有点陌生，但是没办法，谁叫它开源免费、性能占用低、上云还便宜呢（Frp对于混迹在天朝还用的某动完全申请不到ipv4公网IP的来说应该是不陌生，想要搞个公网IP要不寄人篱下3，要不换家运营商4，不然就是上云用Frp进行端口转发。而N2N对于游戏玩家来说更不陌生了，虽然咋一看可能没头没脑，但是只要说明这玩意就是P2P的开源组网方案，大概就明白了，毕竟相当一部分联机游戏都是走的P2P。当然了，对于P2P本身的缺点，也是令玩家们也是又爱又恨，而P2P打洞或成为一个相当不错的联机方式。本项目P2P相关工具来自：梦羽大佬的P2P_Party5；Bug侠大佬的EasyN2N6。1.从win连接本例采用SSH连接Linux云，当然也可以使用网页终端或者其他连接方式。如果Linux开启了SSH功能并开放了22端口7，则可以使用Windows提供的OpenSSH连接Linux云。OpenSSH客户端默认是不自带的，需手动安装。以Windows10为例，进入「设置」→「应用」→「应用和功能」→「可选功能」，选择「添加功能」，搜索安装OpenSSH即可。确认安装OpenSSH客户端后，运行CMD或PowerShell，使用ssh指令连接Linux云：ssh [Username]@[IP]举个例子，假设用户名是root，云服务器IP为127.0.0.1：#ForExample ssh root@127.0.0.1登录后会提示输入密码：[Username]@[IP]]'s password:注意，这个时候键入的任何内容都不会显示，但是退格键大写锁定键都是会响应的，正常键入密码就好了，最好一次性输入不要退格，否则反而增加密码错误的可能。登录后提示信息长这样：Last login: [LoginWeek] [LoginMonth] [LoginDay] [LoginTime] [LoginYear] from [LoginIP] [[username]@[servername] ~]# #If entered an incorrect password at least once: Last failed login: [LoginWeek] [LoginMonth] [LoginDay] [LoginTime] [LoginTimezone] [LoginYear] from [LoginIP] on ssh:notty There was [failcount] failed login attempt since the last successful login. Last login: Mon Mar [LoginWeek] [LoginMonth] [LoginDay] [LoginTime] [LoginYear] from [LoginIP] [root@VM-0-13-centos ~]#[]括起来的均为参数，显示会不相同，例：Last failed login: Thu Jan 01 08:00:00 CST 1970 from 192.168.0.1 on ssh:notty There was 1 failed login attempt since the last successful login. Last login: Thu Jan 01 08:00:00 CST 1970 from 192.168.0.1 [root@VM-centos ~]#来一个完整登录示例：PS C:\Users\Administrator> ssh root@127.0.0.1 root@127.0.0.1's password: Permission denied, please try again. root@127.0.0.1's password: Last failed login: Thu Jan 01 08:00:00 CST 1970 from 192.168.0.1 on ssh:notty There was 1 failed login attempt since the last successful login. Last login: Thu Jan 01 08:00:00 CST 1970 from 192.168.0.1 [root@VM-centos ~]#至此，连接并登录Linux云成功。2.熟悉Linux操作目录访问操作在上一步中，登录后默认的目录在当前登录用户下，可以使用cd命令回到根目录：cd /cd指令后边的参数可以跟一下几种常用目录表示方法：跳转到指定目录/usr/bin：cd /usr/bin跳转到自己的home目录：cd ~跳转到上级目录：cd ..需要注意的是，在输入指令时，可以看到在指令前面的[]里最后有个~（或其他），这代表着当前目录，可帮助快速定位。假设登入进系统后，跳转到了目录/usr/bin，则完整显示会是这样：[root@VM-centos ~]# cd /usr/bin [root@VM-centos bin]# 文件罗列操作可以使用ls罗列当前目录下的文件或文件夹，会自带颜色对文件类型进行分类，常用默认颜色对应文件类型如下表所示：ls颜色文件类型白色普通文件（文本文件，配置文件，源码等）蓝色目录（文件夹）红色包（压缩文件，包文件）绿色程序（可执行文件）浅蓝色链接文件（类似win的快捷方式）黄色设备文件灰色其他文件文本编辑操作Linux系统如果不带面板则使用命令行操作，而vi指令就是在命令行环境下的文书编辑器，当然了，对vim熟悉的上手就能用了不是么。关于vi/vim的详细说明可参考菜鸟教程相关文档8，本文只简单说明大概使用流程：我们假设已经有一个内有如下字符的文本文档test.txt：Hello World! This is a test file.当定位到该文本文档目录下后，使用vi指令进入编辑器：vi test.txt打开编辑器后，Powershell会显示以下内容：Hello World! This is a test file. ~ ~ ~ "test.txt" 2L, 34C由于本站渲染器问题，中间的~应该是蓝色的，表示空，且数量与窗口高度有关，将会填满所有空行。然后按下键盘i键，当底部一栏变成黄色的-- INSERT --即进入输入模式，即可按正常文本编辑器使用，切记鼠标是无效的。例如在文本末加入一行文本：lmaoHello World! This is a test file. lmao< ~ ~ -- INSERT --注：这里使用<模拟命令行的光标编辑结束后，按下Esc键退出输入模式，返回普通模式，然后输入:wq，即可保存退出编辑器。Hello World! This is a test file. lmao ~ ~ :wq文本查看操作使用cat或more指令可查看文本文件，其中，cat指令适用于行数较少的文本文件；more指令可以部分显示查看大内容文本，使用空格键向下滚动一屏，Ctrl+B返回上一屏。例如使用cat指令查看编辑后的test.txt：[root@VM-centos ~]# cat test.txt Hello World! This is a test file. lmao [root@VM-centos ~]#文件删除操作使用著名的rm指令可删除文件。删除该目录下指定文件：rm test.txt删除该目录下所有文件（光速删库跑路是吧）：rm *端口占用查看使用netstat指令查看各端口和进程的相关情况。netstat -tunlp这将会显示所有占用端口的进程：[root@VM-centos ~]# netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 2012/python3 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1414/nginx: master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1213/sshd udp 0 0 127.0.0.1:323 0.0.0.0:* 546/chronyd udp 0 0 0.0.0.0:68 0.0.0.0:* 891/dhclient [root@VM-centos ~]#防火墙的操作本文仅提供CentOS7的防火墙常规操作，其他Linux发行版本请自行查阅相关文档。服务部署好后还是连不上的极大可能原因就在防火墙，云服务器不止有服务商提供的实例防火墙，还有系统自带的防火墙，注意放通所需协议的端口。虽然关防火墙确实是一劳永逸的方法，但是相对安全性大大降低。CentOS7的防火墙可用firewall-cmd指令操作：查看防火墙状态：firewall-cmd --state查看某个端口是否开放（以TCP80端口为例）：firewall-cmd --query-port=80/tcp查看已开放端口列表：firewall-cmd --list-port重启防火墙：firewall-cmd --reload开启某个端口（以TCP80端口为例）：firewall-cmd --zone=public --add-port=80/tcp --permanent关闭某个端口（以TCP80端口为例）：firewall-cmd --zone=public --remove-port=80/tcp --permanent关闭进程操作使用kill指令可以关闭进程，使用附加参数PID即可关闭指定进程。PID为进程唯一识别码。kill 2012赋予运行权限如果在运行某个程序出现permission denied报错，则可能没有运行权限，可以使用以下指令赋予最高权限：chmod 700 [ProcessName]系统信息查看使用uname指令查看操作系统、内核、CPU等信息：uname -a例如这样一台机子：[root@VM-centos ~]# uname -a Linux VM-centos 3.10.0-1160.11.1.el7.x86_64 #1 SMP Thu Jan 01 08:00:00 CST 1970 x86_64 x86_64 x86_64 GNU/Linux [root@VM-centos ~]#就可以得出它的架构是x86_64的，这对后续安装的服务版本提供了非常必要的关键信息。文件上传操作本文只记录利用OpenSSH客户端将文件从Windows系统上传至Linux云服务器。本操作不在已登录的SSH中运行，而是在Powershell中完成。scp D:\1.txt root@127.0.0.1:/root上述指令将本地盘符D盘下的文件1.txt上传到Linux云服务器的/root文件夹内。执行指令后会要求输入密码，正确后才能进行上传操作。完整上传示例：C:\Users\Administrator>scp D:\1.txt root@127.0.0.1:/root root@8.218.45.147's password: 1.txt 100% 3 0.1KB/s 00:00 C:\Users\Administrator>注意事项尽量选择root管理员账户登录操作，否则会提示权限不足操作失败（当提示符为#则处于管理账户）。Linux的指令可以使用Tab键补全，尤其是键入长文件名的时候尤为高效。3.部署Frp服务下载Frp包使用wget下载，注意选择与服务器相同架构的包，使用系统信息查看方法以确定架构。建议自行访问GitHub9仓库并使用最新版链接替换下载链接：wget https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz解压包解压的包名是下载的包名，请按实际情况填写，建议使用ls查看当前目录文件。tar -xzvf frp_0.48.0_linux_amd64.tar.gz定位目录定位到解压出来的文件夹目录下：cd frp_0.48.0_linux_amd64启动Frp服务建议让Frp处于后台运行并写入日志，这样即使关闭了SSH也可以保存运行：nohup ./frps -c frps.ini & > frp.log出现以下提示即说明启动成功，进程PID也可查看：[root@VM-centos frp_0.48.0_linux_amd64]# nohup ./frps -c frps.ini & > frp.log [1] 8865 [root@VM-centos frp_0.48.0_linux_amd64]# nohup: ignoring input and appending output to ‘nohup.out’放行端口这步很重要，多数部署完连不上的原因就是没有放行本地系统的防火墙端口，默认监听端口为7000/TCP。云服务器的话控制台记得放行实例对应的端口。firewall-cmd --zone=public --add-port=7000/tcp --permanent重启防火墙这步同样重要，如果不重启防火墙的话，放行端口操作不会生效。firewall-cmd --reload查询是否成功开启可以利用上文提到的端口占用查看和防火墙的操作相关内容查询，或者直接找台机子ping该主机端口。注意事项本例部署的Frp服务仅可用于TCP协议的端口转发，如需支持其他协议或链接方法请自行查阅相关文档。由于只开放了监听端口，并没有开放转发端口，所以客户端在连接前，需要根据客户端配置开放对应的转发端口。如需调整监听端口，可使用文本编辑操作对文件：./frp_0.48.0_linux_amd64/frps.ini进行相应修改。4.部署N2N服务（P2P_Party适用）下载N2N包由于梦羽大佬提供的链接为arm架构的包，不适用于绝大多数云服务商的架构，所以本文改为x86_64架构的包，下载前请使用系统信息查看方法以确认系统架构。wget https://github.com/lucktu/n2n/blob/master/Linux/Old/linux_x64/n2n_v2_linux_x64_v2.6.0_r250_static_by_heiye.zip解压包文件是零散的建议提前创建一个文件夹。unzip n2n_v2_linux_x64_v2.6.0_r250_static_by_heiye.zip启动服务进入程序所在文件夹内运行指令。建议使用nohup后台运行程序。默认端口为7654。nohup ./supernode -l 7654 &放行端口这步很重要，多数部署完连不上的原因就是没有放行本地系统的防火墙端口，默认监听端口为7654/UDP。云服务器的话控制台记得放行实例对应的端口。firewall-cmd --zone=public --add-port=7654/udp --permanent重启防火墙这步同样重要，如果不重启防火墙的话，放行端口操作不会生效。firewall-cmd --reload查询是否成功开启可以利用上文提到的端口占用查看和防火墙的操作相关内容查询，或者直接找台机子ping该主机端口。注意事项虽然不知道原因是什么，但是从该仓库下载的包解压不正常，会提示cannot find zipfile directory，遇到这种情况请自行前往仓库下载，再使用文件上传操作方法将文件手动上传，再解压即可成功解压。启动服务时会出现Permission denied错误，请使用赋予运行权限方法对软件提权。5.部署N2N服务（EasyN2N适用）安装libzstdyum install libzstd -y下载N2N包此处下载的包为n2n 3.0.0。wget https://github.com/ntop/n2n/releases/download/3.0/n2n-3.0.0-1038.x86_64.rpmRPM安装rpm -i n2n-3.0.0-1038.x86_64.rpm启动服务端口默认即为7654，其余启动参数见大佬提供的文档10。supernode -p 7654放行端口这步很重要，多数部署完连不上的原因就是没有放行本地系统的防火墙端口，默认监听端口为7654/UDP。云服务器的话控制台记得放行实例对应的端口。firewall-cmd --zone=public --add-port=7654/udp --permanent重启防火墙这步同样重要，如果不重启防火墙的话，放行端口操作不会生效。firewall-cmd --reload查询是否成功开启可以利用上文提到的端口占用查看和防火墙的操作相关内容查询，或者直接找台机子ping该主机端口。注意事项无写在最后其实也不是什么高深的有难度的文章，只是被其中的小细节折磨的不轻，遂著文以记之。应好友SweetCandy1的建议，整理并发布该篇文章，花了不少时间的说，毕竟又在一台新的云服务器上部署了一遍lmao总算也是摸索出了相对可靠的联机方式，和朋友们玩耍更加方便了w提一嘴，电信的海外链路感觉不大行？腾讯云海外服务电信或多或少都有丢包，阿里云好像目前香港的电信还可以没有出现丢包，相比之下移动链路反而相当稳定。这是怎么一回事捏（没啥文章还可能会寄的博客链接：SweetCandy233's Blog - 醉后不知天在水，满船清梦压星河 ↩黑客模拟器，但是通关并不能让你成为黑客（ ↩SakuraFRP yyds！ ↩某信申请ipv4动态公网IP应该简单点吧（ ↩P2P联机工具 P2P Party - 梦之圈 ↩使用N2N搭建虚拟局域网联机游戏（EasyN2N\小黄鸭） | Bug侠 (bugxia.com) ↩这玩意应该是云服务器自带的功能吧？ ↩ Linux vi/vim | 菜鸟教程 (runoob.com) ↩ Releases · fatedier/frp · GitHub ↩ EasyN2N 服务端（Supernode）附加参数 | Bug侠 (bugxia.com) ↩