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