我们将网站设置为在 Play 框架上运行。它在 9000 上运行 http。我们可以通过以下方式访问该网站:http://服务器名称.域名.com:9000其中 servername 是 Web 服务器的名称。
我们还设置了 F5 负载均衡器,将所有流量从 http 重定向到 https,并将流量从端口 443 重定向到 9000。我们为 F5 设置了一个域名 vip.domain.com,该域名连接到后端的此 Web 服务器。我们从池中取出其他 Web 服务器进行调试,因此池中目前只有 1 台服务器。
当我使用 Chrome 访问该网站时,如果我们访问http://vip.domain.com,F5 将重定向至https://vip.domain.com我们得到了绿色挂锁,上面写着“安全”。
当我进入http://server.domain.com:9000,它显示“不安全”,我们没有拿到挂锁。
有人进行了安全扫描,发现我们发送的内容是明文未加密的。我们已完成所有测试,并告知所有人http://vip.domain.com但我猜扫描使用的http://服务器名称.域名.com:9000。
有没有办法http://服务器名称.域名.com:9000不起作用,但仍保留 9000 端口开放http://vip.domain.com? 如果需要,我们有权对服务器和 VIP 进行更改。
答案1
最简单的方法是设置一个防火墙,阻止除负载均衡器 IP 之外的任何主机的端口 9000(前提是它不是动态的)
简单规则:
iptables -A INPUT -p tcp --dport 9000 -m comment --comment 'allow LB traffic' -s LB.IP.ADDR.HERE -j ACCEPT
iptables -A INPUT -p tcp --dport 9000 -m comment --comment 'drop all other requests to 9000' -j DROP
这些将:
- 允许 LB 机器使用 9000 端口(你可以为更多 LB 添加更多规则
- 阻止到端口 9000 的其他流量
更好的方法是检测应用程序中连接中使用的域,并在使用错误的域时重定向到安全地址。我不确定您的框架/应用程序是否如此,但大多数大型框架/应用程序都提供此类机制。
答案2
使用 iRule 可以轻松实现这一点:
when HTTP_REQUEST {
if { [HTTP::host] equals "servername.domain.com" } {
# send a TCP reset
reject
# alternatively, redirect somewhere else
# HTTP::redirect "http://www.somedomainyoufindentertaining.com"
}
}
(几乎逐字逐句地来自https://devcentral.f5.com/questions/block-domain-redirect)
只需在处理端口 9000 流量的虚拟服务器中引用此内容即可。您还可以更有创意地使用条件来决定是否拒绝连接。