- O bloqueio de usuários da Imgur no Reino Unido gerou o problema de que links de imagem em vários lugares, como Reddit, fóruns e documentos, eram exibidos como “unavailable”
- Em vez de uma VPN pessoal, foi montada uma estrutura de desvio automático em nível de rede inteira para permitir acesso ao Imgur em todos os dispositivos
- Foi projetada uma arquitetura combinando Pi-hole, Traefik, Gluetun, Nginx e NixOS para contornar bloqueios de DNS e encaminhar o tráfego pela VPN
- Usando TLS pass-through e compartilhamento de rede Docker, o tráfego permanece criptografado e a perda de desempenho é minimizada
- Como resultado, o acesso às imagens do Imgur ficou disponível em todos os dispositivos sem configuração individual e foi implementado um mecanismo de desbloqueio geográfico transparente em nível de rede sem perda de velocidade
Casos e incômodos com o bloqueio da Imgur
- Quando a Imgur bloqueou o acesso de usuários no Reino Unido, surgiu o problema de que links de imagem em diferentes páginas da web, como Reddit, fóruns e documentos, deixaram de aparecer
- Todas as imagens de pré-visualização de shaders do Minecraft desapareceram, deixando impossível identificar qual shader era
- Mesmo em posts antigos ou arquivos README, os links da Imgur ainda permaneciam, mantendo a indisponibilidade
Escolha de uma solução em nível de rede em vez de VPN
- A solução comum seria usar VPN, mas em um ambiente de internet de 2,5 Gbps desviar todo o tráfego pela VPN causa perda de velocidade
- Há ainda o problema de complexidade operacional de ter que instalar e conectar VPN em cada dispositivo
- O objetivo foi obter uma solução em nível de rede que funcione de forma automática em todos os dispositivos, sem necessidade de configuração do cliente
Design da arquitetura em nível de rede
- No ambiente de homelab existente já se usava Traefik (reverse proxy), Pi-hole (DNS) e NixOS (configuração declarativa)
- A solicitação a
i.imgur.com é interceptada na etapa de DNS e encaminhada para o container de conexão VPN (Gluetun)
- Pi-hole retorna o IP do Traefik
- Traefik verifica o hostname do SNI e roteia para Gluetun
- Gluetun repassa a solicitação pela VPN
- O Nginx dentro do Gluetun faz proxy para o servidor real da Imgur
- A imagem é retornada novamente pelo túnel
Configuração de Nginx e Gluetun
- Como o Gluetun só fornece conexão VPN, é necessário um Nginx para cumprir o papel de proxy dentro da rede da VPN
- O Nginx é configurado em modo stream TCP para ler cabeçalho SNI e encaminhar tráfego para
i.imgur.com:443
- O handshake TLS é realizado de ponta a ponta, então o Nginx não vê dados descriptografados
- São executados dois containers (Gluetun, Nginx) no Docker Compose
- Com a configuração
network_mode: "service:gluetun", o Nginx compartilha a stack de rede do Gluetun
- Todo tráfego do Nginx passa automaticamente pelo túnel VPN
Integração com Traefik e NixOS
- Traefik usa roteamento TCP e TLS pass-through para encaminhar solicitações de
i.imgur.com para o Gluetun
- Ele inspeciona apenas o cabeçalho SNI sem encerrar TLS
- No NixOS, a stack de Docker Compose é executada como serviço systemd
- Credenciais da VPN são armazenadas criptograficamente com Agenix
- Todo repositório de dotfiles pode ficar público e ainda assim manter segredos protegidos
Resultado e desempenho
- Todos os dispositivos da rede (incluindo celular, notebook e dispositivos de convidados) conseguem acessar imagens do Imgur sem configuração extra
- Pi-hole intercepta DNS, Traefik roteia e Gluetun realiza o túnel VPN
- Atraso de carregamento de imagem é quase inexistente; apenas o tráfego do Imgur segue pela VPN, mantendo a velocidade de tráfego normal
- A manutenção fica simples e a estrutura de desbloqueio geográfico automatizado da rede é completada em ambiente homelab
- Conteúdos baseados em Imgur, como shaders do Minecraft, podem ser verificados normalmente novamente
1 comentários
Opinião no Hacker News
Coloquei várias portas em uma caixinha barata fanless rodando Linux e deixei a interface WireGuard configurada uma única vez com
systemd-networkdCom isso, dá para rotear apenas certos tráfegos pela VPN ou até manter um SSID/VLAN separado só para VPN
Só que o roteamento baseado em domínio pode ser complicado, então, se precisar, penso em adicionar ao roteador um proxy com override de DNS local
Também suporta roteamento geográfico dividido baseado em regras, o que é útil
A propósito, há um texto relacionado neste blog
Era incômodo não conseguir ver screenshots, e acho que este texto vai ser o empurrão final
Esse tipo de bloqueio é fácil de contornar, mas se o Imgur sumir, muitos sites vão quebrar
Mesmo que as pessoas contornem a censura e a perda de tráfego não seja grande, é importante que servidores no exterior não precisem se curvar a regulações autoritárias
A UE também parece estar indo numa direção parecida, então ferramentas capazes de rejeitar censura precisam se espalhar amplamente
Se configurar isso em um Raspberry Pi ou mini PC junto com PiHole, dá para tunelar o tráfego da casa da família pelo seu IP
Basta adicionar o arquivo de configuração do WireGuard no app móvel e, no mecanismo de políticas, definir que apenas certos domínios sejam roteados pela interface VPN
Eu quebrei o galho temporariamente com uma longa regra de firewall bloqueando faixas IPv6, mas isso foi barrado em sites baseados em Cloudflare
Tomara que o UniFi passe a oferecer suporte a WireGuard com IPv6
O Reddit é ainda pior: você nem consegue ver o perfil de usuários que já postaram conteúdo NSFW
Assim isso poderia ser tratado automaticamente sem a chatice de ficar ligando e desligando a VPN toda hora
Por exemplo, seria útil em casos como redes sociais com verificação de idade, apps bloqueados por país (como Spotify) e censura de sites de notícia
Em geral se aplica apenas a requisições HTTP/S, mas vendors como ZScaler estendem isso a outros protocolos
No Tailscale, o recurso App Connector faz esse papel
Em uns 15 minutos dá para configurar para mandar só domínios específicos pela VPN, e funciona muito bem
Em ambientes como Wi‑Fi de avião, onde a VPN é bloqueada, SSH costuma ser permitido, então combinei forwarding dinâmico com um arquivo PAC para deixar o entretenimento de bordo e sites de rastreamento conectarem diretamente
Funciona muito bem