如果你和你的朋友想要一起玩一些支持多人联机的游戏,比如《我的世界》、《雨中冒险2》等,但是你们又不在同一个局域网内,那么你可能会遇到一个问题:如何让你们的电脑互相连接,从而实现游戏本地联机呢?
有一种方法比较方便,那就是使用内网穿透。内网穿透是一种技术,它可以让你在不改变路由器设置或者开放端口的情况下,把你电脑上的某个端口的服务映射到公网上,从而让其他人可以通过公网IP和端口来访问你电脑上的服务。这样,你就可以把你电脑上搭建的游戏服务器映射到公网上,让你和你的朋友通过公网IP和端口来连接游戏服务器,从而实现游戏本地联机了。
市面上有很多提供内网穿透服务的软件,比如NATAPP、FRP、NPS等等。这些软件都有各自的优缺点,你可以根据自己的需求和喜好来选择一个。在这里,我以FRP为例来介绍如何使用内网穿透。
FRP是一个开源的内网穿透软件,它可以让你在不改变路由器设置或者开放端口的情况下,把你电脑上的某个端口的服务映射到公网上,从而让其他人可以通过公网IP和端口来访问你电脑上的服务。使用FRP的优点有:免费且开源、支持多种协议和应用、支持自定义域名和加密、支持负载均衡和压缩传输。
使用frp需要有一台持有公网IP的服务器,frp的内网穿透就是依靠端口转发,所以必须要有一台有公网IP的服务器才可以搭建。
这里我以阿里云的服务器举例。
搭建前建议先看下服务器运行的操作系统版本,我这里用的是centos7.8版本,推荐使用centos7以上的版本,Ubuntu推荐18及以上,winserver官方也是支持的,但是在这就只介绍Linux的版本先。

更换操作系统

选择系统版本
装完系统后直接远程登陆进去就可以。
登陆后使用
wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
指令下载FRP服务端
下载过程可能有些慢,如果甚至都连接不上可以采取下面这种方法
进入winscp官网,下载winscp
https://winscp.net/eng/index.php
下载后安装进入软件界面

主机名填写服务器的公网IP,用户名是操作系统的根用户名,默认是root,密码就是装centos时设置的密码
登入服务器后默认进入主目录,如果不小心出去了就直接按下ctrl+h返回主目录。
接下来直接下载FRP服务端,将FRP服务端下载到本地,浏览器直接打开这个链接开始下载 https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz ,下载后将文件传输进刚才登陆上服务器的winscp客户端,将本地的FRP客户端文件传入服务器的主目录中。

返回在阿里云打开的远程登陆工具,执行以下命令
tar -zxvf frp_0.33.0_linux_amd64.tar.gz
解压主目录的压缩包
cd frp_0.33.0_linux_amd64/
进入解压出来的目录
vim frps.ini
使用vim打开FRP服务端的配置文件
摁下i键在vim文本浏览器中开启编辑模式
开启后最下方会有[insert]提示
删去配置文件中所有内容,在配置文件中添加以下词条:
[common]
bind_port = 7000
token = test
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
bind_port是服务开启端口。token是授权码,可随意更改,dashboard_port是服务面板端口,有利于直观看清服务器状态,建议开启。user和pwd是登入面板的账号密码,也可改。但是一旦应用后不要轻易更改,需要重新删除一些文件才可生效配置。
接下来执行以下命令
sudo mkdir -p /etc/frp
sudo cp frps.ini /etc/frp
sudo cp frps /usr/bin
sudo cp systemd/frps.service /usr/lib/systemd/system/
sudo systemctl enable frps
sudo systemctl start frps
可以直接全部粘贴进远程连接面板,面板会自动执行。
每个命令的功能如下:
sudo mkdir -p /etc/frp: 创建一个名为 /etc/frp 的目录, -p 参数表示如果该目录已存在也不会报错。
sudo cp frps.ini /etc/frp: 将当前目录下的 frps.ini 文件复制到 /etc/frp 目录下,该文件可能是一个配置文件。
sudo cp frps /usr/bin: 将当前目录下的 frps 文件复制到 /usr/bin 目录下,这通常是为了将可执行文件添加到系统的路径中,使得在终端中可以直接运行该文件。
sudo cp systemd/frps.service /usr/lib/systemd/system/: 将当前目录下的 frps.service 文件复制到 /usr/lib/systemd/system/ 目录下,该文件是一个Systemd服务单元文件,用于启动和管理frps服务。
sudo systemctl enable frps: 启用 Systemd 服务管理器来管理 frps 服务,使得系统可以在启动时自动启动该服务。
sudo systemctl start frps: 启动 frps 服务,使得该服务可以开始运行。
FRP管理面板界面

更改服务端配置文件后需要将/usr/bin下的frps文件删除后重新生成,并且disable frps再enable,stop frps再start。
接下来前往阿里云的实例的安全组配置防火墙,放行下面三个端口

在浏览器中输入套接字,服务器的公网IP:7500(刚才配置文件中的面板端口)
正确进入后即代表开启服务
至此,FRP服务端配置完毕,现在开始下载客户端连接服务端。
浏览器进入连接
https://github.com/fatedier/frp/releases/
选择frp_0.48.0_windows_amd64.zip版本下载,没找到记得点开show all assets
下载后解压,进入文件夹找到frpc.ini,这是客户端的配置文件,双击打开后改为
[common]
server_addr = x.x.x.x //服务器公网IP
server_port = 7000
token = test
[lianji]
local_ip = 127.0.0.1
local_port = 25565
remote_port = 25565
server_addr那行改为服务器公网IP,注意token一致,如果游戏开放的端口不是25565 ,改下local监听端口

在FRP客户端文件夹中按住shift右键,选择终端,在终端中输入./frpc.exe 启动FRP客户端

正确连接后应该是这样
至此,内网穿透搭建完成,打洞完成。
游戏实例:
以minecraft 1.12版本举例,在开启内网穿透的电脑上打开一个存档,选择对局域网开放,默认开放25565端口,如果提示的是其他端口就去客户端配置文件改下local监听端口,关闭终端重新打开执行下命令。


接下来在要联机的电脑中也打开相同版本的minecraft,title界面选择多人游戏,选择添加服务器,在服务器地址栏中写上 服务器的公网IP:25565(如果没有在25565开启则填写实际端口),添加完成后即可联机。

实测延迟只有20ms左右
