文章目录
背景:斥二十块巨资买了个最低的规格云服务,MySQL之类的常用软件都无法正常运行!想用出租屋内的主机安装数据库,云服务单纯的运行代码,但出租屋用的是共享宽带没有公网IP无法直接通过公共网络访问出租屋里自己的主机,于是找到了frp这个神器。
frp
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
配置非常简单易用,甚至直接看Release包解压出来的frps_full.ini和frpc_full.ini折腾一会也能配置起来。
官方文档: https://gofrp.org/docs/
frp源码地址: https://github.com/fatedier/frp
官方提供的frp架构图如下,由下图可知,需要一台具有公网IP的主机运行frps,如果没有可以花二三十块卖一个最低配置的云主机
下载frp到服务端主机和客户端主机上并分别解压
- Linux
wget https://github.com/fatedier/frp/releases/download/v0.49.0/frp_0.49.0_linux_amd64.tar.gz
tar -zxvf frp_0.49.0_linux_amd64.tar.gz
# 这里我将frp安装在/etc/frp下,也可以根据自己的喜好放在别的路径,后面的步骤改成相应的路径即可
sudo mv frp_0.49.0_linux_amd64 /etc/frp
2.Windows下的frp软件包下载连接
https://github.com/fatedier/frp/releases/download/v0.49.0/frp_0.49.0_windows_amd64.zip
服务端
修改服务端配置
打开配置文件
vi /etc/frp/frps.ini
更新配置文件
[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
# 授权码,我这里使用随机生成的UUID作为Token,客户端的Token要是这里的一致才可以正常通讯
token = 35ee1664-8bfa-e1ed-3855-02963c81342a
# 启用TLS,如果不想使用TLS或者没有证书文件,注释掉这三行即可
# tls_only = true
# tls_cert_file = /home/cert/server.crt
# tls_key_file = /home/cert/server.key
# tls_trusted_ca_file = ca.crt
# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,这里演示设置的弱密码,建议实际应用中尽可能设置复杂,虽然Web只是展示,但有暴露端口信息的风险
dashboard_user = admin
dashboard_pwd = 123456
enable_prometheus = true
# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
运行服务端程序
./frps -c ./frps.ini
客户端
配置一个或多个客户端都,可根据自己的需求来配置,这里我配置了两个客户端:
- 运行在虚拟机的Linux
- 运行虚拟机的Windows主机(虚拟机遇到无法连接的问题的时候远程桌面来处理)
修改客户端配置(Linux)
vi /etc/frp/frpc.ini
以下我配置了[ssh]/[mysql]/[web] 三个代理,请根据自己实际的需求进行增加或删减代理配置,代理的名字可以自定义但要全局惟一。
[common]
server_addr = 这里修改成公网主机的IP
# 与frps.ini的bind_port一致
server_port = 7000
# 与frps.ini的token一致
token = 35ee1664-8bfa-e1ed-3855-02963c81342a
# 配置ssh服务
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 这个自定义,之后再ssh连接的时候要用
remote_port = 6022
[mysql]
use_encryption = true
type = tcp
local_ip = 127.0.0.1
local_port = 3306
remote_port = 6006
[web]
type = http
local_ip = 127.0.0.1
# 本地运行Web服务使用的端口号,我这里使用的是9095
local_port = 9095
custom_domains = 公网IP或者公网IP对应的域名
# 自定义的远程服务器端口,例如8081,那么访问的时候就可以通过: http://公网IP(或域名):8081 来访问内网的Web了。
remote_port = 8081
运行客户端(Linux)
- 运行frpc
sudo ./frpc -c frpc.ini
- 测试SSH是否能成功连接
用ssh命令或者其它terminal工具连接测试
ssh username@公网IP -p 6022
username: 虚拟机里的Linux系统用户名(即内网中需要穿透的系统登录用户)
6022:frpc.ini中remote_port配置的值。
Windows客户端配置远程桌面及SSH
配置Windows主要是为:
- 当虚拟机遇到问题连不上的时候远程桌面到宿主机上排查。
- 只是虚拟机中的frpc出问题了,可以先SSH到Windows宿主机,再用本地IP地址二次SSH到虚拟机中的Linux操作frpc。
如无相关需要无需求请直接忽略这个步骤。
[common]
server_addr = 这里修改成公网主机的IP
#用于frp服务客户端和服务端通讯的端口,需要再服务器防火墙设置里面放行该端口,例如:7000,需要与服务端bind_port保持一致。
server_port = 7000
# token要与服务端的保持一致,建议设置复杂一些。
token = 35ee1664-8bfa-e1ed-3855-02963c81342a
# 内穿穿透的连接名称,可以自定义,但要全局惟一。
[mstsc]
type = tcp
local_ip = 127.0.0.1
# Windows远程连接端口
local_port = 3389
remote_port = 7003
#用于frp服务客户端和服务端通讯的端口,需要再服务器防火墙设置里面放行该端口,例如:7000,这个端口不能与服务端bind_port设置成同一个,且每一个内网穿透均需要单独设置一个remote_port。
# proxy name 可以自己定义但要求全局惟一,前面的Linux客户端已经使用了[ssh]这里使用[win_ssh]
[win_ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 1022
- Windows默认是没有启用SSH Service的功能的,需要到:设置-> 应用-> 可选功能->添加可选功能->OpenSSH服务器
- 打开服务窗口(service)->OpenSSH Server->右键点击启动(右键属性启动类型修改成自动即可开机启动OpenSSH Server)
安装完后,已安装功能中会显示有OpenSSH服务器
启动和设置开机启动Open SSH Server
运行客户端(Windows)
- 在命令窗口进入到frp的解压目录下执行frpc
frpc.exe -c frpc.ini
- 测试SSH是否能成功连接
ssh username@公网IP:1022
username: 宿主机Windows系统的用户名(即内网中需要穿透的系统登录用户)
1022:frpc.ini中remote_port配置的值。
从目录结构和系统版本看,是Windows没错了!
3. 再测试一下远程桌面是否能登录
看到这个页面基本可以确定可以连接上了
查看状态
frp运行成功后,可以通过浏览器访问查看所有客户端主机连接状态。
根据实际情况修改成对应的值即可。
http://公网主机IP:7500
注:
- 7500是frps.ini中配置的dashboard_port
- 账号密码就是前面配置的dashboard_user和dashboard_pwd的值
配置开机启动(可选)
(Linux)配置systemctl来控制frps
sudo vi /etc/systemd/system/frps.service
将frps可执行文件和配置文件的路径改成你所安装的路径即可
[Unit]
Description = frps service
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart =/etc/frp/frps -c /etc/frp/frps.ini
[Install]
WantedBy = multi-user.target
systemctl 操作frps
# 启动frps
sudo systemctl start frps
# 开机自动启动frps
sudo systemctl enable frps
# 重启frps
sudo systemctl restart frps
# 停止frps
sudo systemctl stop frps
# 查看frps状态
sudo systemctl status frps
(Linux)配置systemctl来控制frpc客户端开机启动
sudo vi /etc/systemd/system/frpc.service
注意:
- 将frpc可执行文件和配置文件的路径改成你所安装的路径即可。
- 这里的配置与服务端的配置的区别只有frpc与frps和配置文件frpc.ini与frps.ini的差异不要混淆了。
[Unit]
Description = frpc service
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frpc的命令,需修改为您的frpc的安装路径
ExecStart =/etc/frp/frpc -c /etc/frp/frpc.ini
[Install]
WantedBy = multi-user.target
systemctl 操作frpc
# 启动frps
sudo systemctl start frpc
# 开机自动启动frps
sudo systemctl enable frpc
# 重启frps
sudo systemctl restart frpc
# 停止frps
sudo systemctl stop frpc
# 查看frps状态
sudo systemctl status frpc
Windows 设置开机启动frp
新建启动脚本D:\XXX\frp_0.49.0_windows_amd64\start.bat
注:请根据实际情况修改脚本及的路径
@echo off
:home
D:\XXX\frp_0.49.0_windows_amd64\frpc -c D:\XXX\frp_0.49.0_windows_amd64\frpc.ini
goto home
Window开始按钮-> Windows管理工具-> 任务计划程序
到此,已经完成了所有的配置
配置过程中遇到的问题列表
- new proxy [web] type [http] error: type [http] not support when vhost_http_port is not set
解决:在服务端的配置加添加vhost_http_port,这里我使用端口号为8081,请根据实际情况修改对应端口号
vhost_http_port = 8081
-
new proxy [web] type [http] error: proxy [web] domain conf check error: subdomain is not supported because this feature is not enabled in remote frps
原因:因为服务端的配置frps.ini里没有配置subdomain_host ,但客户端的配置文件frpc.ini中配置了subdomain_host
解决: 删除客户端中的subdomain_host,或者在服务端添加subdomain_host的配置。 -
[http.go:119] do http proxy request [host: XXX.XXX.XXX.XXX:8081] error: no route found: XXX.XXX.XXX.XXX /login
解决: 在客户端添加custom_domains = XXX.XXX.XXX.XXX ,其中是XXX.XXX.XXX.XXX公网IP,如果如果公网IP绑定有域名则可以直接使用域名代替(如果这里填写IP那只能通过IP访问,如果填写域名就只能通过域名访问)