我在专用主机服务器上使用 ubuntu headless server 18.04。主机有外部防火墙,我在其中打开了端口 8443、443(tcp)。在我的 ubuntu 服务器上,我使用 iptables,我使用表 nat 将端口 443 重定向到 8443。
iptables -A PREROUTING -t nat -p tcp --dport 443 -j REDIRECT --to-ports 8443
我还打开了入站和出站端口 443 和 8443。
我仍然可以通过 example.com:8443 访问 tomcat 实例,没有任何问题,但 example.com 没有响应。查看 iptables 时,我没有看到任何丢弃数据包。在我的 tomcat 实例上,我没有更改 server.xml。连接器监听 8443。我不知道问题出在哪里?我希望一些专家能帮助我解决这个问题。
亲切的问候
黑胡子
答案1
您真正需要的是一个反向代理(例如 Nginx),它可以在端口 443 上为您执行 SSL 终止,然后将请求传递给端口 8443 上的 Tomcat。
SSL/TLS 很复杂,而且在我看来,依靠 IPTABLES 来处理 SSL 握手并将请求发送给 Tomcat 应用程序不是一个好主意。
如果您确实需要使用 IPTABLES,请使用连接到服务openssl
并准确了解正在发生的事情。在此处报告输出,可能会获得更多帮助。
openssl s_client -connect www.example.com:443
问题也可能在于你正在使用nat
表格。我的理解是,只有当请求被路由时,此表的规则才适用通过服务器,而不是路由到同一 IP 地址上的不同端口。
反向代理可以消除很多复杂性,并为您提供更多功能(例如速率限制、访问控制等)。
答案2
这可能取决于你的 tomcat 绑定到哪个接口。如果它绑定到环回接口,那么这根本行不通。
REDIRECT 目标通常与指定的接口一起使用,例如:
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j REDIRECT --to-port 8443
(将 eth1 替换为 tomcat 正在运行的实际网络接口)
REDIRECT 是 DNAT 目标的一种便捷方法,因此如果上述方法不起作用,您可以尝试类似以下方法:
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.0.0.1:8443
(将 10.0.0.1 替换为您的机器的 IP 地址)