Wireproxy: cliente WireGuard oferecido como proxy HTTP/SOCKS5
(github.com/pufferffish)- O Wireproxy é um cliente WireGuard completo em espaço de usuário que se conecta a um peer WireGuard e depois é exposto na máquina local como proxy SOCKS5/HTTP ou túnel
- É voltado para casos em que você quer enviar apenas o tráfego de sites específicos para um peer WireGuard sem configurar uma nova interface de rede, ou não quer usar privilégios de root para alterar a configuração do WireGuard
- Os recursos incluem roteamento estático TCP, proxy SOCKS5/HTTP e proxy transparente baseado em TLS SNI; no momento, o proxy HTTP oferece suporte apenas a CONNECT
- A configuração segue a semântica de
[Interface]e[Peer]dowg-quick, e é possível importar um arquivo de configuração WireGuard existente comWGConfigou rotear vários peers porAllowedIPs - Para operação em produção, oferece um health endpoint baseado em
--info/-i, permitindo verificar o status do WireGuard e a prontidão baseada emCheckAlivepor/metricse/readyz
O que o Wireproxy faz
wireproxyé uma aplicação em espaço de usuário que se conecta a um peer WireGuard e expõe na máquina local um proxy SOCKS5/HTTP ou túnel- Pode ser usado quando você quer acessar apenas sites específicos por meio de um peer WireGuard, mas não quer criar uma nova interface de rede
- Funciona de forma totalmente separada da interface de rede e não exige privilégios de root para configuração
- Usuários que precisam de um uso semelhante ao Amnezia VPN podem usar o fork wireproxy-awg
Recursos suportados e recursos ainda ausentes
- Recursos suportados
- Roteamento estático TCP para cliente e servidor
- Proxy SOCKS5/HTTP
- Atualmente, HTTP oferece suporte apenas a CONNECT
- Proxy TLS transparente usando Server Name Indication
- Recursos que permanecem como TODO
- Suporte a UDP no SOCKS5
- Roteamento estático UDP
Execução e instalação
- O formato básico de execução é
./wireproxy [-c path to config] - Principais opções
-c,--config: especifica o caminho do arquivo de configuração- Os caminhos padrão são
/etc/wireproxy/wireproxy.conf,$HOME/.config/wireproxy.conf
- Os caminhos padrão são
-s,--silent: silent mode-d,--daemon: execução em segundo plano-i,--info: especifica endereço e porta para expor o health status-v,--version: imprime a versão-n,--configtest: verifica apenas a validade do arquivo de configuração
- O build é feito clonando o repositório e executando
make - Exemplos de instalação usam
go install github.com/windtf/wireproxy/cmd/wireproxy@v1.1.2ou@latest
Modelo de configuração
- As configurações
[Interface]e[Peer]seguem a mesma semântica das configurações dowg-quick Addressdeve usar sub-rede/32para IPv4 e/128para IPv6PrivateKeytambém pode referenciar variáveis de ambiente- Se você já tiver uma configuração WireGuard existente, pode importá-la com
WGConfig = <path to the wireguard config>
Configuração de túneis e proxies
TCPClientTunnel- Encaminha o tráfego TCP recebido na máquina local para o destino especificado por meio do WireGuard
- Um exemplo de fluxo é
<app da LAN> → localhost:25565 → WireGuard → play.cubecraft.net:25565
TCPServerTunnel- Encaminha o tráfego TCP recebido da rede WireGuard para o destino especificado na rede local
- Um exemplo de fluxo é
<app da rede WireGuard> → WireGuard → 172.16.31.2:3422 → localhost:25545
STDIOTunnel- Conecta a entrada e a saída padrão do processo wireproxy a um destino TCP via WireGuard
- É útil para uso como parâmetro
ProxyCommanddoopenssh
Socks5- Cria um proxy SOCKS5 na LAN local e roteia todo o tráfego pelo WireGuard
- Ao especificar nome de usuário e senha, ativa a autenticação do proxy
http- Cria um proxy HTTP na LAN local e roteia todo o tráfego pelo WireGuard
- Ao especificar nome de usuário e senha, ativa a autenticação
- Ao especificar
CertFileeKeyFile, ativa HTTPS
SNI- Cria um proxy TLS transparente na LAN local e usa o SNI como destino de roteamento para enviar tráfego pelo WireGuard
Vários peers e roteamento
- É possível usar vários peers WireGuard
- Ao usar vários peers, é necessário especificar AllowedIPs para que o wireproxy saiba para qual peer encaminhar
- O exemplo de configuração usa vários
[Peer]comAllowedIPsdiferentes junto com váriosTCPServerTunnel - Também inclui um exemplo de
UDPProxyTunnelBindAddressespecifica o endereço de bind localTargetespecifica o endereço de destino- Se
InactivityTimeoutfor0, não há timeout
[Resolve]configura a estratégia de resolução DNSipv4: prioriza registros Aipv6: prioriza registros AAAAauto: valor padrão; se a interface WireGuard tiver apenas endereço IPv4, equivale aipv4; caso contrário, equivale aipv6
- Uma configuração
[Peer]sem Endpoint pode permitir que um peer se conecte ao wireproxy
Health endpoint
--info/-irecebe um endereço e porta, comolocalhost:9080, e expõe um servidor HTTP que fornece métricas de health status- Atualmente, dois endpoints estão implementados
/metrics: expõe informações do daemon WireGuard e fornece as mesmas informações dewg show/readyz: retorna em JSON o horário em que o último pong foi recebido do IP especificado emCheckAlive
- Quando
CheckAliveé configurado, um ping é enviado via WireGuard para o endereço especificado a cadaCheckAliveIntervalsegundos- O
CheckAliveIntervalpadrão é de 5 segundos - Retorna 503 se não receber um pong dentro do último
CheckAliveIntervalsomado a uma margem de 2 segundos de atraso - Retorna 200 se a condição for satisfeita
- O
- Se
CheckAlivenão estiver configurado,/readyzretorna um objeto JSON vazio e 200 - O peer para o qual os pacotes de ping ICMP são roteados depende da configuração de AllowedIPs de cada peer
1 comentários
Comentários no Hacker News
Ferramenta pequena, mas excelente. Uso com os multi-account containers do Firefox para selecionar apenas certas abas e fazer proxy via WireGuard para um roteador doméstico que oferece suporte a WireGuard, mas não a proxy na camada de aplicação nem SSH
Eu achava que, para configurar isso, era necessária uma extensão separada como https://addons.mozilla.org/en-GB/firefox/addon/container-pro..., mas não era; e agora parece que até esse equívoco já é motivo para downvote
Para o que eu queria fazer com WireGuard, https://github.com/dariost/soks serviu melhor. Faz praticamente a mesma coisa, mas reutiliza uma interface WireGuard existente
Escrevi em detalhes sobre o modo de uso neste post: https://www.nicoco.fr/blog/2023/09/10/wireguard/
Em vez de usar a tabela de roteamento como mecanismo de controle, parece decidir se usa ou não um proxy SOCKS5
Antigamente eu fazia algo parecido com um contêiner Docker em um Raspberry Pi, mas uma solução em espaço de usuário parece uma escolha muito melhor por poder rodar em qualquer sistema operacional e garantir que não vai estragar acidentalmente a tabela de roteamento do host
Também existe o onetun: https://github.com/aramperes/onetun
Fico me perguntando se também existe uma implementação de servidor totalmente em espaço de usuário. Para fazer isso sem dispositivo tun/tap, acho que seria preciso algo como uma pilha IP em espaço de usuário, mas não tenho certeza
Substitui o Dialer que conecta sockets em Go, permitindo basicamente encapsular sockets com WireGuard. Como roda em espaço de usuário, não precisa de tun/tap. Tudo isso foi publicado como open source por @dpeckett
Com a mesma base, ele também criou um gateway WireGuard em espaço de usuário que inclui até resolução DNS: https://github.com/noisysockets/gateway
https://news.ycombinator.com/user?id=dpeckett
Pelo que entendo, usa a pilha TCP/IP em espaço de usuário do Google
Parece uma boa opção para substituir o túnel SSH que eu usava quando precisava de outro IP
Como ferramenta relacionada, há também o pproxy, que, entre várias funções, consegue “converter” diferentes protocolos de túnel e também tem recursos de roteamento. Usei para transformar SSH SOCKS5 em proxy HTTP: https://github.com/moreati/pproxy
Pensei: “dá para fazer isso com bastante facilidade em Go, não?” E, claro, ele foi escrito em Go
Vários clientes proxy multiprotocolo oferecem suporte a esse recurso. Exemplos open source representativos são sing-box, clash-meta e outros clientes baseados em clash, além do xray
Como cliente de código fechado, há o Surge Mac/iOS
Há muitas possibilidades pouco conhecidas de roteamento de tráfego, e também existem implementações para Android. No passado, usei isso para tentar abrir um hotspot em um Android sem root com um SIM que não oferecia suporte a hotspot
Dito isso, há muito código vindo de vários cantos da internet, e a comunidade de desenvolvedores também é bastante peculiar por vários motivos, então sempre fico me perguntando o quanto dá para confiar
Não investiguei a fundo como funciona, mas gosto do conceito de decidir, por grupos de regras, quais domínios serão encaminhados por proxy via VPN
Tenho curiosidade sobre o desempenho. Pelo que me lembro, o SOCKS “vanilla” é muito fácil de configurar — basta executar o SSH com as opções certas e dizer à aplicação para usá-lo —, mas era bem lento
Esta ferramenta parece ser para casos em que não há um servidor SOCKS/SSH comum, mas fico curioso se há vantagem nesse cenário também
No meu caso, SOCKS sobre SSH sempre teve um desempenho bem bom, e é diferente de uma abordagem que coloca TCP sobre TCP, como o modo TUN do OpenSSH
Ainda assim, tenho muito interesse nesta solução
Eu estava justamente pensando que seria bom ter uma ferramenta para encaminhar por proxy todas as conexões de e-mail do Thunderbird por um Tailscale exit node, sem mandar todo o tráfego para o exit node
tailscalepode ser usada como proxy SOCKS: https://tailscale.com/kb/1113/aws-lambdaSe você colocar isso em uma imagem de contêiner e expor a porta SOCKS em que o tailscale escuta, vira um proxy imediatamente
Se você precisa de algo assim especificamente para o Mullvad VPN, usei https://github.com/imiric/mullvad-proxy e gostei
O projeto não é meu; só fiz um fork para atualizações. O ponto positivo é que ele incorpora a ferramenta CLI da Mullvad, então trocar de servidor é muito fácil, e tudo fica isolado da máquina host. Além disso, como é “só” nginx e alguns scripts, o suporte a SOCKS5 também deve ser tranquilo
https://mullvad.net/en/blog/wireguard-configuration-tool-has...