Tenho uma conexão SSL com um servidor (owner-api.teslamotors.com) que trava com wget, curl ou openssl s_client. Estou mostrando a versão curl, pois ela fornece a maioria das mensagens de depuração:
# curl -iv https://owner-api.teslamotors.com
* Trying 18.203.70.200:443...
* Connected to owner-api.teslamotors.com (18.203.70.200) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
Lá ele trava depois de ClientHello. Conexão TCP estabelecida com sucesso (também confirmada com telnet/nc). Outra conexão de rede, incluindo qualquer conexão SSL que eu tentei, funciona. Exceto owner-api.teslamotors.com:443.
Achei esta postagem falando sobre MTU e parecia absurdo. Mas reduzi o MTU do servidor e funcionou! Funciona com qualquer MTU <= 1420.
O servidor se conecta usando Ethernet (MTU 1500) a um roteador Mikrotik e de lá a conexão passa por um túnel WireGuard (MTU 1420). Estou ciente de que isso pode não ser o ideal, pois qualquer pacote IP do servidor >1420 precisará ser fragmentado. No entanto, isso é agnóstico de qualquer protocolo L4. SSL sobre TCP não deve se importar com fragmentação e MTU. No entanto, este host se importa.
Executei uma captura de pacotes na caixa Mikrotik e o tráfego não lista nada de anormal para mim:
O típico handshake TCP Num 1-3, depois ClientHello (Num 4-5) e ServerHello (Num 6-7). Nenhum tamanho de pacote chega perto do MTU e nenhuma outra mensagem ICMP que indicaria problemas com fragmentação etc.
Por comentário, aqui está a saída do tracepath:
# tracepath owner-api.teslamotors.com
1?: [LOCALHOST] pmtu 1500
1: XX.XX.56.210 0.410ms
1: XX.XX.56.210 0.198ms
2: XX.XX.56.210 0.138ms pmtu 1420
2: XX.XX.56.185 151.394ms
3: no reply
4: 100.100.200.1 157.220ms
5: 10.75.0.193 154.068ms
6: 10.75.2.53 161.950ms asymm 7
7: decix1.amazon.com 152.107ms asymm 8
8: decix2.amazon.com 153.068ms
9: no reply
[...]
Estou realmente perdido, o que diabos está acontecendo aqui?
Por que essa conexão SSL falha?