
转载请注明出处
在很多时候,我们并不能获得公网IP,特别是使用了某移、某动的宽带。而即使办理的是电信或者联通的宽带,想获得公网IP,难免也需要一番折腾。在没有公网IP的条件下,或者公司内网之中,我们总希望能够访问我们所搭建的一些服务。比如NAS,又或者自己的小服务器。
百度百科:FRP 是一个高性能的反向代理应用,支持 tcp, udp, http, https 协议。
- 利用处于防火墙后的机器,对外网环境提供 http 或 https 服务。
- 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
- 利用处于防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司局部环境的主机。
安装
官方仓库
https://github.com/fatedier/frp
官方release包
https://github.com/fatedier/frp/releases
我当初在写这篇笔记的时候,官方版本是0.34.0,所以我将以当时的版本来描述安装的过程。截至文章发布的时间,FRP官方已经发布了0.35.1版本。
服务器端
以AMD64的平台为例,如果是其他平台类型,请酌情修改。
# 创建一个专门用来下载的文件夹
mkdir /usr/downloads/
# 进入downloads
cd /usr/downloads/
# 获取frp release包
# AMD平台安装包
wget https://github.com/fatedier/frp/releases/download/v0.34.0/frp_0.34.0_linux_amd64.tar.gz
# 解压缩
tar -zxvf frp_0.34.0_linux_amd64.tar.gz
# 移动程序
mv frp_0.34.0_linux_amd64/frps /usr/bin/
# 移动许可
mkdir -p /usr/doc/frp
mv frp_0.34.0_linux_amd64/LICENSE /usr/doc/frp/
# 移动配置文件
mkdir -p /etc/frp
mv frp_0.34.0_linux_amd64/frps_full.ini /etc/frp/
mv frp_0.34.0_linux_amd64/frps.ini /etc/frp/
# 移动服务文件
mv frp_0.34.0_linux_amd64/systemd/frps.service /usr/lib/systemd/system/
mv frp_0.34.0_linux_amd64/systemd/frps@.service /usr/lib/systemd/system/
# 删除多余文件
rm -R frp_0.34.0_linux_amd64
rm frp_0.34.0_linux_amd64.tar.gz
客户端
以AMD64的平台为例,如果是其他平台类型,请酌情修改。
# 创建一个专门用来下载的文件夹
mkdir /usr/downloads/
# 进入downloads
cd /usr/downloads/
# 获取frp release包
# AMD平台安装包
wget https://github.com/fatedier/frp/releases/download/v0.34.0/frp_0.34.0_linux_amd64.tar.gz
# 移动程序
mv frp_0.34.0_linux_amd64/frpc /usr/bin/
# 移动许可
mkdir -p /usr/doc/frp
mv frp_0.34.0_linux_amd64/LICENSE /usr/doc/frp/
# 移动配置文件
mkdir -p /etc/frp
mv frp_0.34.0_linux_amd64/frpc_full.ini /etc/frp/
mv frp_0.34.0_linux_amd64/frpc.ini /etc/frp/
# 移动服务文件
mv frp_0.34.0_linux_amd64/systemd/frpc.service /etc/systemd/system/
mv frp_0.34.0_linux_amd64/systemd/frpc@.service /etc/systemd/system/
# 删除多余文件
rm -R frp_0.34.0_linux_amd64
rm frp_0.34.0_linux_amd64.tar.gz
至此,已经安装完软件了,值得注意的是,文件夹中包含了Frps与Frpc,对应服务端与客户端,服务端需要配置的是frps.ini,客户端需要配置的是frpc.ini。
服务端配置及部分参数说明
修改配置文件
nano /etc/frp/frps.ini
部分参数说明
# 基础配置
# 标识头 *
[common]
# 服务端监听地址,默认值0.0.0.0
# bind_addr = 0.0.0.0
# 服务端监听端口,默认值7000 *
bind_port = 7000
# 服务端监听 UDP 端口, 默认值0
# bind_udp_port = 0
# 服务端监听 KCP 协议端口,默认值 0
# kcp_bind_port = 0
# 代理监听地址,默认值0.0.0.0
# proxy_bind_addr = 0.0.0.0
# 日志文件地址, 默认值./frps.log
# log_file = /var/log/frps.log
# 日志等级, 默认值info, [trace, debug, info, warn, error]
log_level = info
# 日志文件保留天数, 默认值3
log_max_days = 3
# 禁用标准输出中的日志颜色, 默认值false
disable_log_color = false
# 禁用服务端返回详细错误信息给客户端,默认值true
detailed_errors_to_client = true
# 服务端和客户端心跳连接的超时时间,默认值90
heart_beat_timeout = 90
# 用户建立连接后等待客户端响应的超时时间,默认值10
user_conn_timeout = 10
#
#
# 鉴权方式,默认值token,[token, oidc]
# authentication_method = token
# 开启心跳消息鉴权,默认值false
# authenticate_heartbeats = false
# 开启建立工作连接的鉴权,默认值false
# authenticate_new_work_conns = true
# 鉴权使用的 token 值,客户端需与服务端一致
token = 123456
# oidc 鉴权参数
# oidc_issuer
# oidc_audience
# oidc_skip_expiry_check
# oidc_skip_issuer_check
# 允许代理绑定的服务端端口,格式为 1000-2000,2001,3000-4000
# allow_ports = 3000-4000
#
#
# 最大连接池大小,默认值5
max_pool_count = 5
# 限制单个客户端最大同时存在的代理数,默认值0,0表示没有限制
max_ports_per_client = 0
# 只接受启用了 TLS 的客户端连接,默认值false
# tls_only = true
#
#
# 启用 Dashboard 监听的本地地址,默认值0.0.0.0
dashboard_addr = 0.0.0.0
# 启用 Dashboard 监听的本地端口,默认值0,启用后才支持Dashboard
dashboard_port = 7500
# HTTP BasicAuth 用户名,默认值admin
dashboard_user = admin
# HTTP BasicAuth 密码,默认值admin
dashboard_pwd = admin
# 是否提供 Prometheus 监控接口,默认值false,需要同时启用了 Dashboard 才会生效
# enable_prometheus = false
# 静态资源目录,Dashboard 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源
# asserts_dir
#
#
# 为 HTTP 类型代理监听的端口,默认值0,启用后才支持 HTTP 类型的代理,默认不启用
vhost_http_port = 80
# 为 HTTPS 类型代理监听的端口,默认值0,启用后才支持 HTTPS 类型的代理,默认不启用
vhost_https_port = 443
# HTTP 类型代理在服务端的 ResponseHeader 超时时间,默认60
vhost_http_timeout = 60
# 二级域名后缀
subdomain_host = alainlam.cloud
# 自定义 404 错误页面地址
# custom_404_page = /var/www/err/404/index.html
服务端防火墙
如果服务端有防火墙配置,则应该将以上配置内容的端口开放,否则无法连接。如果使用的服务器商面板中存在防火墙规则,也应该一并修改。以下以CentOS为例。
# 开启防火墙服务
systemctl enable firewalld
# 开启防火墙
systemctl start firewalld
# 放行7000端口
firewall-cmd --zone=public --add-port=7000/tcp --permanent
# 放行7500端口
firewall-cmd --zone=public --add-port=7500/tcp --permanent
# 放行远程SSH端口,如6000端口
firewall-cmd --zone=public --add-port=6000/tcp --permanent
# 重载防火墙
firewall-cmd --reload
# 查看放行端口
firewall-cmd --list-ports
客户端配置及部分参数说明
修改配置文件
nano /etc/frp/frpc.ini
部分参数说明
# [common] is integral section
[common]
# 连接服务端的地址
server_addr = 10.0.0.1
# 连接服务端的端口
# 默认值7000
# 需要与服务端的bind_port一致
server_port = 7000
# 连接服务端使用的代理地址
# 只有在tcp时有效
# http_proxy = http://user:passwd@192.168.1.128:8080
# http_proxy = socks5://user:passwd@192.168.1.128:1080
# 日志文件地址,默认值./frpc.log
# _file = ./frpc.log
# 日志等级
# 可选参数 trace, debug, info, warn, error
# 默认值 info
log_level = info
# 日志文件保留天数
# 默认值 3
log_max_days = 3
# 禁用标准输出中的日志颜色
# 默认值 false
disable_log_color = false
# 连接池大小
# 默认值 5
pool_count = 5
# 使用 DNS 服务器地址
# user = your_name
# 使用 DNS 服务器地址,默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址
# dns_server = 8.8.8.8
# 第一次登陆失败后是否退出
# 默认值 true
# login_fail_exit = true
# 连接服务端的通信协议
# 可选参数 tcp, kcp, websocket
# 默认值 default is tcp
# protocol = tcp
# 启用 TLS 协议加密连接
# 默认值 false
tls_enable = false
# 向服务端发送心跳包的间隔时间
# 默认值 30
heartbeat_interval = 30
# 和服务端心跳的超时时间
# 默认值90
heartbeat_timeout = 90
# 指定启用部分代理
# 当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用
# start = ssh,dns
# --权限验证
# 鉴权方式
# 可选参数 token, oidc
# 默认值 token
# 需要与服务端一致
# authentication_method = true
# 开启心跳消息鉴权
# 默认值 false
# 需要与服务端一致
# authenticate_heartbeats = false
# 开启建立工作连接的鉴权
# 默认值 false
# 需要与服务端一致
# authenticate_new_work_conns = false
# 鉴权使用的 token 值
# 需要和服务端设置一样的值才能鉴权通过
token = 123456
# oidc 鉴权参数
# oidc_issuer
# oidc_audience
# oidc_skip_expiry_check
# oidc_skip_issuer_check
# 启用 AdminUI 监听的本地地址
# 默认值 0.0.0.0
# admin_addr = 0.0.0.0
# 启用 AdminUI 监听的本地端口
# 默认值 0
# admin_port = 0
# HTTP BasicAuth 用户名
# 默认值 admin
# admin_user = admin
# HTTP BasicAuth 密码
# 默认值 admin
# admin_pwd = admin
# 静态资源目录
# AdminUI 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源
# asserts_dir =
# --代理配置
# 代理 SSH
# 代理名,如果user字段在[common基础配置中不为空,{user}.{proxy}]
[ssh]
# 代理类型
# 默认 tcp
# 可选 tcp, udp, http, https, stcp, sudp, xtcp, tcpmux
type = tcp
# 是否启用加密功能
# 默认 false
# use_encryption = false
# 是否启用压缩功能
# 默认 false
# use_compression = false
# 启用 proxy protocol 协议的版本
# 如果启用,则 frpc 和本地服务建立连接后会发送 proxy protocol 的协议,包含了原请求的 IP 地址和端口等内容
# proxy_protocol_version = v1
# 设置单个 proxy 的带宽限流
# 单位为 MB 或 KB,0 表示不限制,如果启用,会作用于对应的 frpc
# bandwidth_limit = 1MB
# 本地服务 IP
# 默认 127.0.0.1
# 需要被代理的本地服务的 IP 地址,可以为所在 frpc 能访问到的任意 IP 地址
local_ip = 127.0.0.1
# 本地服务端口
local_port = 22
# 服务端绑定的端口
# 用户访问此端口的请求会被转发到 local_ip:local_port
# TCP 必须值
remote_port = 6001
# 代理 HTTP
# 代理名
[frp_test]
# 代理类型
type = http
# 代理地址
local_ip = 127.0.0.1
# 代理端口
local_port = 10086
# 是否加密
use_encryption = false
# 是否压缩
use_compression = true
# 服务器绑定自定义域名
# 和 sub_domain 两者必须配置一个
# 用户通过 vhost_http_port 访问的 HTTP 请求如果 Host 在 custom_domains 配置的域名中,则会被路由到此代理配置的本地服务
# custom_domains =
# 自定义子域名
# 和 custom_domains 两者必须配置一个
# 和 custom_domains 作用相同,但是只需要指定子域名前缀,会结合服务端的 subdomain_host 生成最终绑定的域名
subdomain =
# 用户名
# 如果配置此参数,暴露出去的 HTTP 服务需要采用 Basic Auth 的鉴权才能访问
# http_user =
# 密码
# 结合 http_user 使用
# http_pwd =
# 替换 Host header
# 替换发送到本地服务 HTTP 请求中的 Host 字段
# host_header_rewrite =
# 替换 header
# map 中的 key 是要替换的 header 的 key,value 是替换后的内容
# headers =
使用Systemd管理Frp
在上方安装的过程中,已经将Frp的service防盗Systemed服务的文件夹之中,可以使用以下命令在重载Systemed服务配置文件
sudo systemctl daemon-reload
使用以下命令来控制Frps
# 启动
# 服务端
sudo systemctl start frps
# 客户端
sudo systemctl start frpc
# 终止
# 服务端
sudo systemctl stop frps
# 客户端
sudo systemctl stop frpc
# 重启
# 服务端
sudo systemctl restart frps
# 客户端
sudo systemctl restart frpc
# 开机自启动
# 服务端
sudo systemctl enable frps
# 客户端
sudo systemctl enable frpc
# 状态
# 服务端
sudo systemctl status frps
# 客户端
sudo systemctl status frpc
文章评论