内网搭建的服务,域名不变的情况下在家里和外面访问自动切换的疑问

277 天前
 urzz

HomeLab 自建了一些服务,希望在家里和外面访问自动切换走内网还是公网

用 adguard home 自建了内网 dns 服务器

域名 xx.a.com

如果是 http ,走中转 VPS 反代到内网的 192.168.100.1 但是如果是 https ,证书是需要在内网和公网两个服务器上做同步吗? 或者有更好的方案可以实现这个需求吗?

PS. 不考虑 tailscale 等内网穿透、VPN 方案(因为期望可以不用安装代理等工具就可以走 VPS 中转直接访问)

2914 次点击
所在节点    程序员
40 条回复
urzz
277 天前
@NotFoundEgg 想问一下,cf tunnel 支持通配符域名吗? 比如 *.home.a.com

不支持的话,是得每个域名都需要单独配置一下 public hostname 嘞
NotFoundEgg
277 天前
@urzz #21 可以通配符域名的,配置一次后 cf 就不用碰了,二级域名和内网服务的解析全在内网 nginx 上操作即可,超好用
NotFoundEgg
277 天前
urzz
277 天前
@NotFoundEgg 感恩!
daisyfloor
273 天前
我没有 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 。

总之要试一下,我相信肯定可以的。我没这个条件,如果你们谁尝试后有了结论,请告诉我。谢谢。
urzz
271 天前
@daisyfloor #25 这个方式我之前试过,cf tunnel 这么配置不能使用内网的证书,配置后访问提示:ERR_SSL_VERSION_OR_CIPHER_MISMATCH

目前我的方案是:
走 CF Tunnel 时,使用 CF 提供的泛域名证书(免费套餐只支持二级泛域名证书,*.a.com 这种)
走内网正常使用内网的 https 证书( acme.sh 签发的 letsencrypt 证书)

唯一的限制是不能使用三级泛域名证书(*.homelab.a.com 这种)
daisyfloor
270 天前
还是用 adguard 解决内网 DNS ? DNS 用 CF 不能拿解决?
daisyfloor
267 天前
@NotFoundEgg tunnel 里设置了*之后,会提示“Warning: This domain contains a wildcard, so no DNS record will be created. ” 你的截图里也有。我搜了下资料,这个时候得到 DNS 里设置一个 CNAME ,* 指向 {your_tunnel_id}.cfargotunnel.com 才能实现外网访问。否则会失败的哦,你也是这样的么?
daisyfloor
267 天前
@urzz tunnel 里设置了*之后,会提示“Warning: This domain contains a wildcard, so no DNS record will be created. ” 你的截图里也有。我搜了下资料,这个时候得到 DNS 里设置一个 CNAME ,* 指向 {your_tunnel_id}.cfargotunnel.com 才能实现外网访问。否则会失败的哦,你也是这样的么?
urzz
267 天前
@daisyfloor #27 自建内网 DNS 是因为在内网的时候不需要走 tunnel 。
可以看下 append ,tunnel 设置泛域名是需要手动配置 CNAME 解析的
NotFoundEgg
267 天前
@daisyfloor 是的,要设置 CNAME *
daisyfloor
267 天前
如果 我就是在家里的一台 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
urzz
267 天前
@daisyfloor 是的,家里和外面访问,都走 tunnel
daisyfloor
267 天前
@urzz 您内网的 ssl 证书是怎么完成挑战和续期的?在没有 80 和 443 以及 DNS api 的情况下
daisyfloor
267 天前
@NotFoundEgg 通过隧道能完成内网 https 证书挑战么? 没有公网 ip ,域名本身也在 cf 管理。内网的证书咋搞定?
urzz
266 天前
@daisyfloor 走 tunnel 的话,证书是用的 cf 的
daisyfloor
266 天前
@urzz 嗯明白,我是想问问你内网证书怎么申请到的。acme 挑战也得有公开的 80 ,443 才能成功吧。dns 的话 cf 那边也已经占用了泛域名的 cname 没法设置
urzz
266 天前
@daisyfloor 不用啊,走 dns 验证,脚本可以自动添加 TXT 解析来做认证
daisyfloor
266 天前
@urzz 明白了。谢谢。
zyq2280539
134 天前
我也是这种方案,自建 DNS ,外网自动解析到 VPS 上去,家里直接解析到局域网上面去,其实是可以配置 dns 的,我刚研究好了泛域名证书。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1016923

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX