个人技术玩家往往有这个困惑,在家里往往可以搭建一个小服务器或者nas功能完备,但一到外网如果想访问自己的服务器就面临没有固定ip,搭建https没有有效证书(访问一直提示安全风险)问题;而如果租用云服务器呢又觉得自己的这点东西不愿意花太多费用。那有没有既花钱少(甚至不花钱),又高速稳定方便灵活的访问自己内网搭建服务器的方法呢?

         本文就提出了一种利用本地ubuntu服务器,分别用docker容器搭建了web服务、caddy服务,然后用frp远程注册到外网服务器,成功实现了在互联网独立ip地址的https证书访问且无需多花费一分钱。

一、主要思路

        用户本地有独立服务器资源,安装了ubuntu服务器,用docker进行管理,用容器搭建了自己的web服务,希望将其公布到互联网上,并有可靠的安全加密,数字证书不需要自己维护。最好带宽也足够。

         本文的核心的思路是用一个自动证书管理的容器反向代理已有的web服务(即caddy);用frp登录到公网frp服务器,反向代理caddy服务;用户访问公网frp服务器特定端口完成对内网web服务访问。具体逻辑图如下:

二、前置条件

       在开始操作前需要假定用户已经完成了以下工作:

  • 已经完成了docker安装;
  • docker下的web服务已经成功搭建,假定内部端口为80(注意要区分内部和外部端口),http访问;网络名为compose_default,容器名为compose_app_1;
  • 完成域名申请,假定申请的域名为example.com;假定域名在cloudflare解析;
     

三、操作步骤

3.1 申请frp免费服务

      互联网上有很多免费申请frp的服务器,用户可以根据自己的情况进行选择,选择时最好注意下地域和延时问题,确保访问的高效。这里以natfrp为例进行说明:
      登录网站:SakuraFrp 4.0并完成注册服务;
      申请隧道服务,获取地址和端口号;假设获取的地址为frp-net.com,申请的端口为50000,本地端口地址假设也是50000; 假设获取的token和隧道ID号为:xxxxxx:999999
     下载frp软件并完成本地服务安装;在下载链接:SakuraFrp 4.0,选择frpc,根据linux版本选择对应的文件,下载到服务器/usr/local/bin目录;
      编辑新文件frpc@.service
vi /etc/systemd/system/frpc@.service

[Unit]
Description=SakuraFrp Service
After=network.target

[Service]
Type=idle
User=nobody
Restart=on-failure
RestartSec=60s
ExecStart=/usr/local/bin/frpc -f %i

[Install]
WantedBy=multi-user.target

保存后退出,运行:

systemctl daemon-reload
systemctl start frpc@xxxxxx:999999 
systemctl enable frpc@xxxxxx:999999

观察状态是否正常systemctl status frpc@xxxxxx:999999,如果正常则frp安装成功。           

3.2 cloudflare域名设置

       该环节目的是设置好申请的域名,配置好参数,获取dns api token,为下一个环节caddy提供证书认证服务。
1. 登录https://dash.cloudflare.com/
2. 选择你的域名example.com->dns add record
3. 将上节申请的frp-net.com增加为cname(直接指向ip地址也没有问题);
4. 设置proxy status为 dns only;
5.获取 Cloudflare API 令牌
登录 Cloudflare,创建具有以下权限的 API 令牌:
Zone:DNS:Edit 和 Zone:Zone:Read。
记录生成的令牌(假设令牌为:xxxxxx)。

3.3 本地安装caddy服务

1. 本地创建并进入caddy目录,假设为/data/caddy;
2.    创建docker-compose.yml文件, vi /data/caddy/docker-compose.yml

# docker-compose.yml
services:
  caddy:
    image: iarekylew00t/caddy-cloudflare  # 包含DNS插件的版本
    cap_add:
      - NET_ADMIN    
    ports:
      - 50000:443
    environment:
      - CLOUDFLARE_API_TOKEN=xxxxxx  # 直接设置    
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
    restart: always      
    networks:
      - compose_default
volumes:
  caddy_data:
  caddy_config:
networks:
  compose_default:
    external: true
    name: compose_default

 注意:端口和token需要换成自己实际的值。镜像选择的包含了cloudflare插件的版本,如果是基础镜像必须要安装cloudflare插件。

3.创建caddy配置文件:Caddyfile, vi /data/caddy/Caddyfile

www.example.com example.com {
    reverse_proxy * http://compose_app_1:80
    
    tls {
        dns cloudflare {env.CLOUDFLARE_API_TOKEN}  # 使用环境变量注入API Token
    }
}

3.4 运行测试

直接运行:docker-compose up -d
注意目录必须在/data/caddy;如果以普通用户运行注意加上sudo。
测试可以用curl命令:

curl https://example.com:50000

如果返回正常则一切ok!

四、注意事项

1.需要下载包含了dns cloudflare域名解析的镜像

   iarekylew00t/caddy-cloudflare

2.在cloudflare中注意解析模式为dns only避免cloudflare代理情况

五、参考链接

1. cloudflare dns配置地址:https://dash.cloudflare.com/
2. SAKURA frp https://www.natfrp.com
3. caddy 网址:GitHub - caddyserver/caddy: Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