目前环境:
cdn.domain
): 作为邮箱后缀,cloudflare 托管real.domain
): 真实主机的 ddns 域名,Openwrt 系统,通过 Docker 运行着 mailu 、certbox 、traefik ,且被 cloudflare 反代所有 https 服务。cdn.domain
)的证书,以及cdn.domain
的邮箱后缀,前端页面是https://mailu-front.cdn.domain
(通过 openwrt 自身的 nginx 反代并交给 cloudflare )以及https://mailu-front.real.domain
(通过 openwrt 自身的 nginx 反代)。smtps 和 imaps 的服务器地址是:mail.cdn.domain
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 ,然后提示解析失败。
请问各位大大,有什么好的方案解决这个问题吗?
1
yaocf OP 另外,有没有啥好的工具可以 debug 或者显示 imap/imaps 协议协商和验证的全过程的?也希望各位大大不吝分享。
|
2
terrytw 42 天前
看半天也没太看懂
你的 real.domain 是 cloudflare 反代的, 但是 cloudflare 反代又不支持 smtps imaps, 那谈何 sni 验证, 流量都到达不了你的主机? |
3
terrytw 42 天前
你是说希望在内网里把 real.domain 也手动解析到内网网关?
|
4
terrytw 42 天前
然后仅内网访问邮箱服务?
|
5
yaocf OP @terrytw 就是因为这个原因,所以,希望通过 real.domain 去公网访问邮件服务。
也就是按照正常流程,登录邮件客户端填写如下: 地址: [email protected] 服务器地址:mail.cdn.domain 端口:。。。。。。 希望可以是: 地址 [email protected] 服务器地址:mail.real.domain 端口:。。。。。。 |
6
yaocf OP 也就是,如果使用 mail.cdn.domain 在公网连接邮件服务,还是会走到 cloudflare 的然后无响应(不用管收信。cloudflare 的邮件路由会把邮件转给指定邮箱)。
但是用 mail.real.domain 是可以正常连接到邮件服务的。 发信也是配置了中继( Brevo ),所以,除非是知道 real.domain ,以及 mail.real.domain ,否则,是无法对 real.domain 发起攻击的。 |
7
yinmin 42 天前 via iPhone
mailu 换成通配符证书*.domain
|
8
yaocf OP @yinmin
抱歉,没考虑到这种情况。 `cdn.domain`和`real.domain`不是同一个根域名。 写成`mail.real_domain`和`mail.real_domain`可能会容易理解一点。 |
10
yaocf OP @terrytw 对,`cdn.domain`是被 cloudflare 托管并开启了小云朵的,`real.domain`是对应的真实的主机。mailu 和 traefik 以及 nginx 都是 real.domain 的真实主机中的 docker 服务。
|
11
terrytw 42 天前
你这真的解释的很混乱
"域名 real ( real.domain ): 真实主机的 ddns 域名,Openwrt 系统,通过 Docker 运行着 mailu 、certbox 、traefik ,且被 cloudflare 反代所有 https 服务", 这是你自己说的, 现在你又说 real.domain 没有反代... 不过现在我大概理解了, 你需求是, 客户端通过 mail.real.domain 去访问 imaps smtps, 但是可以实际连通 mail.cdn.domain, 问题在于 SNI 不匹配 让我想一想 |
12
yaocf OP 邮箱地址的域名用的是 cdn.domain (它比较短,也比较好记)。按照 mailu 的配置,邮箱服务器的地址默认是 mail.cdn.domain 。但是这个地址属于 cdn.domain ,cdn.domain 域名是整个托管给了 cloudflar 的(它不处理 smtp 和 imap 等服务)。为了保护 real.domain 主机,并不希望 cdn.domain 的任何地址被指向 real.domain 。
但是又需要在公网连接到邮箱服务。所以想知道这么做是不是可以行。 按理说应该是没问题的,更多公共邮箱的邮件服务器和邮箱地址域名都是不一致的。 |
13
yaocf OP @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 前端),访问的都是同一个内容。 |
14
yaocf OP 按照官方的配置: 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;`) |
15
terrytw 42 天前
tls 其实是好解决的
问题在于你用不带 tls 的 smtp 和 imap 协议访问, 因为 Host 不匹配而无法连接, 这个我暂时没想到什么办法 这个和 traefik 和 nginx 都无关了吧, 你等于客户端直连 mailu 都不行 |
17
terrytw 42 天前
而且 smtp 又不是 http, 不存在 host 这样的 header, 你要是搞不清楚你邮件客户端是怎么验证 host 的, 后面也没法弄了
|
18
yinmin 42 天前 via iPhone
mailu 换成多域名证书,一个证书包含 2 个域名(如果你不希望别人从证书里获取到你 real 服务器真实域名,就一个证书包含 2 个通配符域名)
|
21
yaocf OP 目前只能临时改掉 mailu 的配置,让直接用 real.domain 作为服务器地址,以及对应的证书。
倒是还有个理论可行的解决方案: - 添加 Postfix 去代理 smtp ,以及 Dovecot 去代理 imap 。略麻烦,以后再试了。 |
22
yaocf OP 感谢各位大大的帮助~
|