我有两台服务器,一台是可在我们公司的本地网络内部访问的开发服务器,另一台是面向公众的 Web 服务器。开发服务器托管了几个我们用来在内部管理项目的工具,但现在我们也需要在外部访问它们,同时保持安全性。
我在外部服务器上设置了 mod_proxy,使用 ProxyPass 和 ProxyPassReverse 指令将外部请求映射到内部服务器。我还在这些外部虚拟主机上设置了身份验证,为外部访问提供安全性。我还需要使用 SSL 进行外部访问,但理想情况下,我更愿意让内部工具通过纯 HTTP 访问,供内部网中的人使用。
是否有可能实现这种行为,如果可以,我应该使用哪些指令和 Apache 模块以及需要在哪些服务器上设置它们?
我将假设您确实接受了公众的 HTTP 连接,但您执行标准 HTTP 重定向以强制它们使用 HTTPS。
如果是这种情况,那么如果您是内部网络的一部分,则可以将 HTTP 指令更改为不重定向。
为此,您需要使用 Apache 的mod_rewrite并在 REMOTE_ADDR 上进行过滤。本质上,您希望重定向与您的网络不匹配的所有内容。
另一种选择,可能是更安全的选择,就是让您的内部用户使用与公共地址不同的服务地址。让他们连接到 myservice.mydomain.local 而不是 myservice.mydomain.com。
您能否在 Apache 配置中创建 2 个不同的虚拟主机,每个都响应不同的 IP,尽管仍然使用相同的文档根目录?在您的路由器上,让它以 192.168.1.1 响应 example.com,而在外部它将以 342.434.564.23 响应。或者让每个人在办公室时使用不同的地址 (internal.example.com)。
如果您使用的是 Linux,请研究
iptables
防火墙。如果是 Windows,您可以使用 IPSec 策略来模拟类似的防火墙规则。基本上,您将根据源 IP 子网分配规则。如果连接来自您的内部网络,请阻止 HTTPS。否则,阻止 HTTP。
您最好使用防火墙规则来限制这一点。
我不认为 Apache 具有实现此功能的功能,即使这样做也会产生开销。防火墙是为这样的事情设计的,因此会更合适。我假设你有一个外部防火墙(我希望你有),你应该只允许这台机器的端口 443 并在外部阻止端口 80。
如果你真的想使用 Apache,你可以使用两台虚拟主机,一台监听内部 IP,另一台监听外部 IP。然而,这会使配置加倍,因此我不推荐它,因为维护起来会很痛苦。
编辑:抱歉,Apache 可以通过 mod_rewrite 执行此操作,但它会增加请求的开销,并且使用防火墙仍然更合适。也就是说,使用 mod_rewrite 您可以将人们从 http 重定向到 https,如果人们不断尝试访问 http,这可能会很方便。