• 云原生-FRP内网穿透(详解)使用云服务器将内网集群服务暴露至公网(二)


    前排提示:多看文档少吃亏!本文包含 frp docker 镜像创建步骤 !
    FRP 官方文档地址:FRP官网

    1.为什么使用frp

    场景:家中电脑或者公司电脑上跑起了一个Web服务,那么这时如何通过公网IP或者公网的域名访问到这个Web服务呢?

    常用解决方案:向网络运营商(联通、移动、电信)购买公网IP地址绑定到端口上。弊端:固定IP收费很高!且在公司或办公地点并不固定的时候,很难办!

    因此本章选择的解决方案frp 内网穿透!使用云服务器,由云服务商提供固定的公网IP。通过frp的技术实现云服务器和内网程序的代理通讯。

    用户请求路径: 用户浏览器 => 云服务器(frp服务端) => 内网Web服务(frp客户端)

    frp 简介

    frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

    frp 采用 Golang 编写,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖。

    frp特点

    通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

    • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
    • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
    • 代理组间的负载均衡。
    • 端口复用,多个服务通过同一个服务端端口暴露。
    • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
    • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
    • 服务端和客户端 UI 页面。

    2.下载使用

    看过上面的简介,我们要做的事情就比较清晰了,此处我购买的是一台阿里云的轻量级应用服务器,地区选择的香港,由阿里云提供香港的公网的IP地址,且香港的服务器绑定域名可以省去域名备案的步骤。【旺柴】!

    准备工作:

    1.购买阿里云轻量级应用服务器一台【我直接选最便宜的】,地区【香港】!
    2.本地电脑上启动需要暴露到公网的Web服务,(云原生系列里我们已经启动了一个Kubesphere云原生管理平台服务)

    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客户端和服务端

    frp官方的服务端和客户端是打包在一起的,根据自己的服务器cpu类型去官网选择对应的安装包,阿里云轻量级应用服务器,下载AMD64版本即可,附上AMD64 架构的下载链接
    不知道自己电脑什么体系架构的可以执行 :arch 命令查看,目前主流的windows一般都是x86_64的。

    阿里云服务器上安装服务端

    安全起见强烈建议在docker中跑frp服务并启用HTTPS。本配置包含frp提供的安全配置内容!请自行准备两个公网域名和SSL证书。本文中已经将证书存放于集群master1主节点和阿里云服务器的 /opt/ssl/ 目录中

    云服务器系统选择

    阿里云轻量级应用服务器系统选择: Ubuntu20.04 LTS!(需要安装docker,没安装的可以参考这里:Ubuntu安装Docker

    证书准备(集群master1节点、阿里云服务器):

    #集群控制台的证书(需要额外准备一个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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    至此服务端配置完成!
    fprs控制台dashboard的访问路径: 云服务器公网IP:9999

    安装 frp 客户端

    在集群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
    
    #启用 admin 端口 7400 ,用于提供 API 服务,支持配置文件热加载, frpc reload 命令来动态加载配置文件,通常会在 10 秒内完成代理的更新。
    #热加载命令 :
    #先进入容器 : docker exec -it 容器ID  /bin/sh      
    #重新加载配置: frpc reload -c /var/frp/conf/frpc.ini
    admin_addr = 127.0.0.1
    admin_port = 7400
    
    #服务认证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  -p 7400:7400 ptcode-frpc:0.44.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149

    使用公网代理服务器的IP访问kubesphere服务

    访问frps的控制台页面,可以看到已经映射了我们在配置文件中配置的两个域名服务,已经启用了https,并且开启了压缩和流量加密。
    在这里插入图片描述

    公网域名访问Kubesphere控制台
    在这里插入图片描述
    公网IP访问网关对外暴露的BookInfo服务:
    在这里插入图片描述

    文末其他推荐: 内网穿透解决方案选择

    Ubuntu 本地安装根CA证书命令

    cp /opt/ssl/xxx.xxx_root.crt /usr/local/share/ca-certificates/ && update-ca-certificates 
    
    • 1
  • 相关阅读:
    网络安全漏洞管理十大度量指标
    uni-app设置分包和预下载
    数据结构——排序の选择题整理
    批量插入数据与分页的原理及推导
    TeamTalk中msg_server初始化工作,如何维护与其他服务器的心跳连接
    SAP UI5 里的 Busy Indicator 控件使用概述
    硬件基础之HEX文件格式
    Google Earth Engine(GEE)——基于Landsat的高级植被指数 (AVI)、裸土指数 (BSI) 和冠层阴影指数 (SSI) 的计算
    安卓TextView的lineHeight*lineCount!=height问题,解决不支持滚动的系统下对多页Text进行分页
    ESP8266-Arduino编程实例-VEML7700光照度传感器驱动
  • 原文地址:https://blog.csdn.net/qq_31140865/article/details/125803941