You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

EC2作为NAT转发节点时,外部及EC2本地无法获取后端HTTPS服务的SSL证书(Hamachi VPN环境)

EC2作为NAT转发节点时,外部及EC2本地无法获取后端HTTPS服务的SSL证书(Hamachi VPN环境)

看起来你的问题核心是:NAT转发的80端口正常,但443端口在EC2本地和公网访问时,SSL握手只能建立连接,无法获取证书链,而内部网络和VPN非EC2节点访问一切正常。结合你的环境(Hamachi VPN + nftables NAT),我给你梳理几个关键排查方向,都是实际场景里容易踩坑的点:

一、先确认EC2到后端服务器的直接SSL连通性

既然内部和VPN其他节点能正常拿到证书,先排除后端服务本身的问题。在EC2上直接访问后端服务器的IP(就是你dnat到的x.x.x.x)的443端口:

openssl s_client -connect x.x.x.x:443
  • 如果这一步也拿不到证书链,说明EC2和后端服务器的SSL通信本身有问题,和NAT转发无关。这时候要检查:

    • EC2的Hamachi客户端是否正常连接到VPN网络,能ping通x.x.x.x吗?
    • 后端服务器的防火墙(iptables/ufw等)是否允许来自EC2节点IP的443端口请求?(虽然80正常,但可能单独限制了SSL的源IP)
    • 后端Apache的<VirtualHost>配置是否只绑定了内部/VPN IP,而没有绑定0.0.0.0?如果只监听特定IP,EC2的请求可能没被处理。
  • 如果这一步能正常拿到证书链,那问题就出在NAT转发的规则或路由上。

二、排查nftables的流量转发细节

你已经开了meta nftrace set 1,可以实时追踪流量处理过程:

  1. 在EC2上开一个终端,运行:
nft monitor trace
  1. 另一个终端执行openssl s_client -connect www.mydomain.tld:443(公网测试的话,用外部机器访问),看trace日志里的关键节点:
    • PREROUTING阶段:是否匹配到了tcp dport {80,443}的DNAT规则?counter数值有没有增加?如果没匹配,可能是接口名称写错(比如你的EC2公网接口是不是eth0?有些新实例是ens5),或者端口/协议匹配有误。
    • POSTROUTING阶段:masquerade规则是否生效?后端返回的流量是否被正确SNAT成EC2的IP,再发回请求端?

另外,EC2本地访问自己公网IP的场景,存在「发夹路由(Hairpin NAT)」的问题——默认的NAT规则可能不处理本地生成的、目标是自身公网IP的流量。你需要在nftables的prerouting链里添加一条针对回环接口的规则:

table ip nat {
chain prerouting {
    meta nftrace set 1
    type nat hook prerouting priority -100; policy accept;
    # 原有规则
    iifname "eth0" tcp dport { 80, 443 } dnat to x.x.x.x
    # 添加这条处理本地访问公网IP的流量
    iifname "lo" tcp dport { 80, 443 } dnat to x.x.x.x
    counter
}
chain postrouting {
    meta nftrace set 1
    type nat hook postrouting priority 100; policy accept;
    masquerade
}
}

添加后重载nftables:nft -f /etc/nftables.conf,再测试EC2本地访问。

三、检查SNI配置是否匹配

从你给出的openssl输出看,后端返回的证书CN是cloud.hss.ac.uk,但你访问的域名是www.mydomain.tld。如果Apache没有配置SNI(Server Name Indication),当请求域名和证书CN不匹配时,可能会出现握手异常(虽然内部访问正常,可能是内部DNS解析到的是cloud.hss.ac.uk?)。

可以在测试时强制指定SNI,看是否能拿到证书:

openssl s_client -connect www.mydomain.tld:443 -servername www.mydomain.tld

如果这一步能拿到证书,说明你需要在Apache的SSL虚拟主机配置里添加ServerName www.mydomain.tld,确保针对该域名返回正确的证书。

四、验证EC2的安全组和网络ACL

虽然80端口正常,但还是要确认:

  • 安全组是否允许入站443端口(公网访问需要)和出站443端口(EC2要和后端服务器的443通信)
  • 网络ACL是否同时允许入站和出站的443端口流量(网络ACL是双向的,默认可能拒绝出站非常用端口)

五、Hamachi VPN的权限检查

确认EC2的Hamachi节点在VPN网络里是否有「完全访问」权限,有些Hamachi网络会设置节点间的访问限制,比如只允许特定节点访问某些端口。可以在Hamachi的管理界面里检查EC2节点的权限设置。


备注:内容来源于stack exchange,提问作者vascowhite

火山引擎 最新活动