我有一台服务器,它托管一个通过端口 443 上的 https 传送的网站。该网站不直接向公共互联网开放,但流量是通过 VPN 从具有面向公众的 IP 的 EC2 实例路由的。
可以从主机服务器、同一内部网络上的计算机以及 VPN 上的非 EC2 实例的计算机访问该网站。
从任何一台机器发出命令openssl s_client -connect www.mydomain.tld:443
都会得到响应:
CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = cloud.hss.ac.uk
verify return:1
---
Certificate chain......
[Truncated for brevity]
但是,在 EC2 实例上或从内部或 VPN 网络之外的机器发出的相同命令会给出响应:
CONNECTED(00000003)
那么,我们建立了连接,但没有 SSL 证书?
在 Apache conf 文件上将日志级别设置为调试表明 SSL 证书正在被提供,但由于某种原因它们没有到达 EC2 实例。
EC2 实例仅使用 IFtables 将端口 80 和 443 上的传入请求 NAT 到托管服务器。以下是/etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
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
counter
}
chain postrouting {
meta nftrace set 1
type nat hook postrouting priority 100; policy accept;
masquerade
}
}
这一切在端口 80 上运行良好。
我没有什么想法了,所以在这里寻找一些。
如果相关的话,该 VPN 是 Hamachi VPN。
已启用 IP 转发:
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1