什么是frp
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
为什么使用 frp
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
- 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
- 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
- 代理组间的负载均衡。
- 端口复用,多个服务通过同一个服务端端口暴露。
- 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
- 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
- 服务端和客户端 UI 页面。
服务端安装
本文主要介绍采用docker安装,首先从docker hub下载frp的服务端frps。
用docker下载frp服务端;
docker pull snowdreamtech/frps:0.44.0
创建配置文件frps.ini
[common]
# 服务端口
bind_port = 7100
# 控制启用面板每页端口
dashboard_port = 7101
# 面板登录名和密码
dashboard_user = admin
dashboard_pwd = 123456
# 使用http代理并使用7102端口进行穿透
vhost_http_port = 7102
# 使用https代理并使用7103端口进行穿透
vhost_https_port = 7103
#域名
subdomain_host = frp.ch-vip.cn
# 服务token(根据实际情况修改),相当于连接密码,建议设置
token =123456
运行
docker run -p 7100-7103:7100-7103 -d \
-v /usr/myapp/frp/frps.ini:/etc/frp/frps.ini \
--name frps snowdreamtech/frps:0.44.0
域名配置
将域名frps.ch-vip.cn二级域名指向服务器,并且*.frps.ch-vip.cn三级域名也指向服务器,三级域名指向服务使客户端可以自定义域名进行访问。
验证是否启动
通过访问地址http://frp.ch-vip.cn:7101,能够打开页面并登录成功,说明安装部署成功。
客户端使用
下载客户端
目前可以在 Github 的 Release 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中.
修改配置文件frpc.ini
[common]
#连接服务端的地址
server_addr = frps.ch-vip.cn
#连接服务端的端口
server_port = 7100
#鉴权使用的 token 值
token = 123456
[web1]
#代理类型
type = http
#本地服务端口
local_port = 8081
#自定义子域名,只需要指定域名前缀
subdomain = test1
[web2]
#代理类型
type = http
#本地服务端口
local_port = 8082
#自定义子域名,只需要指定域名前缀
subdomain = test2
启动客户端
通过cmd命令行运行如下命令
./frpc -c ./frpc.ini
#或者
frpc -c frpc.ini
在浏览器中打开test1.frps.ch-vip.cn:7102即可访问自己代理的服务。
更多配置请参考frp官方网站
nginx配置
通过nginx配置,实现管理面板及我们代理的地址都使用80端口。
创建docker网络
此处创建网络不是必须的,不创建网络容器也会加入一个默认网络。
docker network create --driver=bridge --subnet=192.168.0.0/16 --gateway=192.168.1.1 --ip-range=192.168.1.0/24 tmnet
创建nginx容器
nginx配置
server {
listen 80;
server_name frps.ch-vip.cn *.frps.ch-vip.cn;
location / {
proxy_pass http://192.168.1.200:7102;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_max_temp_file_size 0;
proxy_redirect off;
proxy_read_timeout 240s;
}
}
server {
listen 80;
server_name frps-dashboard.ch-vip.cn;
location / {
proxy_pass http://192.168.1.200:7101;
index index.html index.htm;
}
}
启动nginx并加入网络
docker run -p 80:80 -p 443:443 --net tmnet --ip 192.168.1.4 \
-v /usr/myapp/nginx/file:/var/file \
-v /usr/myapp/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/myapp/nginx/logs:/var/log/nginx \
-v /usr/myapp/nginx//run:/var/run \
--name nginx -d nginx:1.15tm
重启frps服务
不需要修改ffps.ini文件,此时启动frps服务时,不再暴露除7000以外的其他端口
docker run -p 7100:7100 --net tmnet --ip 192.168.1.200 -d \
-v /usr/myapp/frp/frps.ini:/etc/frp/frps.ini \
--name frps snowdreamtech/frps:0.44.0
客户端服务重启一下,之后就可以使用http://h5.frps.ch-vip.cn正常访问了,不再需要输入端口号
域名配置
将域名frps-dashboard.ch-vip.cn指向服务器地址,即可实现http://frps-dashboard.ch-vip.cn访问frps控制面板。
到此已实现nginx代理80端口实现转发。