frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力。类似的还有:ngrok、lanproxy等(frp和ngrok都是用go实现,lanproxy是用java实现)。利用内网穿透,我们可以实现微信调试,将内网的应用对外展示等。今天我们就来搭建frp服务器端和客户端。
1.服务器端搭建
1.1下载软件
下载软件:FRP Releases支持多平台,需根据服务器系统和CPU架构选择下载。下载的包是同时包含服务器端和客户端软件的。下载速度可能会比较慢,请耐心等会。
直接在root 目录下执行
## 下载
wget https://github.com/fatedier/frp/releases/download/v0.35.1/frp_0.35.1_linux_arm64.tar.gz
## 解压
tar zxf frp_0.35.1_linux_arm64.tar.gz
## 重命名为frp目录
mv frp_0.35.1_linux_arm64 frp
## 进入frp目录 配置frps.ini文件
cd frp
vim frps.ini
服务端配置 frps.ini是服务端的配置文件。 完整的配置说明可以参考:frps配置 例如我的配置如下:
[common]
# frp服务端端口
bind_port = 7000
# 搭建http web服务,监听的端口(例如:80,但由于80端口留给nginx,此处改为其它端口)
vhost_http_port = 7080
# 配置服务器管理看板
# 限定访问ip,如果不限制访问请设置为:0.0.0.0。
# 监听端口,管理员的登录名和密码
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = username
dashboard_pwd = password
# 设置记录日志的文件
# 日志级别:trace, debug, info, warn, error,从低到高
# 日志最多保留的天数
log_file = /root/frp/log/stdout.log
log_level = info
log_max_days = 3
# 认证token
token = token
# 如果设置subdomain_host,可以在客户端frpc中为http或https设置子域名,比如:test,这可以通过test.frp.abc.com访问客户端。
subdomain_host = frp.abc.com
配置好后,记得在服务器安装组规则开放以上3个端口7000、7080、7500
现在就可以通过命令:./frps -c ./frps.ini启动frps服务了。 当然也可以配置自动启动, 笔者使用systemctl来控制启动,以服务端为例 首先 sudo vim /lib/systemd/system/frps.service 在frps.service里写入以下内容
[Unit]
Description=fraps service
After=network.target network-online.target syslog.target
Wants=network.target network-online.target
[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/root/frp/frps -c /root/frp/frps.ini
[Install]
WantedBy=multi-user.target
然后启动 frps sudo systemctl start frps 再打开自启动 sudo systemctl enable frps 同时
重启 sudo systemctl restart frps 停止 sudo systemctl stop frps 查看应用日志 sudo systemctl status frps 客户端自启动配置类似。
FRP与Nginx共用80端口 在nginx的配置文件目录,添加frp.abc.com.conf配置文件,然后配置nginx反向代理。 如果是宝塔的话,直接在软件商店已安装打开nginx设置 ->配置修改,按需添加下列配置 配置内容如下:
# 服务器端管理后台
server {
listen 80;
server_name frp.abc.com;
location / {
proxy_pass http://127.0.0.1:7500;#意思是这个frp.abc.com访问服务器80端口时转到7500端口上
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}
}
# 代理http web
server {
listen 80;
server_name *.frp.abc.com;
location / {
proxy_pass http://127.0.0.1:7080;#意思是访问服务器80端口时转到7080端口上
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}
}
# 如果启用SSL
server {
listen 443 ssl;
server_name *.frp.abc.com;
# ssl on;
ssl_certificate /etc/letsencrypt/live/frp.abc.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/frp.abc.com/privkey.pem;
ssl_prefer_server_ciphers on;
ssl_session_timeout 60m;
location / {
proxy_pass http://127.0.0.1:7080;#意思是这个泛*.frp.abc.com域名访问服务器443端口时转到7080端口上
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}
}
客户端配置 frpc.ini是客户端的配置文件。 完整的配置说明可以参考:frpc配置。 例如我的配置内容:
[common]
server_addr = 服务端ip
server_port = 7000 #服务端bind_port端口
token = 服务端设置的token #要一致
# 配置日志文件
# 日志级别:trace, debug, info, warn, error
log_file = ./frpc.log
log_level = info
log_max_days = 3
# 客户端管理配置
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
[ssh]
type = tcp # 协议类型
local_ip = 127.0.0.1 #客户端本地主机ip
local_port = 22 #映射链接到本地的22端口上
remote_port = 6000 #从服务器访问到本地的端口 记得需服务器安全组开发放此端口 --这段配置的意思是 通过访问服务端IP x.x.x.x:6000端口就能反向代理访问到本地的127.0.0.1:22端口上
[web]
type = http # 协议类型
local_ip = 127.0.0.1 #客户端本地主机ip
local_port = 80 #映射链接到本地的80端口上
subdomain = *.frp.abc.com #直接来个泛解析,省的以后一个一个的配置解析,当然,也可以单个配置 看下一段
#单个解析 每修改配置文件一次就要重新确定客户端,服务器端也是一样的
[web1]
type = http
local_ip = 127.0.0.1
local_port = 80 #当然也可以映射到其他端口
subdomain = subb.frp.abc.com
服务器配置 二级域名frp.abc.com或泛解析二级域名.frp.abc.com 进入域名解析 添加记录 先添加 frp 指向到服务器ip 在添加 .frp 指向到服务器ip