利用 frp 进行内网穿透

本文最后更新于:2020-08-22 15:38

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

上一篇文章 利用 OpenVPN 加速饥荒服务器 讲解了如何利用 OpenVPN 加速饥荒服务器,但是还是遗留了两个问题:

  • 连接 OpenVPN 后,如何再用 SSH 访问物理主机
  • 无法通过 IP 直连进入我们的饥荒服务器

frp 可以帮我们解决这两个问题

下载 frp

分别在物理主机和云服务器上下载 frp,代码如下

1
2
3
4
cd ~
wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_arm64.tar.gz
tar xzf frp_0.33.0_linux_arm64.tar.gz
mv frp_0.33.0_linux_arm64 frp

修改云服务器上的配置文件

1
nano ~/frp/frps.ini

删除里面的内容,修改为下面的内容

1
2
3
4
5
6
7
8
9
10
[common]
bind_port = 3380
bind_udp_port = 3381
vhost_http_port = 3382
vhost_https_port = 3383
dashboard_port = 3333
dashboard_user = admin
dashboard_pwd = admin
# privilege_token 自己随意设置
privilege_token = 123456789

运行云服务器上的 frp

1
2
3
screen -S frp
cd ~/frp
./frps -c ./frps.ini

然后按 Ctrl + A,再按 D 退出 screen 即可

修改云服务器上的配置文件

1
nano ~/frp/frpc.ini

删除里面的内容,修改为下面的内容

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
[common]
# server_addr 改为云服务器的公网 IP
server_addr = 1.1.1.1
server_port = 3380
# privilege_token 和上面设置的 privilege_token 一致即可
privilege_token = 123456789
login_fail_exit = false

# []内的名字随意 便于识别即可
[ssh]
type = tcp
local_ip = 127.0.0.1
# 这里发转本地的 22 端口 到远程(即云服务器上)的 4022 端口
local_port = 22
remote_port = 4022

# []内的名字随意 不能重复
[dst1]
# 饥荒使用 udp协议传输
type = udp
local_ip = 127.0.0.1
# local_port 和 remote_port 保持一致,是饥荒服务器每个世界的端口,默认地上世界的端口是 10999,根据具体情况修改
local_port = 10999
remote_port = 10999

# []内的名字随意 不能重复
[dst2]
# 饥荒使用 udp协议传输
type = udp
local_ip = 127.0.0.1
# local_port 和 remote_port 保持一致,是饥荒服务器每个世界的端口,默认地洞的端口是 10998,根据具体情况修改
local_port = 10998
remote_port = 10998

如果是多层世界的话,根据具体情况酌情添加配置

运行物理主机上的 frp

1
2
3
screen -S frp
cd ~/frp
./frpc -c ./frpc.ini

然后按 Ctrl + A,再按 D 退出 screen 即可

用 SSH 连接你的物理主机

1
ssh -p 4022 用户名@云服务器IP

注意,这里 IP 是云服务器的 IP,即通过云服务器的 IP 连接物理主机。因为上面我们将物理主机的 22 端口转发的云服务器上的 4022 端口了。

查看 frp 状态

浏览器打开 1.1.1.1:3333 即可参看 frp 状态

1.1.1.1 改为云服务器的公网 IP 即可

参考文献

fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.