一、frp简述

frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。就是nat地址转换

二、frp说明

一个frp文件包里面包括frpc、frps以及相应的配置文件。内部的配置文件,如下所示:

[root@localhost frp_0.38.0_linux_amd64]# ls
frpc  frpc_full.ini  frpc.ini  frps  frps_full.ini  frps.ini  frps.log  LICENSE  nohup.out  systemd

frpc:是指 frp客户端(client)
frpc.ini:客户端配置文件
frps:是指 frp服务端(server)
frps.ini:服务端配置文件

三、frp安装

1、工具

一台有公网IP的服务器(下文称外网主机)
一台需要实现内网穿透的机器(下文称内网主机)
一个SSH工具(xshell、Mobaxterm或putty)
一个域名(如果只是建立SSH反向代理则不需要域名)。

2、获取

windows环境中,推荐下载 frp_0.20.0_windows_amd64.zip
linux环境中,推荐下载 frp_0.20.0_linux_amd64.tar.gz
具体还是看情况而定,可以自己选取版本、看操作系统选择32位或64位的。
下载地址传送门: https://github.com/fatedier/frp/releases

3、安装

3.1 服务端安装,自行搭建服务端配置参考(必须有公网ip)

外网主机(带有公网ip的服务器)需要安装服务端的frp

(1)解压

[root@localhost net]# tar -xf frp_0.38.0_linux_amd64.tar.gz
[root@localhost net]# ls
frp_0.38.0_linux_amd64  frp_0.38.0_linux_amd64.tar.gz

(2)修改配置文件

修改服务器配置文件,frps.ini文件。使用vi指令对目标文件进行编辑。

[root@localhost frp_0.38.0_linux_amd64]# cat frps.ini 
[common]
bind_port = 7000
vhost_http_port = 8080

[common]部分是必须有的配置,其中bind_port是自己设定的frp服务端端口,vhost_http_port是自己设定的http访问端口。

以下配置适合0.10.0~0.16.1版本

frp客户端与服务端0.9.3及以下版本兼容,0.10.0~0.16.1版本兼容,使用时需要注意

0.18.0以上版本把配置中的“privilege_”字段去掉即可

[common]
bind_addr = 0.0.0.0
#服务器IP,0.0.0.0为服务器全局所有IP可用,假如你的服务器有多个IP则可以这样做,或者填写为指定其中的一个服务器IP,支持IPV6
bind_port = 7000
#通讯端口,用于和客户端内网穿透传输数据的端口,可自定义
bind_udp_port = 7001
#UDP通讯端口,用于点对点内网穿透
kcp_bind_port = 7000
#用于KCP协议UDP通讯端口,在弱网环境下传输效率提升明显,但是会有一些额外的流量消耗。设置后frpc客户端须设置protocol = kcp
vhost_http_port = 80
#http监听端口,注意可能和服务器上其他服务用的80冲突,比如centos有些默认有Apache,可自定义
vhost_https_port = 443
#https监听端口,可自定义
dashboard_port = 7500
#通过浏览器查看 frp 的状态以及代理统计信息展示端口,可自定义
dashboard_user = admin
#信息展示面板用户名
dashboard_pwd = admin
#信息展示面板密码
log_max_days = 7
#最多保存多少天日志
privilege_token = frp888
#特权模式认证密钥
privilege_allow_ports = 1-65535
#端口白名单,为了防止端口被滥用,可以手动指定允许哪些端口被使用
max_pool_count = 100
#每个内网穿透服务限制最大连接池上限,避免大量资源占用,可自定义
authentication_timeout = 0
#frpc 所在机器和 frps 所在机器的时间相差不能超过 15 分钟,因为时间戳会被用于加密验证中,防止报文被劫持后被其他人利用,单位为秒,默认值为 900,即 15 分钟。如果修改为 0,则 frps 将不对身份验证报文的时间戳进行超时校验。国外服务器由于时区的不同,时间会相差非常大,这里需要注意同步时间或者设置此值为0
log_file = frps.log
log_level = info

(3)启动

启动frp服务端,命令如下:

[root@localhost frp_0.38.0_linux_amd64]# ./frps -c ./frps.ini 

3.2客户端安装

(1)解压

使用tar指令解压tar.gz文件 一样通3.1

(2)修改配置文件

使用vi命令,修改frpc.ini

[root@localhost frp_0.38.0_linux_amd64]# cat frpc.ini 
[common]
server_addr = 172.16.10.1
server_port = 7000
 
[ssh]
type = tcp
local_ip = 172.16.10.1
local_port = 22
remote_port = 6000
 
[mysql]
type = tcp
local_port = 3306
remote_port = 3306
#use_encryption = true
#use_compression = true
 
[tomcat]
type = http
local_port = 8083
#custom_domains = tomcat.xxxx1.com
#remote_port =8083
 
[web]
type = http
local_port = 80
custom_domains = www.xxx.com

