前言

感谢FRP作者,仓库地址:https://github.com/fatedier/frp

本文所有操作都假设已具备以下基础知识:

  • Linux 命令基础
  • Docker 基础操作
  • Nginx 基础操作

准备工作

  • 具有公网IP的服务器
  • 域名(非必需 但这里只示范使用域名)

这里准备了一个子域名作为演示,*.test.domain.com,把这个域名解析到服务器,使用*表示泛解析,这样可以支持同时映射多个域名到外网 也省得之后每个映射的域名都要跑域名厂商设置解析,具体要使用的泛型子域名在frp客户端配置.

创建子域名frp.domain.com也解析到服务器,用于查看frp监控程序面板(非必需)。

创建工作目录,执行命令:

cd /usr
mkdir frp && cd frp

服务端

  • 这里使用dockerfile构建镜像
    创建dockerfile ,执行命令:
vim dockerfile

把以下内容填入dockerfile:

FROM amd64/alpine:3.10

LABEL maintainer="snowdream <hzxvvs@google.com>"

ENV FRP_VERSION 0.38.0

RUN cd /root \
    &&  wget --no-check-certificate -c https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gz \
    &&  tar zxvf frp_${FRP_VERSION}_linux_amd64.tar.gz  \
    &&  cd frp_${FRP_VERSION}_linux_amd64/ \
    &&  cp frps /usr/bin/ \
    &&  mkdir -p /etc/frp \
    &&  cp frps.ini /etc/frp \
    &&  cd /root \
    &&  rm frp_${FRP_VERSION}_linux_amd64.tar.gz \
    &&  rm -rf frp_${FRP_VERSION}_linux_amd64/ 

ENTRYPOINT /usr/bin/frps -c /etc/frp/frps.ini

这个dockerfile执行了以下操作:

  • 构建alpine-linux环境(和ubuntu发行版类似但是体积更小)
  • 从github上下载frp的release版本
  • 解压

此时就可以使用docker build命令进行编译镜像了,执行命令(注意:后面的点不是失误):

docker build -t="hzx/myfrp" .

构建完成后命令查询镜像,执行命令:

docker images

创建服务端frpc.ini配置文件

执行命令:

cat <<EOF> frps.ini
[common]
#通讯端口,用于和客户端内网穿透传输数据的端口,可自定义
bind_port = 7000
#http监听端口,注意可能和服务器上其他服务用的80冲突,比如centos有些默认有Apache,默认80,可自定义
vhost_http_port = 8007
#https监听端口,默认443,可自定义
vhost_https_port = 4437
#通过浏览器查看 frp 的状态以及代理统计信息展示(端口、用户名、密码),可自定义
dashboard_port = 7500
dashboard_user = admin123
dashboard_pwd = admin123
#通讯令牌(客户端需和此处一致)
token = frp123

# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
EOF

创建启动程序脚本

镜像库中已经存在刚刚所构建的frp镜像了,这里为了方便使用创建一个脚本来启动它,执行命令:

cat <<EOF> start.sh
#!/bin/bash
FRP_DIR=`pwd`
docker stop myfrp
docker rm myfrp
docker run -d \
    --restart always \
    --network host \
    --name myfrp \
    -v ${FRP_DIR}/frps.ini:/etc/frp/frps.ini \
    hzx/myfrp
EOF

配置域名

这里将服务器本地端口使用Nginx反向代理到泛域名,设置以下两个服务器本地端口反向代理到域名:

127.0.0.1:8007 >>> *.test.domain.com

127.0.0.1:7500 >>> frp.domain.com

这样我们就可以使用*.test.domain.com访问内网服务 和 使用frp.domain.com访问frp监控程序面板。

客户端

注意:客户端需要使用和服务端相同的版本!

下载frp发行版后解压文件,将文件名中包含frps的文件都删除(服务端的文件在客户端用不上),保留frpc相关文件就好。

假设我们需要将本地服务端口的8080和8081映射出外网使用域名访问
需要编辑客户端的frpc.ini配置文件:

[common]
#填写服务器公网IP地址
server_addr = 47.106.xx.xx
#通讯端口,和服务端保持一致(如果是第三方云服务器需在厂商安全组策略中开放该端口)
server_port = 7000
#通讯令牌,和服务端保持一致
token = frp123

[web]
type = http
local_port = 8080
custom_domains = a.test.domain.com

[web2]
type = http
local_port = 8081
custom_domains = b.test.domain.com

客户端启动

mac启动:客户端根目录进入终端输入命令回车:./frpc -c ./frpc.ini

windows 启动:双击bat运行

此时浏览器访问a.test.domain.com即可访问内网中127.0.0.1:8080的服务

完工!