前排提示:多看文档少吃亏!本文包含 frp docker 镜像创建步骤 !
FRP 官方文档地址:FRP官网
场景:家中电脑或者公司电脑上跑起了一个Web服务,那么这时如何通过公网IP或者公网的域名访问到这个Web服务呢?
常用解决方案:向网络运营商(联通、移动、电信)购买公网IP地址绑定到端口上。弊端:固定IP收费很高!且在公司或办公地点并不固定的时候,很难办!
因此本章选择的解决方案:frp 内网穿透!使用云服务器,由云服务商提供固定的公网IP。通过frp的技术实现云服务器和内网程序的代理通讯。
用户请求路径: 用户浏览器 => 云服务器(frp服务端) => 内网Web服务(frp客户端)
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
frp 采用 Golang 编写,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖。
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
看过上面的简介,我们要做的事情就比较清晰了,此处我购买的是一台阿里云的轻量级应用服务器,地区选择的香港,由阿里云提供香港的公网的IP地址,且香港的服务器绑定域名可以省去域名备案的步骤。【旺柴】!
1.购买阿里云轻量级应用服务器一台【我直接选最便宜的】,地区【香港】!
2.本地电脑上启动需要暴露到公网的Web服务,(云原生系列里我们已经启动了一个Kubesphere云原生管理平台服务)
本地访问的IP:http://10.10.10.10:30880(使用FRP暴露到公网,仅做演示!)
Kubesphere集群网关中使用了OpenELB作为负载均衡器,网关实际使用的IP地址为10.10.10.100:80/443(集群网关服务通过FRP暴露到公网)
上一章已经在KubeSphere的应用路由中配置过了Bookinfo这个应用了,这里应用路由中的域名填了 www.test1.com (自行购买的公网域名)所以,访问该域名请求会被路由到BookInfo微服务上。
接下来要做的,就要使用FRP 内网穿透+阿里云的轻量级应用服务器,将集群网关和集群的控制台暴露到公网环境中!
如果对如何配置集群网关感兴趣,请移步:2.云原生-安装OpenELB负载均衡器,启用KubeSphere3.3.0的集群网关
frp官方的服务端和客户端是打包在一起的,根据自己的服务器cpu类型去官网选择对应的安装包,阿里云轻量级应用服务器,下载AMD64版本即可,附上AMD64 架构的下载链接
不知道自己电脑什么体系架构的可以执行 :arch 命令查看,目前主流的windows一般都是x86_64的。
安全起见强烈建议在docker中跑frp服务并启用HTTPS。本配置包含frp提供的安全配置内容!请自行准备两个公网域名和SSL证书。本文中已经将证书存放于集群master1主节点和阿里云服务器的 /opt/ssl/ 目录中
阿里云轻量级应用服务器系统选择: Ubuntu20.04 LTS!(需要安装docker,没安装的可以参考这里:Ubuntu安装Docker)
#集群控制台的证书(需要额外准备一个CA根证书)
/opt/ssl/www.test.com_root.crt (CA根证书)
/opt/ssl/www.test.com.key
/opt/ssl/www.test.com_bundle.crt
#集群网关的证书
/opt/ssl/www.test1.com.key
/opt/ssl/www.test1.com_bundle.crt
#1.开始在阿里云服务器上执行命令,首先查看docker版本,确保已经安装docker
docker version | awk 'NR==2'
#2.创建frp目录
mkdir /opt/frp
cd /opt/frp
#3.下载frp
curl -sLO https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz
#4.解压
tar -zxvf frp_0.44.0_linux_amd64.tar.gz
cd /opt/frp/frp_0.44.0_linux_amd64/
mkdir /opt/frp/conf
#5.frps 服务端配置,复制配置到映射目录,配置文件中需要替换tls配置中的证书文件改为自己申请的证书文件!
cat > /opt/frp/frp_0.44.0_linux_amd64/frps.ini << 'EOF'
[common]
# 监听端口
bind_port = 7000
# 面板端口
dashboard_port = 7500
# dashboard 用户名密码(可选),改为自己的用户名和密码
dashboard_user = admin
dashboard_pwd = admin
# dashboard 启用https, 填写准备好的ssl的文件路径即可,容器启动时会将该目录映射到容器中,证书文件名需要替换为自己的!
dashboard_tls_mode = true
dashboard_tls_cert_file = /opt/ssl/www.test.com_bundle.crt
dashboard_tls_key_file = /opt/ssl/www.test.com.key
# 设置http及https协议下代理端口(非重要)
vhost_http_port = 80
vhost_https_port = 443
# 单向TLS认证,这里填CA的根证书,客户端来向服务端做单向认证,证书文件名需要替换为自己的!
tls_trusted_ca_file = /opt/ssl/www.test.com_root.crt
#服务认证token,与客户端的token项一至即可。(建议修改)
token = 123456789
# TCP多路复用,此项默认就是开启的。避免创建很多连接占用描述符资源,降低延迟!
# tcp_mux = true
#防止端口滥用,配置服务端的端口白名单
#allow_ports = 80,443,7000,9000-20000,30880
EOF
cp /opt/frp/frp_0.44.0_linux_amd64/frps.ini /opt/frp/conf/
#6.创建dockerfile
touch Dockerfile
#7.写入dockerfile配置
cat > ./Dockerfile << EOF
FROM golang:1.18 AS building
MAINTAINER 平塘码道
ARG FRP_VERSION=0.44.0
COPY . /building
WORKDIR /building
RUN make frps
FROM alpine:3
COPY --from=building /building/frps /usr/bin/frps
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENTRYPOINT ["/usr/bin/frps", "-c", "/var/frp/conf/frps.ini"]
EOF
#8.使用官方文件的版本,构建自家的 frp 镜像,别人的镜像信不过,手动狗头!
docker build . -f /opt/frp/frp_0.44.0_linux_amd64/Dockerfile -t ptcode-frps:0.44.0
#9.清理无用的镜像!
docker images | grep none | awk '{print $3}' | xargs docker rmi
#10.运行
docker run --restart always -d -v /opt/frp/conf:/var/frp/conf -v /opt/ssl:/opt/ssl --name frps -p 7000:7000 -p 9999:7500 -p 80:80 -p 443:443 -p 8888:8888 ptcode-frps:0.44.0
至此服务端配置完成!
fprs控制台dashboard的访问路径: 云服务器公网IP:9999
在集群master1节点的docker容器中安装frpc!客户端可以单独安装在任意的虚拟机节点。 【旺柴】!
#1.创建frpc文件夹
mkdir /opt/frp
cd /opt/frp
#2.下载frp
curl -sLO https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz
#3.解压
tar -zxvf frp_0.44.0_linux_amd64.tar.gz
cd /opt/frp/frp_0.44.0_linux_amd64/
mkdir /opt/frp/conf
#4.frpc客户端配置,复制配置到映射目录,配置项请根据自己的需求进行修改
cat > /opt/frp/frp_0.44.0_linux_amd64/frpc.ini << 'EOF'
[common]
#服务端绑定的IP,此处是阿里云服务器服务端的公网IP,改成自己的(必改项)
server_addr = XXX.XXX.XXX.XXX
#客户端与服务端绑定的端口,均为7000
server_port = 7000
#服务认证token,与服务端的token项一至即可。(建议修改)
token = 123456789
#启用tls,证书放在了/opt/ssl里面,容器启动时会将该目录映射到容器中
tls_enable = true
tls_cert_file = /opt/ssl/www.test.com_bundle.crt
tls_key_file = /opt/ssl/www.test.com.key
#代理的本地kubesphere服务,通过http2http插件将本地的http服务代理为https,类似于nginx代理443端口转发到本地的http服务。
#集群控制台映射到服务端配置的 vhost_https_port https 协议代理端口
[KubeSphere集群控制台]
type = https
#此处的域名请改为自己申请域名的其中一个,部署成功后通过该域名:8888端口访问集群控制台服务
custom_domains = www.test.com
#访问前需要用户认证!请确定服务认证步骤中是否需要开启此项,此项由 http_proxy 插件提供!(可选)
# http_user = admin
# http_pwd = admin
# 安全配置,为防止中间人获取报文,启用加密措施,叠加tls双重保护,增加安全性!
use_encryption = true
# 启用压缩提升长报文传输速率,开启会消耗一定的CPU资源,我直接开启,狗头!
use_compression = true
# Proxy Protocol,获取用户真实IP,目前支持 v1 和 v2 两个版本的 proxy protocol 协议。
proxy_protocol_version = v2
# 插件配置: http2http,该插件将本地的服务暴露成为https的服务!
plugin = https2http
# 本地对外暴露http的kubesphere控制台服务地址
plugin_local_addr = 10.10.10.10:30880
# HTTPS 所需的SSL证书文件,如果 crt 和 key 都为空,则使用自动生成的证书
plugin_crt_path = /opt/ssl/www.test.com_bundle.crt
# HTTPS 所需的SSL密钥文件
plugin_key_path = /opt/ssl/www.test.com.key
# 发送给本地服务的请求头地址重写(可选)
# plugin_host_header_rewrite = 10.10.10.10
# plugin_header_X-From-Where = ptcode-frp
#代理限速,单个代理限速设置(可选)
#bandwidth_limit = 5MB
#范围端口映射(可选)
#local_port = 6000-6005,6007
#remote_port = 6000-6005,6007
#下面的配置是为kubesphere的集群网关准备的!
[KubeSphere-HTTPS集群的网关服务]
type = https
#这里为自己申请的域名,通过此域名+443端口访问对外暴露的集群网关!
custom_domains = www.test1.com
# 安全配置,为防止中间人获取报文,启用加密措施,叠加tls双重保护,增加安全性!
use_encryption = true
# 启用压缩提升长报文传输速率,开启会消耗一定的CPU资源,我直接开启,狗头!
use_compression = true
# Proxy Protocol,获取用户真实IP,目前支持 v1 和 v2 两个版本的 proxy protocol 协议。
proxy_protocol_version = v2
# 插件配置: https2https麻将本地的https服务暴露为https
plugin = https2https
# 本地对外暴露的集群网关IP地址,所有外部流量统一转发到集群网关处理
plugin_local_addr = 10.10.10.100:443
# HTTPS 所需的SSL证书文件,如果 crt 和 key 都为空,则使用自动生成的证书
plugin_crt_path = /opt/ssl/www.test1.com_bundle.crt
# HTTPS 所需的SSL密钥文件
plugin_key_path = /opt/ssl/www.test1.com.key
# 发送给本地服务的请求头地址重写(可选)
# plugin_host_header_rewrite = 10.10.10.10
# plugin_header_X-From-Where = ptcode-frp
#代理限速,单个代理限速设置(可选)
#bandwidth_limit = 5MB
#范围端口映射(可选)
#local_port = 6000-6005,6007
#remote_port = 6000-6005,6007
#[集群中的其他应用,更换域名即可!通过域名就可以访问到集群网关地址,配置不同的域名访问不同的集群服务!只需增加配置修改custom_domains对应的域名地址即可]
[KubeSphere-HTTPS集群的其他应用服务]
type = https
#这里为自己申请的域名,通过此域名+443端口访问对外暴露的集群网关!
custom_domains = www.其他应用.com
# 安全配置,为防止中间人获取报文,启用加密措施,叠加tls双重保护,增加安全性!
use_encryption = true
# 启用压缩提升长报文传输速率,开启会消耗一定的CPU资源,我直接开启,狗头!
use_compression = true
# Proxy Protocol,获取用户真实IP,目前支持 v1 和 v2 两个版本的 proxy protocol 协议。
proxy_protocol_version = v2
# 插件配置: https2https麻将本地的https服务暴露为https
plugin = https2https
# 本地对外暴露的集群网关IP地址,所有外部流量统一转发到集群网关处理
plugin_local_addr = 10.10.10.100:443
# HTTPS 所需的SSL证书文件,如果 crt 和 key 都为空,则使用自动生成的证书
plugin_crt_path = /opt/ssl/www.test1.com_bundle.crt
# HTTPS 所需的SSL密钥文件
plugin_key_path = /opt/ssl/www.test1.com.key
# 发送给本地服务的请求头地址重写(可选)
# plugin_host_header_rewrite = 10.10.10.10
# plugin_header_X-From-Where = ptcode-frp
#代理限速,单个代理限速设置(可选)
#bandwidth_limit = 5MB
#范围端口映射(可选)
#local_port = 6000-6005,6007
#remote_port = 6000-6005,6007
EOF
cp /opt/frp/frp_0.44.0_linux_amd64/frpc.ini /opt/frp/conf/
#5.创建dockerfile
touch Dockerfile
#6.写入Dockerfile配置
cat > ./Dockerfile << EOF
FROM golang:1.18 AS building
MAINTAINER 平塘码道
ARG FRP_VERSION=0.44.0
COPY . /building
WORKDIR /building
RUN make frpc
FROM alpine:3
COPY --from=building /building/frpc /usr/bin/frpc
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENTRYPOINT ["/usr/bin/frpc", "-c", "/var/frp/conf/frpc.ini"]
EOF
#7.使用官方文件的版本,构建自家的镜像,别人的镜像信不过,手动狗头!
docker build . -f /opt/frp/frp_0.44.0_linux_amd64/Dockerfile -t ptcode-frpc:0.44.0
#8.清理无用的镜像!
docker images | grep none | awk '{print $3}' | xargs docker rmi
#9.运行
docker run --restart always -d -v /opt/frp/conf:/var/frp/conf -v /opt/ssl:/opt/ssl --name frpc -p 7000:7000 ptcode-frpc:0.44.0
访问frps的控制台页面,可以看到已经映射了我们在配置文件中配置的两个域名服务,已经启用了https,并且开启了压缩和流量加密。
公网域名访问Kubesphere控制台
公网IP访问网关对外暴露的BookInfo服务:
文末其他推荐: 内网穿透解决方案选择
Ubuntu 本地安装根CA证书命令
cp /opt/ssl/xxx.xxx_root.crt /usr/local/share/ca-certificates/ && update-ca-certificates