前言
之前本站通过caddy直接暴露内网服务,优点是访问速度很快,缺点是在纯IPv4环境中完全无法访问。为了解决访问性问题,索性用cloudflared tunnel进行了代理。
安装
opkg update
opkg install luci-i18n-cloudflared-zh-cn
opkg会自动安装好luci-app-cloudflared及相关依赖。
配置
基本操作可以参考Cloudflare Argo Tunnel 小试:我终于可以用树莓派做网站啦,本文只讲在immoralwrt上的一些额外配置。
直接执行 clouflared 命令登录以及创建tunnel产生的 cert.pem 和 [uuid].json 文件位于 ~/.cloudflared 目录中,但是luci-app-cloudflared的默认配置文件目录为 /etc/cloudflared,你可以将它们复制过来,建立符号链接,或者干脆修改路径。我是将两个文件复制了过来:
root@ImmortalWrt:~# uci show cloudflared
cloudflared.config=cloudflared
cloudflared.config.enabled='1'
cloudflared.config.config='/etc/cloudflared/config.yml'
cloudflared.config.origincert='/etc/cloudflared/cert.pem'
cloudflared.config.protocol='http2'
cloudflared.config.loglevel='info'
cloudflared.config.logfile='/var/log/cloudflared.log'
配置文件内容如下:
root@ImmortalWrt:~# cat /etc/cloudflared/config.yml
tunnel: XXXXXXXXXXXXXXXXXX
credentials-file: /etc/cloudflared/XXXXXXXXXXXXXXXXXX.json
#
ingress:
- hostname: blog.tccmu.com
service: http://10.89.2.1:8001
- service: http_status:404
一个隧道里可以配置多个反代服务,假设我又搭建了一个聊天服务器,内网地址 http://10.89.2.5:6000,想用 chat.tccmu.com 访问,那么上面配置文件就这么修改:
root@ImmortalWrt:~# cat /etc/cloudflared/config.yml
tunnel: XXXXXXXXXXXXXXXXXX
credentials-file: /etc/cloudflared/XXXXXXXXXXXXXXXXXX.json
# 强制连接 Cloudflare 的 IPv6 节点,若没有IPv6环境请删掉下面一行
edge-ip-version: "6"
#
ingress:
- hostname: blog.tccmu.com
service: http://10.89.2.1:8001
- hostname: chat.tccmu.com
service: http://10.89.2.5:6000
- service: http_status:404
blog.tccmu.com 和 chat.tccmu.com 的DNS记录都要通过CNAME指向 XXXXXXXXXXXXXXXXXX.cfargotunnel.com并打开proxy,最后启动服务即可:
service cloudflared enable
service cloudflared start
上面的一堆XXXXXXXXXXXXXXXXXX就是json的文件名,你也可以使用 cloudflared tunnel list命令查看,对应列出的ID值。
加速内网访问
使用cloudflared tunnel之前,本站通过caddy直接反代 http://10.89.2.1:8001 实现访问。现在我们让cloudflared tunnel反代了 http://10.89.2.1:8001 ,caddy对应配置无法并存,不过可以通过额外开放端口方式实现两全其美。
本站运行在podman容器中,只需要修改compose.yaml文件,增加端口映射,然后重新创建容器即可:
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.21
restart: on-failure:3
volumes:
- ./halo2:/root/.halo2
ports:
- "8001:8090"
- "8002:8090"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
environment:
# JVM 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数
- JVM_OPTS=-Xmx256m -Xms256m
command:
# 外部访问地址,请根据实际需要修改
- --halo.external-url=https://blog.tccmu.com
这样宿主机的8001、8002端口都可访问到halo容器的8090端口,分别分配给cloudflared tunnel和caddy实现同时反代。podman命令也简单列出供参考:
# cd 进入 compose.yaml 目录,然后执行后续命令
podman compose down
# 修改 compose.yaml 并保存,然后执行后续命令
podman compose up -d
dnsmasq配置也需要修改。我所在的网络为IPv4/IPv6双栈且IPv6优先,所以需要在immortalwrt的 DHCP/DNS - 常规 页面中,将 blog.tccmu.com 解析到immortalwrt 的 IPv4与IPv6 地址。IPv4地址解析之前已经讲过,IPv6配置方式相同,用 fd开头的内网地址或者br-lan的公网IPv6地址都可以。这样配置后,在外面通过cloudflared tunnel访问,在家还是通过caddy反代直连。
