docker环境下caddy+nrp搭建自动证书申请web服务
个人技术玩家往往有这个困惑,在家里往往可以搭建一个小服务器或者nas功能完备,但一到外网如果想访问自己的服务器就面临没有固定ip,搭建https没有有效证书(访问一直提示安全风险)问题;而如果租用云服务器呢又觉得自己的这点东西不愿意花太多费用。那有没有既花钱少(甚至不花钱),又高速稳定方便灵活的访问自己内网搭建服务器的方法呢? 本文就提出了一种利用本地ubuntu服务器,分别用
个人技术玩家往往有这个困惑,在家里往往可以搭建一个小服务器或者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
更多推荐
所有评论(0)