frp全名Fast Reverse Proxy 穿越内网加自启动!

/ 1

Frp基本信息

frp全名Fast Reverse Proxy,是用于提供内网穿透服务的工具,主要用于解决一些内网服务没有公网ip但是却需要提供外网访问的问题。使用frp你可以将内网中的TCP、UDP、HTTP、HTTPS等协议类型的服务发布到公网,并且支持Web服务根据域名进行路由转发。
frp已经将项目开源至github,想深入了解的朋友可以点击跳转地址,进行深入了解:github项目地址(frp)

Frp使用要求

如上图的frp架构图所示:1、(必须)想要使用frp服务,将内网中的服务发布到公网。你需要先拥有一台拥有公网ip的网络设置搭建frp服务端,再在内网需要穿透的设置中搭建frp客户端服务才能进行穿透;2、(非必需)你需要拥有一个域名解析到公网的ip地址,才能够实现web服务的通过域名进行路由转发的功能。

Frp服务的搭建

搭建frp很简单,关键的步骤只有三步:1、获取frp文件;2、设置frp配置文件,3、启动frp服务。(注意frp搭建的的这三步是分为客户端和服务端的,但是操作基本是一致的。)本教程frp服务的搭建主要介绍frp搭建的主要三步,以及frp服务端和客户端配置文件内容的解释说明,以及如何将frp在linux系统中创建systemd服务,进行服务管理。

第一步:获取frp文件
frp支持linux平台和windows平台。参照你的设置的运行平台下载linux版本的文件或者是windows的。https://github.com/fatedier/frp/releases
一般linux平台下载的版本为:frp_版本号_linux_amd64.tar.gz,windows平台下载的版本为:frp_版本号_windows_amd64.zip。linux版本文件的解压命令为tar zxvf 文件名 ,windows版本文件直接右键解压即可。文件解压后,一般都含有frps(frp服务端运行文件)、frpc(frp客户端运行文件)、frps.ini(frp服务端配置文件)、frpc.ini(frp客户端配置文件),以及frp_full.ini(frp全部配置文件解释说明和参考。)

第二步:frp配置文件设置
frp配置文件分为服务端和客户端,想要正常只用frp工具,我们需要对服务端和客户端的配置文件分别进行设置。

frps.ini(服务端)配置文件解释说明

# [common] is integral section
[common]
# A literal address or host name for IPv6 must be enclosed
# in square brackets, as in “[::1]:80”, “[ipv6-host]:http” or “[ipv6-host%zone]:80”
bind_addr = 0.0.0.0
bind_port = 7000

# udp port to help make udp hole to penetrate nat
bind_udp_port = 7001

# udp port used for kcp protocol, it can be same with ‘bind_port’
# if not set, kcp is disabled in frps
kcp_bind_port = 7000

# specify which address proxy will listen for, default value is same with bind_addr
# proxy_bind_addr = 127.0.0.1

# if you want to support virtual host, you must set the http port for listening (optional)
vhost_http_port = 80
vhost_https_port = 443

# set dashboard_addr and dashboard_port to view dashboard of frps
# dashboard_addr’s default value is same with bind_addr
# dashboard is available only if dashboard_port is set
dashboard_addr = 0.0.0.0
dashboard_port = 7500

# dashboard user and pwd for basic auth protect, if not set, both default value is admin
dashboard_user = admin
dashboard_pwd = admin

# dashboard assets directory(only for debug mode)
# assets_dir = ./static
# console or real logFile path like ./frps.log
log_file = ./frps.log

# trace, debug, info, warn, error
log_level = info

log_max_days = 3

# privilege mode is the only supported mode since v0.10.0
privilege_token = 12345678

# heartbeat configure, it’s not recommended to modify the default value
# the default value of heartbeat_timeout is 90
# heartbeat_timeout = 90

# only allow frpc to bind ports you list, if you set nothing, there won’t be any limit
privilege_allow_ports = 2000-3000,3001,3003,4000-50000

