目前环境:

域名 cdn (cdn.domain): 作为邮箱后缀,cloudflare 托管
域名 real (real.domain): 真实主机的 ddns 域名,Openwrt 系统,通过 Docker 运行着 mailu 、certbox 、traefik ,且被 cloudflare 反代所有 https 服务。
邮箱服务:mailu ( Docker ),配置的是域名 cdn ( cdn.domain )的证书,以及cdn.domain的邮箱后缀,前端页面是 mailu-front.cdn.domain(通过 openwrt 自身的 nginx 反代并交给 cloudflare )以及 mailu-front.real.domain(通过 openwrt 自身的 nginx 反代)。smtps 和 imaps 的服务器地址是:mail.cdn.domain
证书:certbot ( Docker ),包含 cdn.domain 和 real.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 官方的配置好像是无法达到使用不同的域名的。

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

另外,有没有啥好的工具可以 debug 或者显示 imap/imaps 协议协商和验证的全过程的?也希望各位大大不吝分享。

看半天也没太看懂你的 real.domain 是 cloudflare 反代的, 但是 cloudflare 反代又不支持 smtps imaps, 那谈何 sni 验证, 流量都到达不了你的主机?

你是说希望在内网里把 real.domain 也手动解析到内网网关?

然后仅内网访问邮箱服务?

就是因为这个原因,所以,希望通过 real.domain 去公网访问邮件服务。也就是按照正常流程,登录邮件客户端填写如下:地址: [email protected]服务器地址:mail.cdn.domain端口:。。。。。。希望可以是:地址 [email protected]服务器地址:mail.real.domain端口:。。。。。。

也就是,如果使用 mail.cdn.domain 在公网连接邮件服务,还是会走到 cloudflare 的然后无响应(不用管收信。cloudflare 的邮件路由会把邮件转给指定邮箱)。但是用 mail.real.domain 是可以正常连接到邮件服务的。发信也是配置了中继( Brevo ),所以,除非是知道 real.domain ,以及 mail.real.domain ,否则,是无法对 real.domain 发起攻击的。

mailu 换成通配符证书*.domain

抱歉,没考虑到这种情况。cdn.domainreal.domain不是同一个根域名。写成mail.real_domainmail.real_domain可能会容易理解一点。

所以你的 real.mail.domain 不是反代的? 是直接解析到真实 IP?

对,cdn.domain是被 cloudflare 托管并开启了小云朵的,real.domain是对应的真实的主机。mailu 和 traefik 以及 nginx 都是 real.domain 的真实主机中的 docker 服务。

你这真的解释的很混乱"域名 real ( real.domain ): 真实主机的 ddns 域名,Openwrt 系统,通过 Docker 运行着 mailu 、certbox 、traefik ,且被 cloudflare 反代所有 https 服务", 这是你自己说的, 现在你又说 real.domain 没有反代...不过现在我大概理解了, 你需求是, 客户端通过 mail.real.domain 去访问 imaps smtps, 但是可以实际连通 mail.cdn.domain, 问题在于 SNI 不匹配让我想一想

邮箱地址的域名用的是 cdn.domain (它比较短,也比较好记)。按照 mailu 的配置,邮箱服务器的地址默认是 mail.cdn.domain 。但是这个地址属于 cdn.domain ,cdn.domain 域名是整个托管给了 cloudflar 的(它不处理 smtp 和 imap 等服务)。为了保护 real.domain 主机,并不希望 cdn.domain 的任何地址被指向 real.domain 。但是又需要在公网连接到邮箱服务。所以想知道这么做是不是可以行。按理说应该是没问题的,更多公共邮箱的邮件服务器和邮箱地址域名都是不一致的。

确实说漏了,这里说的反代所有的 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 前端),访问的都是同一个内容。

按照官方的配置: 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;

tls 其实是好解决的问题在于你用不带 tls 的 smtp 和 imap 协议访问, 因为 Host 不匹配而无法连接, 这个我暂时没想到什么办法这个和 traefik 和 nginx 都无关了吧, 你等于客户端直连 mailu 都不行

你主帖不是说小米邮件客户端会验证 host 么, 那光改 upstream header 有用吗?

而且 smtp 又不是 http, 不存在 host 这样的 header, 你要是搞不清楚你邮件客户端是怎么验证 host 的, 后面也没法弄了

mailu 换成多域名证书,一个证书包含 2 个域名(如果你不希望别人从证书里获取到你 real 服务器真实域名,就一个证书包含 2 个通配符域名)

嗯,确实,目前还不清楚 smtp 的细节。

目前做不到,real.domain 和 cdn.domain 都是申请到的域名的顶层了。它俩没办法通配。

目前只能临时改掉 mailu 的配置,让直接用 real.domain 作为服务器地址,以及对应的证书。倒是还有个理论可行的解决方案:- 添加 Postfix 去代理 smtp ,以及 Dovecot 去代理 imap 。略麻烦,以后再试了。

感谢各位大大的帮助~