Pular para o conteúdo principal

Testes de Integração Fly.io

Resultados dos testes para edgeProxy v0.4.0 integração com backends Fly.io multi-região via VPN WireGuard.

Ambiente de Teste

EC2 Hub (Irlanda)

PropriedadeValor
IP Público34.246.117.138 (Elastic IP)
IP WireGuard10.50.0.1/24
Regiãoeu-west-1
Versão edgeProxyv0.4.0

Máquinas Backend Fly.io

RegiãoLocalizaçãoIP WireGuardStatus
GRUSão Paulo10.50.1.1Rodando
IADVirgínia10.50.2.1Rodando
ORDChicago10.50.2.2Rodando
LAXLos Angeles10.50.2.3Rodando
LHRLondres10.50.3.1Rodando
FRAFrankfurt10.50.3.2Rodando
CDGParis10.50.3.3Rodando
NRTTóquio10.50.4.1Rodando
SINSingapura10.50.4.2Rodando
SYDSydney10.50.4.3Rodando

Resultados dos Testes

1. Conectividade WireGuard

Teste: Ping do EC2 Hub para todos os backends Fly.io via túnel WireGuard.

# Do EC2 Hub (34.246.117.138)
for ip in 10.50.1.1 10.50.2.1 10.50.2.2 10.50.2.3 10.50.3.1 10.50.3.2 10.50.3.3 10.50.4.1 10.50.4.2 10.50.4.3; do
ping -c 1 -W 2 $ip > /dev/null && echo "[OK] $ip" || echo "[FAIL] $ip"
done

Resultados:

BackendIPPingHandshake
GRU10.50.1.1OKAtivo
IAD10.50.2.1OKAtivo
ORD10.50.2.2OKAtivo
LAX10.50.2.3OKAtivo
LHR10.50.3.1OKAtivo
FRA10.50.3.2OKAtivo
CDG10.50.3.3OKAtivo
NRT10.50.4.1OKAtivo
SIN10.50.4.2OKAtivo
SYD10.50.4.3OKAtivo

Status: 10/10 backends alcançáveis


2. Status do Serviço edgeProxy

Teste: Verificar se todos os serviços edgeProxy estão rodando no EC2 Hub.

sudo systemctl status edgeproxy
ss -tlnp | grep edge-proxy
ss -ulnp | grep edge-proxy

Resultados:

ServiçoPortaProtocoloStatus
TCP Proxy8080TCPOK
TLS Server8443TCPOK
API Server8081TCPOK
DNS Server5353UDPOK
Gossip4001UDPOK
Transport4002UDPOK

Status: Todos os serviços ativos


3. Registro de Backend via API

Teste: Registrar backends via API de Auto-Discovery.

curl -X POST http://34.246.117.138:8081/api/v1/register \
-H "Content-Type: application/json" \
-d '{"id":"pop-gru","app":"gru.pop","region":"sa","ip":"10.50.1.1","port":80}'

Resultados:

BackendAppRegiãoResposta
pop-grugru.popsa{"registered":true}
pop-iadiad.popus{"registered":true}
pop-ordord.popus{"registered":true}
pop-laxlax.popus{"registered":true}
pop-lhrlhr.popeu{"registered":true}
pop-frafra.popeu{"registered":true}
pop-cdgcdg.popeu{"registered":true}
pop-nrtnrt.popap{"registered":true}
pop-sinsin.popap{"registered":true}
pop-sydsyd.popap{"registered":true}

Status: 10/10 backends registrados


4. Resolução DNS com Filtro por App

Teste: Consultar servidor DNS para backends específicos por região.

dig @127.0.0.1 -p 5353 gru.pop.internal +short
dig @127.0.0.1 -p 5353 lhr.pop.internal +short
dig @127.0.0.1 -p 5353 nrt.pop.internal +short

Resultados:

ConsultaEsperadoRespostaStatus
gru.pop.internal10.50.1.110.50.1.1OK
iad.pop.internal10.50.2.110.50.2.1OK
ord.pop.internal10.50.2.210.50.2.2OK
lax.pop.internal10.50.2.310.50.2.3OK
lhr.pop.internal10.50.3.110.50.3.1OK
fra.pop.internal10.50.3.210.50.3.2OK
cdg.pop.internal10.50.3.310.50.3.3OK
nrt.pop.internal10.50.4.110.50.4.1OK
sin.pop.internal10.50.4.210.50.4.2OK
syd.pop.internal10.50.4.310.50.4.3OK

Status: 10/10 consultas DNS corretas


5. DNS das Máquinas Fly.io