# pool_count in each proxy will change to max_pool_count if they exceed the maximum value
max_pool_count = 5

# max ports can be used for each client, default value is 0 means no limit
max_ports_per_client = 0

# authentication_timeout means the timeout interval (seconds) when the frpc connects frps
# if authentication_timeout is zero, the time is not verified, default is 900s
authentication_timeout = 900

# if subdomain_host is not empty, you can set subdomain when type is http or https in frpc’s configure file
# when subdomain is test, the host used by routing is test.frps.com
subdomain_host = frps.com

# if tcp stream multiplexing is used, default is true
tcp_mux = true

=================分割线======================

frpc.ini(客户端)配置文件解释说明
对应穿透服务名称
[name]
建立每个穿透服务,都需要命名一个此服务的名称,不能和其他已建立的相同。

穿透协议类型
type = tcp
可选:tcp,udp,http,https,stcp,xtcp
你要穿透什么应用要搞清楚,此应用是用什么协议的。

本地监听IP
local_ip = 127.0.0.1
可以是本地的局域网IP,也可以是本机的127.0.0.1 IP,
例如你的局域网是互通的,你可以在本设备建立穿透局域网其他IP的应用。

本地监听端口
local_port = 22
0.16.0版本以上支持批量端口绑定
local_port = 21,22,3389,10010-10020
使用小写逗号【,】分隔,或者一段范围端口的用【-】小写横杠符号编写范围。
用于监听本地设备需要穿透的端口,比如我要穿透到本机的SSH端口,而SSH端口为22,则这样理解。

远程监听端口
remote_port = 6001
0.16.0版本以上支持批量端口绑定
remote_port = 6001,6002,8080,50010-50020
使用小写逗号【,】分隔,或者一段范围端口的用【-】小写横杠符号编写范围。
用于frps服务端的,分配建立穿透到内网对应应用的公网端口。
需要frps服务端已开放此端口给frpc客户端允许对接使用。
例如我可以连接到此(frps服务端IP:端口),则可以穿透到我的内网对应应用服务。

穿透通讯加密
use_encryption = false
可选:false,true
默认为false则不开启,或者不填此参数,为true则开启frps服务端和frpc客户端之间通讯加密。

穿透通讯压缩
use_compression = false
可选:false,true
默认为false则不开启,或者不填此参数,为true则开启frps服务端和frpc客户端之间通讯压缩。

分配自定义域名访问穿透服务
custom_domains = demo.com
支持填写多个域名
custom_domains = demo.com,abc123.com,test.com
使用小写逗号【,】分隔每个域名
用于你的穿透服务的唯一访问域名,假如没有域名,则此处请填为frps服务端的服务器(IP)
自己有多个域名,可以配置不同穿透应用服务,用不同域名,只需要将对应域名解析到frps服务端的服务器(IP)既可。
也支持泛解析识别,例如将(demo.com)域名已经泛解析到frps服务端的服务器(IP)
而想通过(abc123.demo.com)访问到对应穿透服务
则在对应穿透服务,custom_domains参数中填abc123.demo.com

分配对应穿透应用服务唯一的子域名,用于访问
subdomain = abc123
假如frps服务端已经配置了subdomain_host参数域名,并且已经泛(*)解析到frps服务端的服务器(VPS)IP,则可以使用此参数,否则不能用。
例如已经泛解析(demo.com)域名并且frps服务端配置好的,使用此subdomain参数,只需要填子域名,而不需要填(demo.com)
subdomain = 填abc123,则可以通过(abc123.demo.com)访问

为HTTP协议,添加HTTP用户名和密码安全认证
http_user = admin
自定义用户名
http_pwd = admin
自定义密码
仅支持http,https类型协议。
例如我的WEB页面,访问前,需要进行验证,才可以访问。可以添加此参数。

安全地暴露内网服务
对于某些服务来说如果直接暴露于公网上将会存在安全隐患。
sk = abcdefg
可自定义
此参数用于进一步验证,本地访问穿透服务的安全连接,需要双方frpc客户端都需要配置,仅适用于stcp和xtcp协议类型。

