HomeLab 自建了一些服务,希望在家里和外面访问自动切换走内网还是公网
用 adguard home 自建了内网 dns 服务器
域名 xx.a.com
如果是 http ,走中转 VPS 反代到内网的 192.168.100.1 但是如果是 https ,证书是需要在内网和公网两个服务器上做同步吗? 或者有更好的方案可以实现这个需求吗?
PS. 不考虑 tailscale 等内网穿透、VPN 方案(因为期望可以不用安装代理等工具就可以走 VPS 中转直接访问)
目前方案暂定使用 CF Tunnel 了,不过这个有一些注意点
参考:#19-#23
另外,有自己的VPS也可以尝试 #7 的方案,因为 tunnel 确实有点卡卡的
1
Mikawa 312 天前 1
内网:路由器配 Host
外网:去 Cloudflare Zero Trust 上配个 Argo 反代,把域名解析配过去,不需要自己的 VPS |
2
bluedawn 312 天前 1
Cloudflare Tunnel 外网访问,内网证书由 ACME-DNS 申请
|
7
mohumohu 312 天前
直接用 caddy 当 http 服务器就可以,自动申请配置证书。两边都用 caddy 就好了 不用同步。
|
9
urzz OP @bluedawn #2 请问下大佬,cf tunnel 怎么配置可以使用内网证书呢? service 应该配置域名,还是应该配置 nginx 对应的 443 端口呀?
|
10
urzz OP |
11
ochatokori 312 天前 via Android
证书不会管你的 ip ,你随便解析,只要访问的域名和服务端返回的证书上的域名匹配即可
|
13
Puteulanus 312 天前
你内网都配 https 了,反代的 vps 其实起的是内网穿透的功能,上面不需要再去配 https 证书呀
子域名多的话可以看看萌咖的泛域名 SSL 证书,30 一年,一个证书对所有子域名都生效 |
15
urzz OP @Puteulanus #13 是的,内网已经是 https 了,用的也是泛域名证书。只是 cf tunnel 不知道怎么配置可以透传使用内网的证书
|
16
IvanLi127 312 天前
我现在是通过公网服务器按 HTTPS SNI 反向直通 443 端口的流量到内网机子的 443 端口上,然后上面跑 Caddy 这类能自动申请证书的反向代理到对应的服务上。这样只要公网反向代理稳定些,证书直接能免配置签发出来,不用折腾 DNS 方案签证书。
|
17
devliu1 312 天前 via Android
还有个办法,你可以直接穿透 443 过去。这样要 keep client ip ,你需要 proxy protocol
|
19
NotFoundEgg 312 天前
|
20
NotFoundEgg 312 天前 1
@NotFoundEgg 然后内网 dns 服务器将 *.a.com 解析到 192.168.100.1
192.168.100.1 的 nginx 同时开启 80 和 443 端口,80 端口供 cf tunnel 使用,443 供内网 dns 解析使用 外网访问 x.a.com:443 -> https -> cf -> tunnel+http -> 192.168.100.1:80 内网访问 x.a.com:443 -> 192.168.100.1:443 |
21
urzz OP |
22
NotFoundEgg 312 天前 1
@urzz #21 可以通配符域名的,配置一次后 cf 就不用碰了,二级域名和内网服务的解析全在内网 nginx 上操作即可,超好用
|
23
NotFoundEgg 312 天前
|
24
urzz OP @NotFoundEgg 感恩!
|
25
daisyfloor 308 天前
我没有 homelab ,但是对这个话题感兴趣,经过我搜索。有这样一个未经验证的方案:不需要你去搞内网 DNS ,全部使用 Caddy+CF 搞定( Caddy 支持用 CF 的 DNS 进行证书挑战。)
1 、先按这个人的这个配置完成内网用域名直接进行 https 访问: https://samedwardes.com/2023/11/19/homelab-tls-with-caddy-and-cloudflare 2 、然后再按这个教程 https://caddy.community/t/caddy-with-cloudflare-tunnel/18569 ,创建外网访问的隧道,隧道设置: - https ,转发到 1 里面给反代服务器设置的那个域名 - 设置 Origin Server Name 和 Http host Header 为那个域名 理论上,2 配置完成后,外网也用同样的域名也可以访问了。我决定支持一个服务应该是可以打,要多个服务就需要泛域名, 至于泛域名,你可以试试上面那个同学那样配,就是在 1 里面做挑战的时候给 caddy 用的域名就设置为: *.lab.yourdomain.com ,然后隧道配置里,子域名填写 *.lab 域名填写 yourdomain.com 这样理论上应该就可以支持多个服务了。Caddyfile 应该是类似这样写: *.lab.yourdomain.com { tls { dns cloudflare {env.CLOUDFLARE_API_TOKEN} } reverse_proxy service1.lab.yourdomian.com x.x.x.x:port1 reverse_proxy service2.lab.yourdomian.com x.x.x.x:port2 reverse_proxy service3.lab.yourdomian.com x.x.x.x:port3 } 如果你是全 docker 部署的那就更简单了。放在一个 network 里,上述反代配置都不用写 ip ,直接容器名加端口。 隧道设置里,直接 https 转发到 caddy:443 。 总之要试一下,我相信肯定可以的。我没这个条件,如果你们谁尝试后有了结论,请告诉我。谢谢。 |
26
urzz OP @daisyfloor #25 这个方式我之前试过,cf tunnel 这么配置不能使用内网的证书,配置后访问提示:ERR_SSL_VERSION_OR_CIPHER_MISMATCH
目前我的方案是: 走 CF Tunnel 时,使用 CF 提供的泛域名证书(免费套餐只支持二级泛域名证书,*.a.com 这种) 走内网正常使用内网的 https 证书( acme.sh 签发的 letsencrypt 证书) 唯一的限制是不能使用三级泛域名证书(*.homelab.a.com 这种) |
27
daisyfloor 305 天前
还是用 adguard 解决内网 DNS ? DNS 用 CF 不能拿解决?
|
28
daisyfloor 302 天前
@NotFoundEgg tunnel 里设置了*之后,会提示“Warning: This domain contains a wildcard, so no DNS record will be created. ” 你的截图里也有。我搜了下资料,这个时候得到 DNS 里设置一个 CNAME ,* 指向 {your_tunnel_id}.cfargotunnel.com 才能实现外网访问。否则会失败的哦,你也是这样的么?
|
29
daisyfloor 302 天前
@urzz tunnel 里设置了*之后,会提示“Warning: This domain contains a wildcard, so no DNS record will be created. ” 你的截图里也有。我搜了下资料,这个时候得到 DNS 里设置一个 CNAME ,* 指向 {your_tunnel_id}.cfargotunnel.com 才能实现外网访问。否则会失败的哦,你也是这样的么?
|
30
urzz OP @daisyfloor #27 自建内网 DNS 是因为在内网的时候不需要走 tunnel 。
可以看下 append ,tunnel 设置泛域名是需要手动配置 CNAME 解析的 |
31
NotFoundEgg 302 天前
@daisyfloor 是的,要设置 CNAME *
|
32
daisyfloor 302 天前
如果 我就是在家里的一台 linux 上容器部署了 deeplX 的 api 、freshRSS 、vaultwarden 。然后能做无论在家里还是在外面 ,自己能随时随地的用。
是不是其实不用设置泛域名。就直接在 tunnel 后台添加多个 public host ,各自 http 指向对应容器服务的端口即可。不需要中间再做一次反代。 dlp.myname.com http - > deeplx_container_name:1188 rss.myname.com http - > freshrss_container_name:1200 vwd.myname.com http - > vaultwarden_container_name:1314 我只是需要数据在本地自部署,然后可以安全的访问。 似乎也用不到 nginx/caddy/traefix 做反代逻辑 请指教 @NotFoundEgg @urzz |
33
urzz OP @daisyfloor 是的,家里和外面访问,都走 tunnel
|
34
daisyfloor 302 天前
@urzz 您内网的 ssl 证书是怎么完成挑战和续期的?在没有 80 和 443 以及 DNS api 的情况下
|
35
daisyfloor 302 天前
@NotFoundEgg 通过隧道能完成内网 https 证书挑战么? 没有公网 ip ,域名本身也在 cf 管理。内网的证书咋搞定?
|
36
urzz OP @daisyfloor 走 tunnel 的话,证书是用的 cf 的
|
37
daisyfloor 301 天前
@urzz 嗯明白,我是想问问你内网证书怎么申请到的。acme 挑战也得有公开的 80 ,443 才能成功吧。dns 的话 cf 那边也已经占用了泛域名的 cname 没法设置
|
38
urzz OP @daisyfloor 不用啊,走 dns 验证,脚本可以自动添加 TXT 解析来做认证
|
39
daisyfloor 301 天前
@urzz 明白了。谢谢。
|
40
zyq2280539 169 天前
我也是这种方案,自建 DNS ,外网自动解析到 VPS 上去,家里直接解析到局域网上面去,其实是可以配置 dns 的,我刚研究好了泛域名证书。
|