![无法连接到 AWS EC2 实例上的反向转发端口 443](https://linux22.com/image/1583148/%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0%20AWS%20EC2%20%E5%AE%9E%E4%BE%8B%E4%B8%8A%E7%9A%84%E5%8F%8D%E5%90%91%E8%BD%AC%E5%8F%91%E7%AB%AF%E5%8F%A3%20443.png)
我有一台位于运营商级 NAT 后面的 Web 服务器,因此需要一台外部服务器为我提供稳定的 IP 地址。为此,我有一个运行 SLES 的 AWS EC2 实例,并且我有一个从 Web 服务器启动的反向转发 ssh 隧道,用于在端口 80 上处理传入请求。虽然我认为这与问题本身无关,但它对故障排除很有帮助,因此对于上下文,我应该说明 Web 服务器正在监听非标准端口,比如 8080,而 AWS 实例上的预路由防火墙规则将端口 80 上的请求重定向到 8080。ssh 隧道使用 autossh 并从配置文件中获取其配置,但相当于以下 ssh 命令。
ssh -N -R 8080:localhost:8080 -i ~/.fwd/portal.uk.pem [email protected]
防火墙重定向规则如下所示
iptables -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
输入链上还有防火墙规则,可打开所有来源的 80 和 8080 端口,并且我在 EC2 管理控制台中配置了一个安全组,以同样允许所有来源的流量进入 80 和 8080 端口。 所有这些到位后,一切都按预期运行,页面已提供给外部世界。
我已经到了需要开始通过 https 提供页面的地步,并开始为端口 443 创建相同的配置,但我总是无法连接到 AWS 实例上的端口 443。首先,我尝试了端口 443 的直通隧道。防火墙输入规则和安全组规则已到位,允许连接到 443,但尝试设置隧道会导致监听端口警告。
ssh -N -R 443:localhost:443 -i ~/.fwd/portal.uk.pem [email protected]
Warning: remote port forwarding failed for listen port 443
ssh 进程在 Web 服务器上保持活动状态,但似乎在所有意图和目的上都已死亡,任何使用 telnet 连接到 AWS 上的 443 的尝试都会被拒绝。需要明确的是,Web 服务器肯定在监听端口 443,因为我可以在本地使用 https 请求进行连接。我在此警告上找到的所有信息表明,这可能是由仍然控制端口的进程引起的,可以使用或netstat -plant
类似或找到lsof -i -t
。这两个都没有显示 AWS 上 443 上有任何活动进程,无论如何,我尝试重新启动 AWS 实例以清除任何持久进程,但在重新启动时仍然会出现相同的症状。
然后,我尝试通过将 Web 服务器监听端口更改为非标准端口(例如 8443)并添加另一个与以前完全相同的预路由规则、输入规则和安全组来复制端口 80 的配置。现在,我可以成功地在端口 8443 上设置隧道而不会收到警告,但我仍然在 AWS 端口 443 上使用 telnet 时遇到拒绝连接的情况,并且 https 请求无法通过。但是,如果我在 AWS 机器上 telnet 到端口 8443,则会成功。对我来说,这表明隧道和 Web 服务器配置运行良好,而且肯定是 AWS 上的端口 443 被某些东西阻塞了,但我不知道下一步该怎么做。所以,具体来说,我的问题是,如果 netstat 或 lsof 没有显示任何监听进程,并且防火墙是打开的,我还应该寻找什么?