frp更新了最新版的0.16.0版本,这个版本中添加了几项新功能,个人觉得比较有用处的是static_file文件服务器插件和端口范围映射这两个功能。这里特别说明一下
static_file文件服务器插件,对外提供简单的文件访问服务。
[test_static_file]
type = tcp
remote_port = 6000
plugin = static_file
# 要对外暴露的文件目录
plugin_local_path = /tmp/file
# 访问 url 中会被去除的前缀,保留的内容即为要访问的文件路径
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc
通过浏览器访问 http://x.x.x.x:6000/static/ 来查看位于 /tmp/file 目录下的文件,会要求输入已设置好的用户名和密码。

范围端口映射,把frp服务器的部分端口直接转发给内网服务器
[range:test_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 6000-6006,6007
remote_port = 6000-6006,6007
实际连接成功后会创建 6 个 proxy,命名为 test_tcp_0, test_tcp_1 … test_tcp_5。

第三步:启动服务

linux环境下启动服务,需要先把运行文件添加可执行权限。例如我的文件实在root文件夹中,我需要搭建frp服务端,那么待设置好服务端配置文件(frps.ini)后执行以下命令即可。
cd /root
chmod +x frps
nohup ./frps -c ./frps.ini &
执行成功后,会显示frp的进程号码。你也可以通过命令来查看frps运行的进程编号。
ps -e | grep frps

在windows环境下则是以管理员身份运行cmd命令提示符。进入相应的目录后,运行命令即可。
frps -c frps.ini &

关于frp管理的优化设置

debian8.0,或者是centos7.0以上的版本,服务都是基于systemd的方式进行管理的。frp通过设置后也可以实现systemd的方式进行管理,这样我们就可以通过systemctl命令来进行服务的统一管理,同时通过这样的设置也可以将frp服务加入开机自启动。

1、将frp设置成linux系统的服务,基于systemd方式管理

# 编写 frp service 文件,以 centos7 为例
vim /usr/lib/systemd/system/frps.service
# 内容如下

[Unit]
Description=frps daemon
After=syslog.target network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/root/frp/frps -c /root/frp/frps.ini
Restart=always
RestartSec=1min

[Install]
WantedBy=multi-user.target

2、将frp设置成开机自启动
systemctl enable frps
systemctl restart frps

以上就是关于frp内网穿透的基本教程了,搭建可以尝试照着教程搭建一下,如果还有不懂的地方欢迎加入维简网交流群进行交流。转至http://www.xyzbeta.com/460

Debian7+ X64 自启动方法
使用supervisor守护进程,来让frps开机自启、奔溃重启、后台运行。
安装
apt-get install -y supervisor
由于上面安装命令安装了,我们只需要添加一个supervisor配置文件,来守护frp进程。

创建守护进程文件

touch /etc/supervisor/conf.d/frps.conf

编辑文件

vi /etc/supervisor/conf.d/frps.conf

#添加以下参数

[program:frps]
user=root
command=/root/frp16/frps -c /root/frp16/frps.ini
startsecs=1
startretries=100
autorstart=true
autorestart=true
stderr_logfile=/tmp/err-frps.log
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=10
stdout_logfile=/tmp/out-frps.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10

保存后,需要对supervisor进行更新

命令:supervisorctl update all

启动(首次使用,请执行一次)

supervisorctl start frps

重启

supervisorctl restart frps

停止

supervisorctl stop frps

由于frps对时间进行验证,所以你的当前机器时间最好同步北京时间为准,上面要安装apt-get install -y wget ntpdate。我们需要对本机器进行更新校对。

命令:/usr/sbin/ntpdate 0.cn.pool.ntp.org

或者添加定时任务,每天执行一次时间校对。

crontab -e

30 5 * * * /usr/sbin/ntpdate 0.cn.pool.ntp.org

特别注意你当前的机器防火墙,frps.ini里所使用到的端口,都需要开放,tcp和udp协议。

发表评论