前言
仅供自己学习记录
一、简介
1.1 简述
- frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议,最牛逼最好用的完全开源的内网穿透工具frps。frp是实现内网穿透的C/S架构软件,满足在外网环境下使用内网服务的需求
1.2 原理如下图
- 简单解释就是,A是公网服务器,B是内网服务器,C是个人用户。A安装frps服务端,B安装frpc客户端并指向A的IP端口,此时C想访问B的内网服务,只需要访问A的服务,A与B相互转发,完成C访问内网B。
二、安装与使用
2.1 文件下载(这里需要注意的是,同一个文件夹就包含了同类型系统的服务端frps和客户端frpc程序)
2.2 服务端安装
- 将文件拷贝到服务器任意指定文件目录,并解压文件
tar -zxvf + 压缩包文件名
2.3 修改服务端配置文件
- 2.3.1进入解压的压缩包内,编辑服务端配置文件
vim frps.ini
- 2.3.2 修改fprs.ini础配置,并保存退出
[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
# 授权码,请改成更复杂的,这个token之后在客户端会用到
token = 52010
# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
# [必须]标识头
[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
2.4 开放端口规则
- 2.4.1 如何是阿里云或者腾讯云,则需要打开上诉相应端口的入规则。如果是公网物理服务器,则需要开放相应防火墙端口,系统不一样的自己修改指令,当然可以直接关闭防火墙。
# 添加监听端口
sudo firewall-cmd --permanent --add-port=7000/tcp
# 添加管理后台端口
sudo firewall-cmd --permanent --add-port=7500/tcp
sudo firewall-cmd --reload
2.5 启动frps服务
# 前台启动
./frps -c ./frps.ini
# 后台启动
./frps -c ./frps.ini &
# 查询frp服务pid
ps -ef | grep frp
# 停止frp服务
kill -9 + pid
sudo mkdir -p /etc/frp
sudo cp frps.ini /etc/frp
sudo cp frps /usr/bin
sudo cp systemd/frps.service /usr/lib/systemd/system/
sudo systemctl enable frps
sudo systemctl start frps
2.6 运行验证
- 启动成功后,登录frp管理后台,默认 IP:7500,admin/admin,即可查看服务启动
2.7 客户端的安装
- 2.7.1 假设客户端是内网的linux系统,将之前下载好的frp压缩包拷入本地linux文件夹,并解压缩
tar -zxvf + 压缩包文件名
- 2.7.2 进入解压缩文件夹,编辑客户端配置文件
vim frpc.ini
- 2.7.3 修改fprc.ini基础配置如下
frpc.ini
[common]
server_addr = 服务器公网IP
server_port = 7000
token = 52010
[ssh] //名字跟下面的不能重复,否则会被覆盖
type = tcp //协议
local_ip = 127.0.0.1 //相对客户端的ip(如果是局域网内其它电脑,这里应该填写局域网内的IP)
local_port = 22 //客户端被映射的端口
remote_port = 6000 //服务器的端口
[mysql] //名字跟下面的不能重复,否则会被覆盖
type = tcp //协议
local_ip = 127.0.0.1 //相对客户端的ip(如果是局域网内其它电脑,这里应该填写局域网内的IP)
local_port = 3306 //客户端被映射的端口
remote_port = 3307 //服务器的端口
#[必须]标识头
[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
- 2.7.4 如果开起了防火墙的,记得开放端口,如果没开的就不用管,系统不一样的自己修改指令
sudo firewall-cmd --permanent --add-port=6000/tcp
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
2.8 frp客户端启动运行
# 前台启动
./frpc -c ./frpc.ini
# 后台启动
./frpc -c ./frpc.ini &
2.9 验证
- 2.9.1 前后端均正常启动成功后,打开第三方ssh连接客户端,连接公网IP:[映射端口],如47.55.66.88:6000,即可连接到B电脑ssh服务的22端口。
三、常见问题处理
3.1 frp异常