什么是FRP

FRP是一个专注于内网穿透的高性能的反向代理应用,支持TCP、UDP、HTTP、HTTPS等多种协议。

它可以将内网服务以安全、便捷的方式通过具有公网IP节点的中转暴露到公网。

项目github地址:https://github.com/fatedier/frp

名词介绍

1.服务端

服务端是指具有公网ip的服务器

2.暴露端

内网中需要暴露到公网的服务器

3.客户端

客户端是指内网中能既能访问公网,又能访问内网暴露端的服务器

如果暴露端能够直接访问公网,那么暴露端也能作为服务端

暴露端不用安装FRP,除非暴露端也作为客户端

FRP文件介绍

将frp下载后解压后,目录中有7个文件:

frpc
frpc.ini
frpc_full.ini
frps
frps.ini
frps_full.ini
LICENSE

其中frps开头的是服务端需要用到的文件,frpc开头的是客户端需要用到的文件,LICENSE为许可证文件。

frps_full.ini:服务端配置示例。

frps.ini:为服务端配置文件。

frps:服务端启动文件。

frpc_full.ini:客户端配置示例。

frpc.ini:客户端配置文件。

frpc:客户端启动文件。

搭建准备

现有服务器公网ip为 111.111.111.111,现有域名 demo.com

需要将域名 server.demo.com 解析(A解析)到 111.111.111.111

需要将域名 *.client.demo.com 解析(CNAME解析)到 server.demo.com

这里 client.demo.com前面的 *是通配符。

现有需要暴露到公网的服务器内网ip为 192.168.111.111

服务端

frps.ini配置:

[common]
bind_port = 7000
vhost_http_port = 8000
subdomain_host = server.demo.com
token = 123456789

dashboard_port = 7001
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
text

公共配置:

bind_port:服务端运行的端口。

vhost_http_port:监听的http端口,后续所有内网穿透的http端口都使用 域名 + 该端口 的形式访问,这里便是 *.client.demo.com:8000

subdomain_host:服务端监听的域名。

token:连接密钥,可以不配置,但为安全起见最好设置一个,防止他人冒用。

仪表盘配置:

dashboard_port:仪表盘端口。

dashboard_user:用户名。

dashboard_pwd:用户密码。

enable_prometheus:启用仪表盘。

启动服务端

命令行启动

切换到frp目录,执行命令 ./frps -c ./frps.ini

后台启动

nohup ./frps -c ./frps.ini > out.log &

脚本启动

frp目录新建 restartServer.sh文件,粘贴以下内容

#!/bin/bash
NAME="frps"
ID=$(ps -ef | grep "$NAME" | grep -v "$0" | grep -v "grep" | awk '{print $2}')
for id in $ID; do
  kill -9 $id
  echo "killed $NAME:[$id]"
done
nohup ./frps -c ./frps.ini > out.log &
tail -500f ./out.log
shell

为启动脚本赋权

chmod 777 ./restartServer.sh
shell

运行启动脚本

./restartServer.sh
shell

客户端

frpc.ini配置:

[common]
server_addr = server.demo.com
server_port = 7000
token = 123456789

[ssh]
type = tcp
local_ip = 192.168.111.111
local_port = 22
subdomain = ssh
remote_port = 8001

[web]
type = http
local_ip = 192.168.111.111
local_port = 8080
subdomain = web
remote_port = 8000
text

ssh配置

名字([]中的内容)可以随便取,但是要保证一个 服务端 下面不能有重复的。

type:协议类型。

local_ip:暴露端服务器的内网ip,需要保证客户端能访问到。

local_port:暴露端需要暴露到公网的端口,一次性只能暴露一个端口。

subdomain:公网域名访问前缀(即把 *.client.demo.com:8000前面的 *给替换掉)。

remote_port:暴露到公网的端口号。

remote_port 配置的端口号必须在服务端所在的服务器开放防火墙

web配置

配置含义与ssh配置相同,但是这里的 remote_port可以不用配置,服务端监听http请求的端口已经固定配置为 8000了。

启动客户端

客户端启动方式与服务端启动方式大致相同。

命令行启动

切换到frp目录,执行命令 ./frpc -c ./frpc.ini

后台启动

nohup ./frpc -c ./frpc.ini > out.log &

脚本启动

frp目录新建 restartClient.sh文件,粘贴以下内容

#!/bin/bash
NAME="frpc"
ID=$(ps -ef | grep "$NAME" | grep -v "$0" | grep -v "grep" | awk '{print $2}')
for id in $ID; do
  kill -9 $id
  echo "killed $NAME:[$id]"
done
nohup ./frpc -c ./frpc.ini > out.log &
tail -500f ./out.log
shell

为启动脚本赋权

chmod 777 ./restartClient.sh
shell

运行启动脚本

./restartClient.sh
shell

公网访问

访问ssh

使用ssh工具连接 ssh.client.demo.com:8001

此时内网映射到 192.168.111.111:22

访问web

浏览器访问 web.client.demo.com:8000

此时内网映射到 192.168.111.111:8080