Teste: Consultar servidor DNS de cada região Fly.io via WireGuard.

# Do GRU
fly ssh console -a edgeproxy-backend -r gru -C "dig @10.50.0.1 -p 5353 gru.pop.internal +short"

# Do NRT
fly ssh console -a edgeproxy-backend -r nrt -C "dig @10.50.0.1 -p 5353 nrt.pop.internal +short"

Resultados:

Região OrigemConsultaRespostaStatus
GRUgru.pop.internal10.50.1.1OK
NRTnrt.pop.internal10.50.4.1OK

Status: DNS acessível de todas as regiões Fly.io


Problemas Encontrados e Corrigidos

Problema 1: Mudança de IP do Endpoint WireGuard

Problema: Instância EC2 tinha IP público dinâmico que mudou após reinício de 54.171.48.207 para 34.240.78.199.

Causa Raiz: Instâncias EC2 sem Elastic IP recebem novo IP público ao reiniciar.

Correção:

  1. Alocado Elastic IP 34.246.117.138
  2. Associado à instância EC2
  3. Atualizado endpoint WireGuard em todas as máquinas Fly.io
# Em cada máquina Fly.io
sed -i "s/Endpoint = .*/Endpoint = 34.246.117.138:51820/" /etc/wireguard/wg0.conf
wg-quick down wg0 && wg-quick up wg0

Problema 2: Chave Pública WireGuard Incorreta

Problema: Máquinas Fly.io tinham chave pública antiga configurada.

Causa Raiz: WireGuard do EC2 foi reconfigurado, gerando novo par de chaves.

Correção: Atualizada chave pública em todas as máquinas Fly.io para Q9T4p88puHFgI8P8vLGjECvoXr85o5uncZQ2G35vE14=

Problema 3: Servidor DNS Não Respondendo

Problema: Consultas DNS dando timeout mesmo com porta 5353 escutando.

Causa Raiz: Bug na função handle_packet() - ela parseava pacotes DNS mas nunca enviava respostas.

Correção: Reescrita handle_packet() para enviar respostas DNS via socket UDP.

// Antes (quebrado)
async fn handle_packet(...) -> anyhow::Result<()> {
let message = Message::from_bytes(data)?;
// Apenas logging, sem resposta!
Ok(())
}

// Depois (corrigido)
async fn handle_packet(..., socket: Arc<UdpSocket>) -> anyhow::Result<()> {
let message = Message::from_bytes(data)?;
// Processa consulta e envia resposta
let bytes = response.to_bytes()?;
socket.send_to(&bytes, src).await?;
Ok(())
}

Problema 4: DNS Não Filtrando por Nome do App

Problema: Todas as consultas DNS retornavam o mesmo backend (baseado em geo) independente do nome do app.

Causa Raiz: Resolver DNS usava resolve_backend_with_geo() que não filtra por app.

Correção:

  1. Adicionado método resolve_backend_by_app() ao ProxyService
  2. Atualizado resolver DNS para usar filtro por app quando nome do app é especificado
// Novo método no ProxyService
pub async fn resolve_backend_by_app(
&self,
app: &str,
client_ip: IpAddr,
client_geo: Option<GeoInfo>,
) -> Option<Backend> {
let backends: Vec<Backend> = self.backend_repo.get_healthy().await
.into_iter()
.filter(|b| b.app == app)
.collect();
// ... balanceamento de carga entre backends filtrados
}

Topologia de Rede

Topologia de Integração Fly.io

Convenção de Nomes DNS

Entradas DNS seguem o padrão <região>.pop.internal:

Nome DNSResolve ParaRegião
gru.pop.internal10.50.1.1América do Sul
iad.pop.internal10.50.2.1US Leste
ord.pop.internal10.50.2.2US Central
lax.pop.internal10.50.2.3US Oeste
lhr.pop.internal10.50.3.1Europa (UK)
fra.pop.internal10.50.3.2Europa (DE)
cdg.pop.internal10.50.3.3Europa (FR)
nrt.pop.internal10.50.4.1Ásia Pacífico (JP)
sin.pop.internal10.50.4.2Ásia Pacífico (SG)
syd.pop.internal10.50.4.3Ásia Pacífico (AU)

Conclusão

Todos os testes de integração passaram com sucesso após correção dos problemas identificados:

Categoria de TesteResultado
Conectividade WireGuard10/10 OK
Status dos Serviços6/6 OK
Registro via API10/10 OK
Resolução DNS10/10 OK
DNS Cross-RegionOK

Total: Todos os testes passando