如何配置 Apache 以使用 HTTPS 进行外部访问但使用 HTTP 进行内部访问?

如何配置 Apache 以使用 HTTPS 进行外部访问但使用 HTTP 进行内部访问?

我有两台服务器,一台是开发服务器,可在我们公司的本地网络内部访问,另一台是面向公众的 Web 服务器。开发服务器托管了我们用于内部管理项目的多种工具,但现在我们也需要在保持安全性的同时从外部访问它们。

我已经使用 ProxyPass 和 ProxyPassReverse 指令在外部服务器上设置了 mod_proxy,以将外部请求映射到内部服务器。我还在这些外部虚拟主机上设置了身份验证,以提供外部访问的安全性。我还需要使用 SSL 进行外部访问,但理想情况下,我更愿意让内部网内的人员通过纯 HTTP 访问内部工具。

是否有可能实现这种行为,如果可以,我应该使用什么指令和 Apache 模块,以及需要在哪些服务器上设置它们?

答案1

我假设您确实接受公众的 HTTP 连接,但您执行标准 HTTP 重定向以强制它们使用 HTTPS。

如果是这种情况,那么如果您是内部网络的一部分,您可以更改 HTTP 指令以不重定向。

为此,您需要使用 Apache 的mod_rewrite并根据 REMOTE_ADDR 进行过滤。本质上,您要重定向与您的网络不匹配的所有内容。

另一个选择(可能更安全)是让内部用户使用与公共地址不同的服务地址。让他们连接到 myservice.mydomain.local,而不是 myservice.mydomain.com。

答案2

您是否可以在 Apache 配置中创建 2 个不同的虚拟主机,每个虚拟主机都响应不同的 IP,但仍使用相同的文档根目录?在您的路由器上,让它使用 192.168.1.1 响应 example.com,而在外面它将使用 342.434.564.23 响应。或者让每个人在办公室时使用不同的地址 (internal.example.com)。

答案3

如果您使用的是 Linux,请研究iptables防火墙。如果是 Windows,您可以使用 IPSec 策略来模拟类似的防火墙规则。

基本上,您将根据源 IP 子网分配规则。如果连接来自您的内部网络,则阻止 HTTPS。否则,阻止 HTTP。

答案4

最好使用防火墙规则来限制这种情况。

我认为 Apache 没有实现此功能的功能,即使有,也会产生开销。防火墙就是为此类事情而设计的,因此更合适。我假设您有一个外部防火墙(我希望您有),您应该只允许端口 443 进入这台机器,并从外部阻止端口 80。

如果您确实想使用 Apache,可以使用两个虚拟主机,一个监听内部 IP,另一个监听外部 IP。但是,这会使配置加倍,因此我不建议这样做,因为维护起来很麻烦。

编辑:抱歉,Apache 可以通过 mod_rewrite 实现这一点,但这会增加请求开销,使用防火墙仍然更合适。也就是说,使用 mod_rewrite 可以将人们从 http 重定向到 https,如果人们不断尝试访问 http,这可能会很方便。

相关内容