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的请求可能没被处理。
- EC2的Hamachi客户端是否正常连接到VPN网络,能ping通
如果这一步能正常拿到证书链,那问题就出在NAT转发的规则或路由上。
二、排查nftables的流量转发细节
你已经开了meta nftrace set 1,可以实时追踪流量处理过程:
- 在EC2上开一个终端,运行:
nft monitor trace
- 另一个终端执行
openssl s_client -connect www.mydomain.tld:443(公网测试的话,用外部机器访问),看trace日志里的关键节点:- PREROUTING阶段:是否匹配到了
tcp dport {80,443}的DNAT规则?counter数值有没有增加?如果没匹配,可能是接口名称写错(比如你的EC2公网接口是不是eth0?有些新实例是ens5),或者端口/协议匹配有误。 - POSTROUTING阶段:masquerade规则是否生效?后端返回的流量是否被正确SNAT成EC2的IP,再发回请求端?
- PREROUTING阶段:是否匹配到了
另外,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




