V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
urzz
V2EX  ›  程序员

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

  •  
  •   urzz · 67 天前 · 2245 次点击
    这是一个创建于 67 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    域名 xx.a.com

    • 内网解析到 192.168.100.1 ( nginx/traefik )
    • 公网解析到 x.x.x.x (中转 VPS 的 IP ,用 nginx/traefik 反代到内网访问)

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

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

    第 1 条附言  ·  67 天前

    目前方案暂定使用 CF Tunnel 了,不过这个有一些注意点

    • 域名必须在cloudflare托管
    • 不支持三级通配符域名:*.home.a.com,因为CF的免费套餐证书只支持二级通配符域名: *.a.com
    • Tunnel -> HomeLab 不支持https,得用http。另外ssh、tcp等需要客户端安装 cloudflared
    • 通配符域名的 tunnel 配置,需要自行在 DNS Record 解析新增 CNAME 解析:TunnelID.cfargotunnel.com。TunnelID 可以在tunnel的dashboard找到

    参考:#19-#23

    另外,有自己的VPS也可以尝试 #7 的方案,因为 tunnel 确实有点卡卡的

    39 条回复    2024-03-02 11:49:21 +08:00
    Mikawa
        1
    Mikawa  
       67 天前   ❤️ 1
    内网:路由器配 Host
    外网:去 Cloudflare Zero Trust 上配个 Argo 反代,把域名解析配过去,不需要自己的 VPS
    bluedawn
        2
    bluedawn  
       67 天前   ❤️ 1
    Cloudflare Tunnel 外网访问,内网证书由 ACME-DNS 申请
    urzz
        3
    urzz  
    OP
       67 天前
    @bluedawn #2 cf tunnel 可以直接将流量转发到内网吗?我去搜一下,感谢
    urzz
        4
    urzz  
    OP
       67 天前
    @Mikawa #1 外网访问的时候需要客户端安装代理吗?
    Mikawa
        5
    Mikawa  
       67 天前
    @urzz 我和 3 楼说的是同一个东西,客户端不需要代理
    urzz
        6
    urzz  
    OP
       67 天前
    @Mikawa #5 感谢!我试一下
    mohumohu
        7
    mohumohu  
       67 天前
    直接用 caddy 当 http 服务器就可以,自动申请配置证书。两边都用 caddy 就好了 不用同步。
    urzz
        8
    urzz  
    OP
       67 天前
    @mohumohu #7 两边都会重新申请证书,先申请的证书不会被作废么?
    urzz
        9
    urzz  
    OP
       67 天前
    @bluedawn #2 请问下大佬,cf tunnel 怎么配置可以使用内网证书呢? service 应该配置域名,还是应该配置 nginx 对应的 443 端口呀?
    urzz
        10
    urzz  
    OP
       67 天前
    @Mikawa #1 麻烦问下,cf tunnel 怎么使用内网证书呢?还有对应 service 配置,有示例可以看下不?

    另外还有一个疑问,这个可以配置通配符域名吗?
    ochatokori
        11
    ochatokori  
       67 天前 via Android
    证书不会管你的 ip ,你随便解析,只要访问的域名和服务端返回的证书上的域名匹配即可
    mohumohu
        12
    mohumohu  
       67 天前
    @urzz 不会,caddy 零配置全自动。一个 ca 申请失败还会尝试下一个 ca 。
    Puteulanus
        13
    Puteulanus  
       67 天前
    你内网都配 https 了,反代的 vps 其实起的是内网穿透的功能,上面不需要再去配 https 证书呀
    子域名多的话可以看看萌咖的泛域名 SSL 证书,30 一年,一个证书对所有子域名都生效
    urzz
        14
    urzz  
    OP
       67 天前
    @mohumohu #12 同一个域名,同一个 ca ( let's encrypt )不会主动吊销上一个证书么?如果是这样的话倒是可以实现嘞
    urzz
        15
    urzz  
    OP
       67 天前
    @Puteulanus #13 是的,内网已经是 https 了,用的也是泛域名证书。只是 cf tunnel 不知道怎么配置可以透传使用内网的证书
    IvanLi127
        16
    IvanLi127  
       67 天前
    我现在是通过公网服务器按 HTTPS SNI 反向直通 443 端口的流量到内网机子的 443 端口上,然后上面跑 Caddy 这类能自动申请证书的反向代理到对应的服务上。这样只要公网反向代理稳定些,证书直接能免配置签发出来,不用折腾 DNS 方案签证书。
    devliu1
        17
    devliu1  
       67 天前 via Android
    还有个办法,你可以直接穿透 443 过去。这样要 keep client ip ,你需要 proxy protocol
    mohumohu
        18
    mohumohu  
       67 天前
    @urzz 完全不会。只是同一个 IP 地址调用申请 API 频率有限制而已( caddy 设计的就是 10 分钟频率不会超)
    NotFoundEgg
        19
    NotFoundEgg  
       67 天前
    @urzz #15 cf tunnel 访问内网使用 http ,然后在 cf 里开启"始终使用 HTTPS"

    外网 -> https -> cf-> tunnel+http -> 内网
    NotFoundEgg
        20
    NotFoundEgg  
       67 天前   ❤️ 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
    urzz
        21
    urzz  
    OP
       67 天前
    @NotFoundEgg 想问一下,cf tunnel 支持通配符域名吗? 比如 *.home.a.com

    不支持的话,是得每个域名都需要单独配置一下 public hostname 嘞
    NotFoundEgg
        22
    NotFoundEgg  
       67 天前   ❤️ 1
    @urzz #21 可以通配符域名的,配置一次后 cf 就不用碰了,二级域名和内网服务的解析全在内网 nginx 上操作即可,超好用
    urzz
        24
    urzz  
    OP
       67 天前
    @NotFoundEgg 感恩!
    daisyfloor
        25
    daisyfloor  
       63 天前
    我没有 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
        26
    urzz  
    OP
       61 天前
    @daisyfloor #25 这个方式我之前试过,cf tunnel 这么配置不能使用内网的证书,配置后访问提示:ERR_SSL_VERSION_OR_CIPHER_MISMATCH

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

    唯一的限制是不能使用三级泛域名证书(*.homelab.a.com 这种)
    daisyfloor
        27
    daisyfloor  
       60 天前
    还是用 adguard 解决内网 DNS ? DNS 用 CF 不能拿解决?
    daisyfloor
        28
    daisyfloor  
       57 天前
    @NotFoundEgg tunnel 里设置了*之后,会提示“Warning: This domain contains a wildcard, so no DNS record will be created. ” 你的截图里也有。我搜了下资料,这个时候得到 DNS 里设置一个 CNAME ,* 指向 {your_tunnel_id}.cfargotunnel.com 才能实现外网访问。否则会失败的哦,你也是这样的么?
    daisyfloor
        29
    daisyfloor  
       57 天前
    @urzz tunnel 里设置了*之后,会提示“Warning: This domain contains a wildcard, so no DNS record will be created. ” 你的截图里也有。我搜了下资料,这个时候得到 DNS 里设置一个 CNAME ,* 指向 {your_tunnel_id}.cfargotunnel.com 才能实现外网访问。否则会失败的哦,你也是这样的么?
    urzz
        30
    urzz  
    OP
       57 天前
    @daisyfloor #27 自建内网 DNS 是因为在内网的时候不需要走 tunnel 。
    可以看下 append ,tunnel 设置泛域名是需要手动配置 CNAME 解析的
    NotFoundEgg
        31
    NotFoundEgg  
       57 天前
    @daisyfloor 是的,要设置 CNAME *
    daisyfloor
        32
    daisyfloor  
       57 天前
    如果 我就是在家里的一台 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
        33
    urzz  
    OP
       57 天前
    @daisyfloor 是的,家里和外面访问,都走 tunnel
    daisyfloor
        34
    daisyfloor  
       57 天前
    @urzz 您内网的 ssl 证书是怎么完成挑战和续期的?在没有 80 和 443 以及 DNS api 的情况下
    daisyfloor
        35
    daisyfloor  
       57 天前
    @NotFoundEgg 通过隧道能完成内网 https 证书挑战么? 没有公网 ip ,域名本身也在 cf 管理。内网的证书咋搞定?
    urzz
        36
    urzz  
    OP
       56 天前
    @daisyfloor 走 tunnel 的话,证书是用的 cf 的
    daisyfloor
        37
    daisyfloor  
       56 天前
    @urzz 嗯明白,我是想问问你内网证书怎么申请到的。acme 挑战也得有公开的 80 ,443 才能成功吧。dns 的话 cf 那边也已经占用了泛域名的 cname 没法设置
    urzz
        38
    urzz  
    OP
       56 天前
    @daisyfloor 不用啊,走 dns 验证,脚本可以自动添加 TXT 解析来做认证
    daisyfloor
        39
    daisyfloor  
       56 天前
    @urzz 明白了。谢谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1141 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:30 · PVG 07:30 · LAX 16:30 · JFK 19:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.