在私有 VPN 中使用 Discourse:电子邮件怎么办?

你好!

我想在一种特殊环境中使用 Discourse:Web 服务器仅对 VPN 内少数已知用户开放。服务器 IP 类似于 10.0.0.1,因此显然无法为其配置有效的公共域名。

我了解到,正确配置邮件传输非常重要。我也看到,至少可以通过一些“变通方法”在不依赖邮箱的情况下完成管理员账户的创建。

我在想,最佳方案是什么?

a) 完全在不使用邮箱的情况下部署 Discourse。这样可行吗?我猜可能需要遵循某些不太规范的手动流程来激活每个账户,但考虑到用户数量有限,这对我来说可以接受。这样真的可行吗?如果不启用邮件传输,会有哪些限制?当然,我无法发送邮件通知(这对我来说影响不大)——就这些吗?

b) 虽然服务器使用的是私有 IP,但我或许可以另外拥有一个仅用于邮件的公共地址。我期望整个部署尽可能优化,以便轻松设置。按照常见的安装教程,我只需输入一次服务器地址,该地址可能同时用于 HTTP 重定向以及 SMTP。这样容易区分吗?我能否轻松部署一个使用私有 IP 地址、但邮件使用不同域名的服务器?

我需要说明的是,我目前还没有 Discourse 的使用经验。如果遇到实际问题,我愿意自行查找资料解决。但我认为这里存在一个根本性的选择:是走方案 a 还是方案 b?如果能得到一些建议,避免一开始就走错方向,那就太好了。

谢谢!

您需要拥有一个域名。Discourse 无法在 IP 地址上运行。

服务器能否访问互联网?在没有互联网的情况下构建 Discourse 会……有些棘手。

如果服务器可以访问互联网,那么让它能够发送邮件就不是问题。

请在公共连接上构建,在您的 VPN 内为私有 IP 添加一个 DNS 条目,然后关闭公共访问。

请勿使用 Let’s Encrypt,因为证书更新将失败。

您将无法轻松更新它,但如果您正在对其进行隔离,我想这应该已经很清楚了。

电子邮件是 Discourse 的核心,没有它,各种功能都无法正常工作。

感谢您提供帮助。我想我需要再详细解释一下。

首先,我应该说明哪些部分我比较熟悉,哪些不熟悉。我对底层部分(如 IP 地址、TCP 等)理解得相当好,但对于复杂 Web 应用程序所涉及的内容则没有经验。关于电子邮件:发件人是如何进行身份验证的?系统如何检查其是否发送未经授权的垃圾邮件?(我并不指望你们向我解释所有这些,只是希望澄清我的问题……)

我这里并没有完整的企业级 VPN 基础设施,目前只有一个私有 VPN 子网和基于 IP 的规则。

设置如下:服务器拥有一个可公开访问的域名,但除了 VPN 入口端口外,所有端口都被关闭。连接到 VPN 的客户端会获得一个 10.0.x.x 地址。服务器则可通过 10.0.0.1:80 访问。

我的理解(我猜这里是错的)是,服务器期望通过其域名被访问。

假设我有一个域名 xyz.com,它解析到公网 IP 8.7.6.5。客户端仅使用该域名/IP 建立隧道。一旦隧道建立,他们的浏览器就会连接到 10.0.0.1。

如前所述,我对 Discourse 没有经验。我预期 Discourse 会使用其自己的域名进行重定向操作。例如,将打开 10.0.0.1 的新客户端重定向到 10.0.0.1/login.php(或者类似的情况,仅作为示例)。如果 Discourse 将它们重定向到 .xyz Domain Names | Join Generation XYZ VPN 外部不可访问,这些客户端就会迷失方向。这就是我认为需要配置内部地址所针对的问题类型。

至于邮件,我需要联系外部邮件服务器。在任何阶段,公共互联网都是可访问的!不过我对这个主题了解不多。我只是认为,使用“嘿,我是 10.0.0.1,请帮我发送邮件”这样的方式连接到公共邮件服务器是行不通的,因为我使用的是私有 IP 地址。在这里,我认为需要一个公共地址。

乐观地阅读您的回答后,我推测配置的域名并不用于客户端的 HTTP 会话。如果服务器可通过私有 IP 访问,而我连接到该 IP,那么所有自引用的链接和重定向都是相对路径,因此用户不会被重定向到服务器期望连接的域名。我可以将 xyz.com 配置为域名,同时仍然通过 10.0.0.1 在浏览器中打开 Discourse,而不会被重定向到(无效的)xyz.com 地址。

希望我的问题表达得还算清楚。抱歉如此混乱!
另外,不需要 HTTPS。我甚至更倾向于不使用它——我在隧道内部,用户之间不需要安全隔离。我想跳过所有与证书和主机名匹配相关的问题。

这取决于邮件服务器。假设你使用 MailGun、SendGrid 等邮件服务,它们通常通过 API(如 URL 加上用户名/密码)进行身份验证。

在这种情况下,只要服务器能够访问外部 IP(仅进行入站过滤),连接到邮件服务通常不会有问题。

特别是当域名解析到正确的 IP 地址时。

你甚至不需要为安装过程开放端口。因为如果你通过 VPN 隧道使用域名,并且该域名指向私有 IP,那么你就可以通过 VPN 访问该域名(例如 example.com)。

我不太确定 Discourse 是否只会使用相对 URL,但几乎可以确定它不会。不过,你可以修改域名的 DNS 记录,设置两条 A 记录:第一条指向 10.0.0.1,第二条指向公共 IP 8.7.6.5。这有时在解析地址、缓存等方面可能会带来一些麻烦,但你可以尝试一下。

你可以让 xyz.com 解析到 10.0.0.1。

如果服务器可以访问互联网,那么唯一的问题是,你无法创建 Let’s Encrypt 的 HTTPS 证书。

这里有个问题想问你:你的 VPN 实现了哪些 SSL 无法实现的功能?

一个仅限邀请的 Discourse 实例在 SSL 上已经实现了身份验证和加密。那么 VPN 又增添了什么呢?

我还有其他需要保护的服务在运行。而且我也喜欢只开放一个非典型端口的想法。

但你说得对:我应该考虑放宽这一要求,让 Discourse 在公共接口上运行,并启用 SSL。

感谢各位。我想我已经把问题理顺了:

  • 对于运行在 VPN 内部的 Web 服务器,VPN 服务器需要同时充当 DNS 服务器。内部 DNS 应将同一域名解析为内部 IP,而该域名在公网解析为外部 IP。我应该停止在任何地方直接使用服务器的 IP 地址,让 DNS 来处理这种复杂性。目前我的 VPN 仅在 IP 层面工作,我甚至没有意识到这些细节。
    缺点:我可能会搞砸所有用户的整个网站。
  • 我也可以让 Web 服务器直接运行在公共端口上,并通过 SSL 来提供保护。
    缺点:我将暴露于现实世界的所有风险之中。