Traefik 代理 smtps 和 imaps 等邮箱协议

61 天前
 yaocf

目前环境:

问题: 由于 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 ,然后提示解析失败。

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

1581 次点击
所在节点    Linux
22 条回复
yaocf
61 天前
另外,有没有啥好的工具可以 debug 或者显示 imap/imaps 协议协商和验证的全过程的?也希望各位大大不吝分享。
terrytw
61 天前
看半天也没太看懂

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

地址: admin@cdn.domain
服务器地址:mail.cdn.domain
端口:。。。。。。


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

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

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

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

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

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

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

按理说应该是没问题的,更多公共邮箱的邮件服务器和邮箱地址域名都是不一致的。
yaocf
61 天前
@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
61 天前
按照官方的配置: 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
61 天前
tls 其实是好解决的
问题在于你用不带 tls 的 smtp 和 imap 协议访问, 因为 Host 不匹配而无法连接, 这个我暂时没想到什么办法

这个和 traefik 和 nginx 都无关了吧, 你等于客户端直连 mailu 都不行
terrytw
61 天前
@yaocf 你主帖不是说小米邮件客户端会验证 host 么, 那光改 upstream header 有用吗?
terrytw
61 天前
而且 smtp 又不是 http, 不存在 host 这样的 header, 你要是搞不清楚你邮件客户端是怎么验证 host 的, 后面也没法弄了
yinmin
60 天前
mailu 换成多域名证书,一个证书包含 2 个域名(如果你不希望别人从证书里获取到你 real 服务器真实域名,就一个证书包含 2 个通配符域名)
yaocf
60 天前
@terrytw 嗯,确实,目前还不清楚 smtp 的细节。
yaocf
60 天前
@yinmin 目前做不到,real.domain 和 cdn.domain 都是申请到的域名的顶层了。它俩没办法通配。

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

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

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

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

© 2021 V2EX