概念
frp
是一个可用于内网穿透的高性能的反向代理应用,支持 tcp
, udp
, http
, https
协议.
功能特性
通过在具有公网 IP
的节点上部署 frp
服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
- 客户端服务端通信支持
TCP
、UDP
以及Websocket
等多种协议; - 采用
TCP
连接流式复用,在单个连接间承载更多请求,节省连接建立时间; - 代理组间的负载均衡;
- 端口复用,多个服务通过同一个服务端端口暴露;
- 多个原生支持的客户端插件(静态文件查看,
HTTP
、SOCK5
代理等),便于独立使用frp
客户端完成某些工作; - 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展;
- 服务端和客户端
UI
页面;
服务端 - frps
1. 下载程序
首先到 frp
的 releases
页面下载最新版的对应 VPS
的处理器架构的压缩包
https://github.com/fatedier/frp/releases
如何知道 VPS
的处理器架构?在 VPS
上运行这个命令:
[root@dosbat ~]# arch
x86_64
如果输出x86_64
则需要下载带linux_amd64
的那个压缩包;
2.解压赋权
[root@dosbat ~]#cd /root
# 下载
[root@dosbat ~]#wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v0.18.0/frp_0.18.0_linux_amd64.tar.gz
# 解压
[root@dosbat ~]#tar -xzvf frp_0.18.0_linux_amd64.tar.gz
# 文件夹名改成 frp,不然目录太长了不方便
[root@dosbat ~]#mv frp_0.18.0_linux_amd64 frp
[root@dosbat ~]#cd frp
# 确保 frps 程序具有可执行权限
[root@dosbat ~]#chmod +x frps
然后试着运行一下`frps`,看看是否能正常运行
然后试着运行一下`frps`,看看是否能正常运行
[root@dosbat frp]# ./frps --help
frps is the server of frp (https://github.com/fatedier/frp)
Usage:
frps [flags]
Flags:
--allow_ports string allow ports
--bind_addr string bind address (default "0.0.0.0")
-p, --bind_port int bind port (default 7000)
--bind_udp_port int bind udp port
-c, --config string config file of frps
--dashboard_addr string dasboard address (default "0.0.0.0")
--dashboard_port int dashboard port
--dashboard_pwd string dashboard password (default "admin")
--dashboard_user string dashboard user (default "admin")
--disable_log_color disable log color in console
-h, --help help for frps
--kcp_bind_port int kcp bind udp port
--log_file string log file (default "console")
--log_level string log level (default "info")
--log_max_days int log max days (default 3)
--max_ports_per_client int max ports per client
--proxy_bind_addr string proxy bind address (default "0.0.0.0")
--subdomain_host string subdomain host
-t, --token string auth token
-v, --version version of frpc
--vhost_http_port int vhost http port
--vhost_http_timeout int vhost http response header timeout (default 60)
--vhost_https_port int vhost https port
3.配置systemd服务
[root@dosbat ~]# vi /lib/systemd/system/frps.service
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini (启动命令,我这里frps.ini放在了etc目录下所以这里是这么写的)
[Install]
WantedBy=multi-user.target
4.常用指令
启动服务
[root@dosbat ~]# systemctl start frps
添加自启动
[root@dosbat ~]# systemctl enable frps
查看服务状态
[root@dosbat ~]# systemctl status frps
5. 配置程序
先停止服务
[root@dosbat ~]# systemctl stop frps
参考以下配置说明来书写配置文件frps.ini
,完整的配置说明可以查看目录下的frps_full.ini
# 下面这句开头必须要有,表示配置的开始
[common]
# frp 服务端端口(必须)
bind_port = 7000
# frp 服务端密码(必须)
token = 12345678
# 认证超时时间,由于时间戳会被用于加密认证,防止报文劫持后被他人利用
# 因此服务端与客户端所在机器的时间差不能超过这个时间(秒)
# 默认为900秒,即15分钟,如果设置成0就不会对报文时间戳进行超时验证
authentication_timeout = 900
# 仪表盘端口,只有设置了才能使用仪表盘(即后台)
dashboard_port = 7500
# 仪表盘访问的用户名密码,如果不设置,则默认都是 admin
dashboard_user = admin
dashboard_pwd = admin
# 如果你想要用 frp 穿透访问内网中的网站(例如路由器设置页面)
# 则必须要设置以下两个监听端口,不设置则不会开启这项功能
vhost_http_port = 10080
vhost_https_port = 10443
# 此设置需要配合客户端设置,仅在穿透到内网中的 http 或 https 时有用(可选)
# 假设此项设置为 example.com,客户端配置 http 时将 subdomain 设置为 test,
# 则你将 test.example.com 解析到服务端后,可以使用此域名来访问客户端对应的 http
subdomain_host = example.com
然后把你精简后的配置文件内容写入frps.ini
[root@dosbat ~]# echo "[common]
bind_port = 7000
token = 12345678
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
subdomain_host = example.com" > frps.ini
最后启动服务
[root@dosbat ~]# systemctl start frps
仪表盘登录
http://x.x.x.x:7500/
- 账户密码端口都是参考
frps.ini
客户端 - frpc
1.安装赋权
[root@dosbat ~]#wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v0.18.0/frp_0.18.0_linux_amd64.tar.gz
# 解压
[root@dosbat ~]#tar -xzvf frp_0.18.0_linux_amd64.tar.gz
# 文件夹名改成 frp,不然目录太长了不方便
[root@dosbat ~]#mv frp_0.18.0_linux_amd64 frp
[root@dosbat ~]#cd frp
# 确保 frps 程序具有可执行权限
[root@dosbat ~]#chmod +x frpc
2.修改配置
1.基本配置(必须)
# 下面这句开头必须要有,表示配置的开始
[common]
# frp 服务端地址,可以填ip或者域名
server_addr = 0.0.0.0 (填写frps服务器地址)
# frp 服务端端口,即填写服务端配置中的 bind_port
server_port = 7000
# 填写 frp 服务端密码
token = 12345678(与之前服务器的密码一致)
2.TCP/UDP
这里以转发 ssh
为例
# 自定义一个配置名称,格式为“[名称]”,放在开头
[ssh]
# 连接类型,填 tcp 或 udp
type = tcp
# 本地ip,填你需要转发到的目的ip
# 如果是转发到frp客户端所在本机(比如路由器)则填 127.0.0.1
# 否则填对应机器的内网ip
local_ip = 127.0.0.1
# 需要转发到的端口,比如 ssh 端口是 22
local_port = 22
# 是否加密客户端与服务端之间的通信,默认是 false
use_encryption = false
# 是否压缩客户端与服务端之间的通信,默认是 false
# 压缩可以节省流量,但需要消耗 CPU 资源
# 加密自然也会消耗 CPU 资源,但是不大
use_compression = false
# frp 服务端的远程监听端口,即你访问服务端的 remote_port 就相当于访问
# 客户端的 local_port,如果填0则会随机分配一个端口
remote_port = 6001
3.HTTP(S)
以转发路由器设置页面为例
# 自定义一个配置名称,格式为“[名称]”,放在开头
[router-web]
# 连接类型,填 http 或 https
type = http
local_ip = 127.0.0.1
local_port = 80
# http 可以考虑加密和压缩一下
use_encryption = true
use_compression = true
# 自定义访问网站的用户名和密码,如果不定义的话谁都可以访问,会不安全
# 有些路由器如果从内部访问web是不需要用户名密码的,因此需要在这里加一层密码保护
# 如果你发现不加这个密码保护,路由器配置页面原本的用户认证能正常生效的话,可以不加
http_user = admin
http_pwd = admin
# 还记得我们在服务端配置的 subdomain_host = example.com 吗
# 假设这里我们填 web01,那么你将 web01.example.com 解析到服务端ip后
# 你就可以使用 域名:端口 来访问你的 http 了
# 这个域名的作用是用来区分不同的 http,因为你可以配置多个这样的配置
subdomain = web01
# 自定义域名,这个不同于 subdomain,你可以设置与 subdomain_host 无关的其他域名
# subdomain 与 custom_domains 中至少有一个必须要设置
custom_domains = web02.yourdomain.com
# 匹配路径,可以设置多个,用逗号分隔,比如你设置 locations 为以下这个,
# 那么所有 http://xxx/abc 和 http://xxx/def 都会被转发到 http://xxx/
# 如果不需要这个功能可以不写这项,就直接该怎么访问就怎么访问
locations = /abc,/def
# 重写 host header,相当于反向代理中的“发送域名”
# 如果设置了,转发 http 时,请求中的 host 会被替换成这个
# 一般情况下不需要用到这个,可以不写这项
host_header_rewrite = dev.yourdomain.com
4.TCP/UDP 范围转发
# 自定义一个配置名称,格式为“[range:名称]”,放在开头
[range:multi-port]
type = tcp
local_ip = 127.0.0.1
use_encryption = false
use_compression = false
# 本地端口和远程端口可以指定多个范围,如下格式,且范围之间必须一一对应
local_port = 6010-6020,6022,6024-6028
remote_port = 16010-16020,16022,16024-16028
5.合并配置
写入到frpc.ini
中,然后仿照运行服务端的方式来运行客户端
[common]
server_addr = 0.0.0.0
server_port = 7000
token = 12345678
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false
remote_port = 6001
[router-web]
type = http
local_ip = 127.0.0.1
local_port = 80
use_encryption = true
use_compression = true
http_user = admin
http_pwd = admin
subdomain = web01
custom_domains = web02.yourdomain.com
locations = /abc,/def
host_header_rewrite = dev.yourdomain.com
[range:multi-port]
type = tcp
local_ip = 127.0.0.1
use_encryption = false
use_compression = false
local_port = 6010-6020,6022,6024-6028
remote_port = 16010-16020,16022,16024-16028
6.启动服务
[root@nues frp]# ./frps -c frps.ini