[common]中的server_addr填frp服务端的ip(也就是外网主机的IP),server_port填frp服务端的bind_prot。

[ssh]中的local_port填本机开放的ssh端口,一般ssh端口默认为22。

[mysql]中的 type对应服务端配置,local_port填服务端mysql端口。

[tomcat]中的 type对应服务端配置,local_port填服务端toncat端口。

[web]中的type对应服务端配置。local_port填f服务器的web端口。

以下配置适合0.10.0~0.16.1版本

frp客户端与服务端0.9.3及以下版本兼容,0.10.0~0.16.1版本兼容,使用时需要注意

0.18.0以上版本把配置中的“privilege_”字段去掉即可

[common]
server_addr = www.yourdomain.com 
#frps服务端地址
server_port = 7000
#frps服务端通讯端口,客户端连接到服务端内网穿透传输数据的端口
privilege_token = frp888
#特权模式密钥,客户端连接到FRPS服务端的验证密钥
log_file = frpc.log
#日志存放路径
log_level = info
#日志记录类别,可选:trace, debug, info, warn, error
log_max_days = 7
#日志保存天数
login_fail_exit = false
#设置为false,frpc连接frps失败后重连,默认为true不重连
protocol = kcp
#KCP协议在弱网环境下传输效率提升明显,但是对frps会有一些额外的流量消耗。服务端须先设置kcp_bind_port = 7000,www.yourdomain.com服务端已设置支持
 
[http_dsm]
#穿透服务名称,不能和其他已建立的相同,使用公共服务器的建议修改成复杂一点的名称,避免与其他人冲突,很多路由器内置frpc的默认服务名称为[web],很容易很其他人冲突
type = http
#穿透协议类型,可选:tcp,udp,http,https,stcp,xtcp,这个设置之前必须自行搞清楚应该是什么
local_ip = 192.168.1.2
#本地监听IP,可以是本机IP,也可以是本地的局域网内某IP,例如你的局域网是互通的,你可以在路由器上安装frpc,然后local_ip填的内网其他机器ip,这样也可以把内网其他机器穿透出去
local_port = 5000
#本地监听端口,通常有ssh端口22,远程桌面3389等等
use_compression = true
#对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 cpu 资源
use_encryption = true
#将 frpc 与 frps 之间的通信内容加密传输
custom_domains = dsm.yourdomain.com
#自定义域名访问穿透服务,一般域名设置了二级域名泛解析以后,这里填*.yourdomain.com即可,*自定义,如果不想用域名或者自行搭建frps没有域名,则穿透协议类型选择tcp,见以下tcp部分详解
#通过app访问的注意,DS file,DS video,DS audio,DS finder里地址栏默认都是5000端口,穿透后地址栏须填写为【穿透域名:80】,DS photo由于本地local_port为80,穿透后也为80的话直接写域名地址即可
 
[https_dsm]
type = https
local_ip = 192.168.1.2
local_port = 5001
use_compression = true
use_encryption = true
custom_domains =  dsm.yourdomain.com
#以上https配置同http,注意开启https(默认5001端口),证书配置在客户端,无证书的注意浏览器访问时添加信任
 
[http_transmission]
type = http
local_ip = 192.168.1.2
local_port = 9091
use_compression = true
use_encryption = true
custom_domains = tr.yourdomain.com
#transmission下载客户端
 
[http_rutorrent]
type = http
local_ip = 192.168.1.2
local_port = 80
use_compression = true
use_encryption = true
custom_domains = rt.yourdomain.com
#rutorrent下载客户端,用Download Station的类似,注意端口
 
 
[http_blog]
type = http
local_ip = 192.168.1.2
local_port = 80
use_compression = true
use_encryption = true
custom_domains = blog.yourdomain.com
 
 
[http_plex]
type = http
local_ip = 192.168.1.2
local_port = 32400
use_compression = true
use_encryption = true
custom_domains = plex.yourdomain.com
#plex视频服务器
 
[https_feixun]
privilege_mode = true
type = http
local_ip = 192.168.1.1
#路由器ip
local_port = 80
use_compression = true
use_encryption = true
authentication_timeout = 0
custom_domains = feixun.yourdomain.com
#穿透路由器
 
 
[tcp_ssh]
#ssh连接
type = tcp
local_ip = 192.168.1.2
local_port = 22
use_compression = true
use_encryption = true
remote_port = 3463
#远程端口,一般tcp和udp需要设置,不需要设置custom_domain,访问时为【frps服务器地址+远程端口】,没有域名的用这种方式通过【frps服务器地址+远程端口】即可实现访问
 
[udp]
type = udp
local_ip = 192.168.1.2
local_port = 53
use_compression = true
use_encryption = true
remote_port = 3453
访问时为【frps服务器地址+远程端口】

(3)运行

运行frp客户端,命令如下:

./frpc -c ./frpc.ini