frp 简介
frp 是一个开源项目, 采用 C/S 模式,将服务端部署在具有公网 IP 的机器上,客户端部署在内网或防火墙内的机器上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。
在此基础上,frp 支持 TCP, UDP, HTTP, HTTPS 等多种协议,提供了加密、压缩,身份认证,代理限速,负载均衡等众多能力。
根据对应的操作系统及架构,从 Release 页面下载最新版本的程序。
https://github.com/fatedier/frp/releases
也可以通过 wget 命令直接下载
wget https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_darwin_amd64.tar.gz
解压缩下载的压缩包,将其中的 frpc 拷贝到内网服务所在的机器上,将 frps 拷贝到具有公网 IP 的机器上,放置在任意目录。
https://www.cnblogs.com/hi-9527/p/15256371.html
https://www.cnblogs.com/mr-hu2009/p/16442173.html
https://zhuanlan.zhihu.com/p/405919449
https://www.cnblogs.com/nuo010/p/16041023.html
frp服务端:
用于部署在公网的服务器上,与内网通信转发流量。
配置服务端参数:
这里以 https 类型为例:
修改服务端文件 frps.ini 文件vim frps.ini
(按i开启编辑),设置 http 访问端口为 8080(端口根据自己需求定义);
[common]
#服务端口
bind_port = 7000
#转发web服务端口
vhost_http_port = 8011
#身份验证:服务端和客户端的 common 配置中的 token 参数一致则身份验证通过
token = 12345
#自定义二级域名,通过在 frps 的配置文件中配置 subdomain_host,就可以启用该特性。之后在 frpc 的 http、https 类型的代理中可以不配置 custom_domains,而是配置一个 subdomain 参数。
#只需要将 *.{subdomain_host} 解析到 frps 所在服务器。之后用户可以通过 subdomain 自行指定自己的 web 服务所需要使用的二级域名,通过 {subdomain}.{subdomain_host} 来访问自己的 web 服务。
subdomain_host = abcdefg1234.cn
#web管理端口
dashboard_port = 7500
#web管理用户名
dashboard_user = admin
#web管理密码
dashboard_pwd = admin
enable_prometheus = true
#日志保存
log_file = /usr/local/frp/frps.log
log_level = info
log_max_days = 3
编辑后保存退出(按“ESC”,再按“:”,输入“wq”)
启动方式:
配置完成后可以启动服务;
#前台启动
./frps -c ./frps.ini
#后台启动
nohup ./frps -c frps.ini > frps.log 2>&1 &
启动成功后,登录frp管理后台,默认 IP:7500,用户名:admin/密码:admin,即可查看服务连接;
(若外网无法访问,请通过防火墙查看端口情况!)
本地配置:
根据对应的操作系统及架构,从 Release 页面下载最新版本的程序。
修改客户端文件 frpc.ini ,如下:
[common]
#外网服务器的IP地址
server_addr = 0.0.0.0
#外网服务监听端口
server_port = 7000
#身份验证:服务端和客户端的 common 配置中的 token 参数一致则身份验证通过
token =123456
[web]#名字不能重复,否则会被覆盖
type = http
local_port = 80
custom_domains = test
访问:
在域名管理中,将域名 test.abcdefg1234.cn 解析到 0.0.0.0 (公网服务器地址)
云服务器安全组要放通 7000及8011端口
启动本地 80 端口的程序
分别启动服务器和客户端程序,启动后连接成功,即可通过外网访问内网主机服务;
打开浏览器输入:http://test.abcdefg1234.cn:8011
即可访问。
1、开启端口:
注意:
云服务器安全组以及防火墙需要开启对应的端口,如果是公网物理服务器,则需要开放相应防火墙端口,系统不一样的自己修改指令,当然可以直接关闭防火墙。
#添加监听端口
sudo firewall-cmd --permanent --add-port=7000/tcp
#添加管理后台端口
sudo firewall-cmd --permanent --add-port=7500/tcp
#查看添加的端口号
sudo firewall-cmd --reload
2、Linux注册系统服务(自选):
方法一(centos):
1、创建shell脚本nano /usr/local/frp/frps.sh
#!/bin/bash
cd /usr/local/frp/
./frps -c /usr/local/frp/frps.ini > /usr/local/frp/frps.log 2>&1 &
添加权限执行权限chmod +x /usr/local/frp/frps.sh
2、脚本添加到开机启动中:
在/etc/rc.d/rc.local中添加刚刚的脚本(注意需要填写全路径);
chmod +x /etc/rc.d/rc.local
3、重启测试;
方法二:
修改服务文件vim systemd/frps.service
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
#这里需要根据frps的安装路径,进行更改
ExecStart=/home/frp/frps -c /home/frp/frps.ini
[Install]
WantedBy=multi-user.target
复制文件到系统
cp systemd/frps.service /etc/systemd/system/
操作命令:
#启动测试
systemctl start frps.service
#查看启动状态
systemctl status frps.service
#停止
systemctl stop frps.service
#开机自启
systemctl enable frps.service
3、WINDOWS将FRP设置为服务并开机自启:
方法一:
有时会因为种种原因重启电脑,设置frp开机自启也省去了开机后需要手动开机的步骤。
windwos利用"任务计划程序"。在Frp同目录下新建一个"start.bat
" 文件。接着,右键编辑这个 start.bat:
@echo off
C:\frp_0.26.0_windows_386\frpc -c C:\frp_0.26.0_windows_386\frpc.ini
exit
在windows管理工具里找到"计划任务程序",添加"start.bat"文件的开机自启任务;
方法二:
https://www.freesion.com/article/4021267545/
方法三:
https://diannaobos.com/post/971.html
另外fprs.ini还有很多配置,可选配
# [必须]标识头
[common]
#服务监听的ip
bind_addr = 0.0.0.0
#[必须]frp连接通讯口,用于和客户端内网穿透传输数据的端口,可自定义。
bind_port = 7000
# 用于KCP协议UDP通讯端口,也可以和“bind_port”共用同一端口,如果没有设置,则kcp在frps中被禁用,可自定义。
kcp_bind_port = 7000
# 以帮助使UDP打洞穿透NAT,可自定义。
bind_udp_port = 7001
#访问web服务需要用到的端口,如果你想支持https,必须指定https端口监听
vhost_http_port = 8001
#https需要用到的端口
vhost_https_port = 443
# 指定 Dashboard (frp管理后台端口)的监听的 IP 地址
dashboard_addr = 0.0.0.0
#指定 Dashboard(frp管理后台端口) 的监听的端口
dashboard_port = 7500
# 指定访问 Dashboard(frp管理后台端口) 的用户名
dashboard_user = admin
# 指定访问 Dashboard (frp管理后台端口)的端口
dashboard_pwd = admin
#防止被随意注册,密钥token,可以设置为更复杂的
token = 123456
# 心跳配置,默认的心跳配置时间是30,不建议修改
heartbeat_timeout = 30
#frp内网穿透服务端监听的端口,如果不设置的话,所有端口都可以连接使用,但为为了不占用系统使用的端口号,限制只能使用服务端的指定端口,建议设置允许的坚挺端口,比如www.chuantou.org提供的内网穿透服务器就是开放50000-60000端口,
#
privilege_allow_ports = 2000-3000,3001,3003,4000-50000
#连接池的数量,如果frp内网穿透客户端设置的连接池的数量大于下面的数值,就会修改frp客户端的连接池为下面的数值
max_pool_count = 100
# 每个客户端最大可以使用的端口,0表示无限制
max_ports_per_client = 0
# 每个内网穿透可以创建的连接池上限,避免大量资源占用。可自定义。
max_pool_count = 5
# frp内网穿透服务端frps和frp内网穿透的客户端frpc两台电脑的时间差,如果设置为0的话,不校验时间差异,默认校验时间差为900秒。
authentication_timeout = 900
# 是否使用tcp复用,默认为true;
# frp只对同意客户端的连接进行复用;
tcp_mux = true
# 自定义二级域名,通过在 frps 的配置文件中配置 subdomain_host,就可以启用该特性。之后在 frpc 的 http、https 类型的代理中可以不配置 custom_domains,而是配置一个 subdomain 参数。
只需要将 *.{subdomain_host} 解析到 frps 所在服务器。之后用户可以通过 subdomain 自行指定自己的 web 服务所需要使用的二级域名,通过 {subdomain}.{subdomain_host} 来访问自己的 web 服务。
subdomain_host = frps.com
# 日志的记录级别,分为debug, info, warn, error四级,日志保存的天数,默认3天
# 日志存放路径
log_file = ./log/frps.log
# 日志记录类别
log_level = info
最多保存多少天日志,可自定义
log_max_days = 3
客户端还有更多配置如下,可根据需求添加
#[必须]标识头
[common]
#外网服务器的IP地址
server_addr = 116.85.28.230
#外网服务监听端口
server_port = 7000
#这个和服务端的token保持一致
token = 123456
# 客户端日志
log_file = ./frpc.log # 指定日志文件;
log_level = info # 指定日志等级;
log_max_days = 3
# 设置管理地址,用于通过http api控制frpc的动作,如重新加载;
admin_addr = 127.0.0.1
admin_port = 7500
admin_user = admin
admin_passwd = admin
# 初始连接池的数量上限,默认为0;
#pool_count = 5
# 是否启用tcp复用,默认为true;
tcp_mux = true
# 你的内网穿透名称,将显示为 {名称}.{对应服务名称}
# frpc的用户名,用于区别不用frpc的代理;
# user = your_name
# 决定首次登录失败时是否退出程序,否则连续登录到frps服务端,可选:false,true
login_fail_exit = true
# 用于连接服务器的协议,支持tcp、kcp、websocket;支持tcp和kcp,默认是tcp,注意:kcp需要服务端配置参数已开启,才支持。
protocol = tcp
# 使用tcp流复用,默认为true,可选:false,true,必须与frps服务端已经配置参数相同,否则服务端没有,可以不填此参数。
tcp_mux = true
# 为frp 客户端指定一个单独的DNS服务器;
#dns_server = 8.8.8.8
# 要启用的代理的名字,默认为空表示所有代理;
# start = ssh,dns
# 心跳检查
# heartbeat_interval = 30 # 失败重试次数
# heartbeat_timeout = 90 # 超时时间
#TCP的配置随便加
[ssh_01]
# 协议默认tcp,可选tcp,udp,http,https,stcp,xtcp;
type = tcp
# 本地地址
local_ip = 127.0.0.1
# 本地端口
local_port = 22
# 在服务器端开启的远程端口;
remote_port = 8022
# 是否加密服务端和客户端的通信信息,默认为不加密;
use_encryption = false
# 是否开启压缩,默认不开启;
use_compression = false
# 负载均衡配置
#group = test_group # 负载均衡组名,会将同一组内的客户端进行负载;
#group_key = 123456 # 负载均衡组密钥;
[web2]
# 协议默认tcp,可选tcp,udp,http,https,stcp,xtcp;
type = tcp
# 本地地址
local_ip = 127.0.0.1
# 本地端口
local_port = 80
# 在服务器端开启的远程端口;
remote_port= 8811
# 是否加密服务端和客户端的通信信息,默认为不加密;
use_encryption = false
# 是否开启压缩,默认不开启;
use_compression = false
# 负载均衡配置
#group = test_group # 负载均衡组名,会将同一组内的客户端进行负载;
#group_key = 123456 # 负载均衡组密钥;
#https和http 的端口在服务其上面已经定好了的,所以这里不能指定
[web]
type = https
local_ip = 127.0.0.1
local_port = 88
# 是否加密服务端和客户端的通信信息,默认为不加密;
use_encryption = false
# 是否开启压缩,默认不开启;
use_compression = true
# 访问web页面启用认证,用户名admin
http_user = admin
# 密码
http_pwd = admin
# 子域名,需要服务端配置了subdomain_host参数;
#subdomain = web01
# web的域名,和subdomain二选一
custom_domains = fy2018.online
# 指定用于路由的URL前缀;
#locations = /,/pic
# 配置http包头域名重写;
host_header_rewrite = example.com
# 添加包头信息X-From-Where: frp;
header_X-From-Where = frp
[web1]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = fy2018.online