V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
yaocf
V2EX  ›  Linux

Traefik 代理 smtps 和 imaps 等邮箱协议

  •  
  •   yaocf · 17 天前 · 1304 次点击

    目前环境:

    • 域名 cdn (cdn.domain): 作为邮箱后缀,cloudflare 托管
    • 域名 real (real.domain): 真实主机的 ddns 域名,Openwrt 系统,通过 Docker 运行着 mailu 、certbox 、traefik ,且被 cloudflare 反代所有 https 服务。
    • 邮箱服务:mailu ( Docker ),配置的是域名 cdn ( cdn.domain )的证书,以及cdn.domain的邮箱后缀,前端页面是https://mailu-front.cdn.domain(通过 openwrt 自身的 nginx 反代并交给 cloudflare )以及https://mailu-front.real.domain(通过 openwrt 自身的 nginx 反代)。smtps 和 imaps 的服务器地址是:mail.cdn.domain
    • 证书:certbot ( Docker ),包含 cdn.domainreal.domain 的证书

    问题: 由于 cloudflare 无法反代 smtp 、imap 、smtps 、imaps 等协议,目前只能在内网通过 Dnsmasq 将 cdn.domain 的地址手动解析到内网网关,是可以正常通过 cdn.domain 来访问 mailu 的邮件协议的。为了保护real.domain,所以,并不希望直接让 cloudflare 把mail.cdn.domain解析到真实地址。

    期望达到的效果: 希望可以通过 real.domain ,也能访问 mailu 。但是对于客户端:smtps 和 imaps ,好像会验证 sni ,导致无法通过 real.domain 访问。即使是使用不带 tls 的 smtp 和 imap ,小米的邮件客户端也会验证 Host ,然后提示解析失败。

    • 尝试过的思路:
      • 用 nginx 反代 mail 协议( mailu 有 auth_http 地址),但是 openwrt 的 nginx-full 没有 mail 模块。也尝试过起一个 docker 的 nginx ,但是也没成功(不知道哪里配置错了,客户端只是提示连接被拒绝)
      • 用 traefik ,不知道是不是 smtps 和 imaps 不支持,mailu 官方给出的配置,是纯粹只做了路由,并没有让 traefik 解析 tls ,mailu 官方的配置好像是无法达到使用不同的域名的。

    请问各位大大,有什么好的方案解决这个问题吗?

    22 条回复    2024-10-22 15:49:46 +08:00
    yaocf
        1
    yaocf  
    OP
       17 天前
    另外,有没有啥好的工具可以 debug 或者显示 imap/imaps 协议协商和验证的全过程的?也希望各位大大不吝分享。
    terrytw
        2
    terrytw  
       17 天前
    看半天也没太看懂

    你的 real.domain 是 cloudflare 反代的, 但是 cloudflare 反代又不支持 smtps imaps, 那谈何 sni 验证, 流量都到达不了你的主机?
    terrytw
        3
    terrytw  
       17 天前
    你是说希望在内网里把 real.domain 也手动解析到内网网关?
    terrytw
        4
    terrytw  
       17 天前
    然后仅内网访问邮箱服务?
    yaocf
        5
    yaocf  
    OP
       17 天前
    @terrytw 就是因为这个原因,所以,希望通过 real.domain 去公网访问邮件服务。
    也就是按照正常流程,登录邮件客户端填写如下:

    地址: [email protected]
    服务器地址:mail.cdn.domain
    端口:。。。。。。


    希望可以是:
    地址 [email protected]
    服务器地址:mail.real.domain
    端口:。。。。。。
    yaocf
        6
    yaocf  
    OP
       17 天前
    也就是,如果使用 mail.cdn.domain 在公网连接邮件服务,还是会走到 cloudflare 的然后无响应(不用管收信。cloudflare 的邮件路由会把邮件转给指定邮箱)。
    但是用 mail.real.domain 是可以正常连接到邮件服务的。

    发信也是配置了中继( Brevo ),所以,除非是知道 real.domain ,以及 mail.real.domain ,否则,是无法对 real.domain 发起攻击的。
    yinmin
        7
    yinmin  
       17 天前 via iPhone
    mailu 换成通配符证书*.domain
    yaocf
        8
    yaocf  
    OP
       17 天前
    @yinmin
    抱歉,没考虑到这种情况。

    `cdn.domain`和`real.domain`不是同一个根域名。
    写成`mail.real_domain`和`mail.real_domain`可能会容易理解一点。
    terrytw
        9
    terrytw  
       17 天前
    @yaocf 所以你的 real.mail.domain 不是反代的? 是直接解析到真实 IP?
    yaocf
        10
    yaocf  
    OP
       17 天前
    @terrytw 对,`cdn.domain`是被 cloudflare 托管并开启了小云朵的,`real.domain`是对应的真实的主机。mailu 和 traefik 以及 nginx 都是 real.domain 的真实主机中的 docker 服务。
    terrytw
        11
    terrytw  
       17 天前
    你这真的解释的很混乱

    "域名 real ( real.domain ): 真实主机的 ddns 域名,Openwrt 系统,通过 Docker 运行着 mailu 、certbox 、traefik ,且被 cloudflare 反代所有 https 服务", 这是你自己说的, 现在你又说 real.domain 没有反代...

    不过现在我大概理解了, 你需求是, 客户端通过 mail.real.domain 去访问 imaps smtps, 但是可以实际连通 mail.cdn.domain, 问题在于 SNI 不匹配

    让我想一想
    yaocf
        12
    yaocf  
    OP
       17 天前
    邮箱地址的域名用的是 cdn.domain (它比较短,也比较好记)。按照 mailu 的配置,邮箱服务器的地址默认是 mail.cdn.domain 。但是这个地址属于 cdn.domain ,cdn.domain 域名是整个托管给了 cloudflar 的(它不处理 smtp 和 imap 等服务)。为了保护 real.domain 主机,并不希望 cdn.domain 的任何地址被指向 real.domain 。

    但是又需要在公网连接到邮箱服务。所以想知道这么做是不是可以行。

    按理说应该是没问题的,更多公共邮箱的邮件服务器和邮箱地址域名都是不一致的。
    yaocf
        13
    yaocf  
    OP
       17 天前
    @terrytw 确实说漏了,这里说的反代所有的 https 服务是反代的 traefik 的 dashboard 、mailu 的 front 界面,他们都是 https 的服务。并没有反代其它协议。
    real.domain 没有反代是说的 smtp 、imap 之类的服务。

    但是实际上,通过 real.domain 域名对应的子域名也可以访问这些 https 服务,real.domain 上有一个总的 nginx 做了这些 https 服务的 sni 分流。

    比如 mailu-front.real.domain ( nginx->mailu 前端) 和 mailu-front.cdn.domain ( cloudflare->nginx->mailu 前端),访问的都是同一个内容。
    yaocf
        14
    yaocf  
    OP
       17 天前
    按照官方的配置: https://mailu.io/master/reverse.html
    它可能还缺少了一个 tls.passthrough=true

    也就是 traefik 只负责路由,并不负责解析 tls 。

    不知道是不是能:client->traefik 代理的 smtps ( sni:mail.real.domain )->traefik 去掉 tls 层->mailu 上的 smtp (最好是 traefik 能把主机名改成 mail.cdn.domain ,类似 nginx 代理的时候的`proxy_set_header Host $host;`)
    terrytw
        15
    terrytw  
       17 天前
    tls 其实是好解决的
    问题在于你用不带 tls 的 smtp 和 imap 协议访问, 因为 Host 不匹配而无法连接, 这个我暂时没想到什么办法

    这个和 traefik 和 nginx 都无关了吧, 你等于客户端直连 mailu 都不行
    terrytw
        16
    terrytw  
       17 天前
    @yaocf 你主帖不是说小米邮件客户端会验证 host 么, 那光改 upstream header 有用吗?
    terrytw
        17
    terrytw  
       17 天前
    而且 smtp 又不是 http, 不存在 host 这样的 header, 你要是搞不清楚你邮件客户端是怎么验证 host 的, 后面也没法弄了
    yinmin
        18
    yinmin  
       17 天前 via iPhone
    mailu 换成多域名证书,一个证书包含 2 个域名(如果你不希望别人从证书里获取到你 real 服务器真实域名,就一个证书包含 2 个通配符域名)
    yaocf
        19
    yaocf  
    OP
       17 天前
    @terrytw 嗯,确实,目前还不清楚 smtp 的细节。
    yaocf
        20
    yaocf  
    OP
       17 天前
    @yinmin 目前做不到,real.domain 和 cdn.domain 都是申请到的域名的顶层了。它俩没办法通配。
    yaocf
        21
    yaocf  
    OP
       17 天前
    目前只能临时改掉 mailu 的配置,让直接用 real.domain 作为服务器地址,以及对应的证书。
    倒是还有个理论可行的解决方案:
    - 添加 Postfix 去代理 smtp ,以及 Dovecot 去代理 imap 。略麻烦,以后再试了。
    yaocf
        22
    yaocf  
    OP
       17 天前
    感谢各位大大的帮助~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2771 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:46 · PVG 22:46 · LAX 06:46 · JFK 09:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.