MC-frp映射搭建

本篇使用Frp搭建了一个内网穿透,满足无公网的服务器的外网访问需求。

环境信息

  • Frp版本:0.61.1
  • 服务端:腾讯轻量级应用服务器-带公网IP

前言

官方文档地址:链接

frp项目地址:链接

frp经过多次升级,不仅可以实现普通的内网穿透,而且还能够实现xtcp实现P2P打洞穿透。

本文将在一个公网IP的服务器上架设一个frps,并在MC服务器端添加frpc服务,启用普通frp代理以及P2P内网穿透,实现服务器的外网访问。

服务器端frps

配置文件

服务端的配置较为简单,只需要设置端口和身份验证即可:

1
2
3
4
# frp服务端口,记得打开对应防火墙
bindPort = 7000
# token只需要服务端和客户端一致即可
auth.token = "password"

需要注意的是,frp服务监听的端口和之后客户端要映射出去的端口都需要开放防火墙。

之后,使用命令即可开启服务:

1
./frps -c ./frps.toml

设置为系统服务

由于我的服务器没有其他服务,直接使用screen运行即可。

客户端frpc

服务器端配置-被访问者

在MC服务器端需要运行frpc客户端,需要配置两种代理:一种是普通TCP代理,实现正常的内网穿透;另外一种为XTCP代理,实现P2P穿透。

配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
serverAddr = "x.x.x.x"
serverPort = 7000 # 和服务器bindPort相同
loginFailExit = false # 第一次连接失败后不退出
auth.token = "password"

[[proxies]]
name = "mc1201" # 代理名,在本地需唯一
type = "tcp"
localIP = "127.0.0.1"
localPort = 25565 # 本地端口
remotePort = 25565 # 在服务器端开放的端口
# p2p映射
[[proxies]]
name = "mc1201_p2p"
type = "xtcp"
# 只有共享密钥 (secretKey) 与被访问端一致的用户才能访问该服务
secretKey = "password2"
localIP = "127.0.0.1"
localPort = 25565
# p2p打洞失败后使用stcp
[[proxies]]
name = "mc1201_stcp"
type = "stcp"
# 只有共享密钥 (secretKey) 与被访问端一致的用户才能访问该服务
secretKey = "password3"
localIP = "127.0.0.1"
localPort = 25565
# ssh保留代理设置
[[proxies]]
name = "ssh"
type = "stcp"
secretKey = "password4"
localIP = "127.0.0.1"
localPort = 22

记得在frps端remotePort开放防火墙。

客户端配置-游戏客户端

游戏客户端可以使用frps公网ip访问,或者使用frpc客户端利用客户端访问。使用p2p访问配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "password"

[[visitors]]
name = "p2p_mc1201_visitor"
type = "xtcp"
# 要访问的 P2P 代理的名称
serverName = "mc1201_p2p"
secretKey = "password2"
# 绑定本地代理端口
bindAddr = "127.0.0.1"
bindPort = 25565
# 如果需要自动保持隧道打开,将其设置为 true
keepTunnelOpen = true
fallbackTo = "stcp_mc1201_visitor"
fallbackTimeoutMs = 10000 # 超时时间10s

# 为防止失败,添加stcp链接在失败时使用
[[visitors]]
name = "stcp_mc1201_visitor"
type = "stcp"
serverName = "mc1201_stcp"
secretKey = "password3"
bindPort = -1

当连接 127.0.0.1:25565 超过 10s p2p 打洞还未成功的话,会回退到使用 stcp_mc1201_visitor 建立连接。

fallback 后,之前触发的打洞操作仍然会继续,一般来说打洞完成需要的耗时会比较长。

如果打洞成功,下次建立新的连接时,将不需要再次打洞,会很快完成连接建立,不会触发 fallback。

需要注意根据访问端和被访问端的延迟情况来合理设置超时时间,以避免超时时间太短,即使打洞成功连接也来不及建立,而一直触发 fallback。

stcp_mc1201_visitor 的 bindPort 设置为 -1 表示不需要监听物理端口,只接受 fallback 的连接即可。

对于腐竹,需要ssh管理,还需要以下配置:

1
2
3
4
5
6
[[visitors]]
name = "ssh"
type = "stcp"
serverName = "ssh"
secretKey = "password4"
bindPort = 8000
1
2
# 使用以下命令访问机器
ssh -o Port=8000 test@x.x.x.x

服务端设置系统服务

为保证mc服务器正常进入代理,需要使用systemd添加服务。

使用文本编辑器在 /etc/systemd/system 目录下创建一个 frpc.service 文件,写入内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
# 服务名称,可自定义
Description = frp client
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frpc的命令,需修改为您的frpc的安装路径
ExecStart = /path/to/frpc -c /path/to/frpc.toml

[Install]
WantedBy = multi-user.target

之后启动服务:

1
2
3
4
5
6
7
8
9
10
# 启动frp
sudo systemctl start frpc
# 停止frp
sudo systemctl stop frpc
# 重启frp
sudo systemctl restart frpc
# 查看frp状态
sudo systemctl status frpc
# 设置开机自启
sudo systemctl enable frpc

连接服务器

在学校内网用户,直接使用服务器内网地址即可连接。

在学校外但网络环境好的用户,使用分发的frp客户端使用frpc.exe -c frpc.toml启动连接,然后使用127.0.0.1进行连接。

在学校外但网络环境(nat)不好的用户,直接使用frps服务器地址即可连接。