frp实现内网穿透极简教程
本文是内网穿透极简教程,为求简洁,我们不介绍为什么内网穿透也不介绍其原理,这里假设各位读者都已经明确的知道自己的目的,本文仅介绍如何安装配置 frp 实现内网穿透。
简单来说,内网穿透就是实现将内网的端口转发到公网,从而实现公网对内网资源的访问。为此,我们需要一台具有公网 IP 的 VPS 服务器(各 VPS 服务提供商如阿里云、腾讯云等均可),和一台需要被穿透的内网设备(以下称客户端)。
frp安装
直接去 github 发布页面 下载压缩包,客户端和服务器都需要,按照各自的机器类型下载对应的压缩包,然后解压:
wget https://github.com/fatedier/frp/releases/download/v0.42.0/frp_0.42.0_linux_amd64.tar.gz
tar xf frp_0.42.0_linux_amd64.tar.gz
服务器端配置
注意:本节操作均在 VPS 服务器端
解压完成后进入目录,可以看到几个可执行文件和 ini 配置文件:
cd frp_0.42.0_linux_amd64/
ls -l
-rw-r--r-- 1 1001 121 11358 Apr 22 11:42 LICENSE
-rwxr-xr-x 1 1001 121 10936320 Apr 22 11:38 frpc
-rw-r--r-- 1 1001 121 126 Apr 22 11:42 frpc.ini
-rw-r--r-- 1 1001 121 10814 Apr 22 11:42 frpc_full.ini
-rwxr-xr-x 1 1001 121 14016512 Apr 22 11:38 frps
-rw-r--r-- 1 1001 121 159 May 4 17:15 frps.ini
-rw-r--r-- 1 1001 121 5460 Apr 22 11:42 frps_full.ini
drwxr-xr-x 2 1001 121 4096 Apr 22 11:42 systemd
其中 frps, frps.ini
、fprc, frpc.ini
是我们主要要用到的可执行文件和对应的配置文件,前两者的 s 表示的是 server ,即服务器;而后两者的 c 表示的是 client 客户端,我们现在是在配置服务器端,自然是关注前者。
编辑 frps.ini
:
[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
- bind_port 表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。
- dashboard_port 是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。
- token 是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。
- dashboard_user 和 dashboard_pwd 表示打开仪表板页面登录的用户名和密码,自行设置即可。
- vhost_http_port 和 vhost_https_port 用于反向代理HTTP主机时使用,本文不涉及HTTP协议,因而照抄或者删除这两条均可。
没有特殊需要的话端口按默认值配置即可,token、dashborad_user 和 dashboard_password 几项记号并保护好,后面要用。
还有一点要注意的是:确认你的 VPS 服务器是否开放了对应的端口,若未开放需要到服务提供商的控制台开放。
配置完成之后尝试运行:
./frps -c frps.ini
得到类似如下输出,则说明配置基本成功:
2022/05/04 20:52:27 [I] [root.go:200] frps uses config file: frps.ini
2022/05/04 20:52:27 [I] [service.go:194] frps tcp listen on 0.0.0.0:7000
2022/05/04 20:52:27 [I] [service.go:237] http service listen on 0.0.0.0:10080
2022/05/04 20:52:27 [I] [service.go:252] https service listen on 0.0.0.0:10443
2022/05/04 20:52:27 [I] [service.go:293] Dashboard listen on 0.0.0.0:7500
2022/05/04 20:52:27 [I] [root.go:209] frps started successfully
我们可以去查看一下 dashboard,打开浏览器输入 URL:xx.xxx.xxx.xx:7500 ,然后输入我们刚才配置的用户名和密码即可进入,大概长这样:
这一步也没有问题的话服务器端就配置成功了。
我们 Ctrl-C 终止掉刚才的程序,改为后台运行,因为我们总是需要端口转发程序一直运行在,但又不需要操作它,因此放在后台,保存日志文件即可:
nohup ./frps -c frps.ini 2>&1 > frps.log &
执行上述命令,frp 服务将运行在后台并将日志输出到 frps.log
,退出当前 terminal 即可。
客户端配置
注意:本节操作均在本地客户端
还是下载对应的压缩包并解压,进入目录,还是那些文件,我们现在是在客户端 client ,因此,我们现在要关注的是 fprc, frpc.ini
这两个文件。
编辑 frpc.ini
:
[common]
server_addr = xx.xxx.xxx.xx
server_port = 7000
token = 12345678
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001
[test]
type = tcp
local_ip = 0.0.0.0
local_port = 7100
remote_port = 7200
[xxx]
type = tcp
local_ip = 0.0.0.0
local_port = 7300
remote_port = 7400
common 字段的 server_addr 为服务端公网 IP 地址。其他两项 server_port, token 就是我们在服务器端配置过的内容,保持一致即可。
其余的 rdp ,xxx 等字段就是用户可以定义的规则,根据自己转发的是什么服务自行命名即可
- type 表示转发的协议类型,如 TCP 和 UDP 。
- local_port 是本地应用的端口号,填入该项服务在本机实际使用的端口号。
- remote_port 是该项服务在服务端开放的端口号。
与服务器端类似,运行
./frpc -c frpc.ini
出现类似以下输出说明配置成功,
2022/05/04 21:11:10 [I] [service.go:349] [ecc57bb476f85c28] login to server success, get run id [ecc57bb476f85c28], server udp port [0]
2022/05/04 21:11:10 [I] [proxy_manager.go:144] [ecc57bb476f85c28] proxy added: [test]
2022/05/04 21:11:10 [I] [control.go:181] [ecc57bb476f85c28] [test] start proxy success
同样是放到后台运行:
nohup ./frpc -c frpc.ini 2>&1 > frpc.log &
测试
我们用一个简单的 flask 服务测试一下端口转发的效果。
先准备一个 hello.py
:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
注意我们在配置的测试端口是:本地为 7100,远程为 7200,因此这里我们应该将服务运行到本地的 7100 端口:
python -m flask run --host 0.0.0.0 -p 7100
frp 会帮我们转发到远程的 7200 端口(打码的地方换成你的服务器 IP):
并且,我们还可以再去 dashboard 中看一下:
已经可以查看到我们的测试服务及其流量,即告测试成功。
设置开机自启动
我们可以通过 Linux 的 systemd 来将 frp 封装为一种服务,并设置开机自启动。以下以 frp 客户端 frpc 为例,进行开机自启动设置。
在 /etc/systemd/system/ 目录下创建服务文件:
cd /etc/systemd/system/
sudo vim frpc.service
填入以下信息。注意,其中 EcecStart
中的文件路径需替换为自己的。
[Unit]
Description=frpc
After=network.target
Wants=network.target
[Service]
Restart=on-failure
RestartSec=5
ExecStart=/home/song/frp/frpc -c /home/song/Software/frp/frpc.ini
[Install]
WantedBy=multi-user.target
填写完成后,执行以下命令,设置开机自启动。
# 刷新服务列表
systemctl daemon-reload
# 设置开机自启
systemctl enable frpc.service
# 启动服务
systemctl start frpc.service
服务可能会在开机时启动失败。因此在设置开机自启命令时,最好在 [Service] 中定义好 Restart 和 RestartSec。
若有错误或疑问,欢迎留言交流。
Ref:
https://sspai.com/post/52523
https://blog.csdn.net/qidu1998/article/details/118047226