
Eu tenho um servidor que hospeda um site entregue via https na porta 443. O site não está aberto diretamente à Internet pública, mas o tráfego é roteado por meio de uma VPN de uma instância EC2 que possui um IP público.
O site pode ser acessado a partir do servidor host, de computadores na mesma rede interna e de computadores na VPN, que não sejam a instância EC2.
Emitir o comando openssl s_client -connect www.mydomain.tld:443
de qualquer uma dessas máquinas dá a resposta:
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]
Porém, o mesmo comando emitido na instância EC2, ou de uma máquina fora das redes internas ou VPN dá a resposta:
CONNECTED(00000003)
Então, estamos obtendo uma conexão, mas nenhum certificado SSL?
Definir o nível de log para depuração no arquivo conf do Apache mostra que os certificados SSL estão sendo servidos, mas eles não alcançam a instância do EC2 por algum motivo.
A instância EC2 apenas envia solicitações de entrada de NAT nas portas 80 e 443 para o servidor de hospedagem usando IFtables. Aqui estão as configurações em/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
}
}
Tudo isso funciona bem na porta 80.
Estou ficando sem ideias, então estou procurando algumas aqui.
A VPN é uma VPN Hamachi, caso isso seja relevante.
O encaminhamento de IP está ativado:
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1