Skip to content

About

Soma várias conexões de internet no Windows (proxy SOCKS/HTTP com balanceamento, captura de todos os programas via tun2socks, UI em Svelte + WebView2)

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

MultiLink Balancer

App para Windows que soma várias conexões de internet (cabeadas, Wi-Fi ou 4G via USB) usando o próprio PC: cada link tem seu gateway e o app distribui o tráfego entre eles. É um .exe único (~13 MB, quase tudo do tun2socks usado na captura), sem instalação, com a interface em Svelte rodando no WebView2 que já vem no Windows 11.

MultiLink Balancer

Licença GPL-3.0 · Política de assinatura de código · Privacidade

Como usar

A janela é compacta e vertical, sem a barra de título do Windows: arraste pelo topo (onde está o nome\nMultiLink) e use os botões de minimizar e fechar ao lado da engrenagem. A tela inicial tem só o essencial:

  • Faixa de eventos (topo): o último evento; clique para ver os anteriores.
  • Botão I/O: liga e desliga o MultiLink. Ligado, o proxy local sobe em 127.0.0.1:1080 (SOCKS4, SOCKS5 e HTTP) e, por padrão, o Windows passa a usar o balanceamento. Ao desligar ou sair, a configuração anterior do Windows volta.
  • Total recebido agora e os links: o interruptor à esquerda ativa ou desativa o adaptador no Windows (pode pedir confirmação de administrador); clicar no link mostra endereço, latência, velocidade medida, conexões e o peso.
  • Engrenagem: download acelerado e ajustes (distribuição, quedas, inicialização, sair).

Os pesos (quanto do tráfego vai por cada link) se ajustam sozinhos pelo que cada link rende, sem teste de velocidade.

Fechar a janela mantém o app na bandeja (monitorando quedas). Para encerrar: Sair no menu do ícone da bandeja ou em Ajustes. Abrir o .exe de novo traz a janela de volta.

Como a soma funciona

Situação Soma os links?
Navegador, speedtest, vários downloads, Steam, torrent via SOCKS5 Sim: cada conexão sai por um link, na proporção dos pesos
Um arquivo pelo Download acelerado (engrenagem) Sim: o arquivo é dividido em partes (HTTP Range) baixadas pelos links em paralelo
Uma única conexão (um stream, um download comum de 1 conexão, jogo online) Não: uma conexão TCP sai por um link só
Tráfego UDP (jogos, chamadas de voz/vídeo, QUIC) Só com Capturar todos os programas: cada fluxo sai por um link (balanceia, não soma)

Somar tudo, inclusive uma conexão única e o upload, exige um servidor externo (VPS) que junte os links (bonding), como Speedify ou OpenMPTCProuter. Isso não dá para fazer só do lado do PC.

Testar a soma dos links (Ajustes > Distribuição, ou no menu da bandeja) mostra quanto a soma rende de verdade: baixa do speed.cloudflare.com por todos os links ativos ao mesmo tempo (4 conexões por link, cerca de 8 s) e, em seguida, só pelo link que mais rendeu, sozinho. O resultado sai como, por exemplo, Soma: 790 Mbps · melhor link sozinho (Principal): 719 Mbps · +10%, com a taxa de cada link no teste conjunto, e fica no registro de eventos. O melhor link é medido de novo, sozinho, porque a medição dos pesos também roda os links em paralelo. Se o ganho for pequeno, os links podem dividir o mesmo gargalo (o mesmo roteador ou a mesma operadora) ou o PC não dá conta de mais tráfego.

Ajustes

  • Pesos automáticos (ligado por padrão): o peso de cada link segue a maior vazão que ele já mostrou no seu próprio tráfego, medida a cada segundo, como no net-merge. O pico só cai quando o link está em uso e rendendo menos; um link parado volta aos poucos a receber conexões (até metade do melhor) para ser medido de novo. Enquanto algum link ainda não passou de ~0,4 Mbps, os pesos ficam iguais, para todos serem medidos. O detalhe de cada link mostra o peso e a maior vazão vista. Medir velocidade só adianta o ponto de partida.
  • Peso manual (com os automáticos desligados): proporção de conexões por link. Use Medir velocidade e ajustar pesos (ex.: 719 Mbps → 72, 94 Mbps → 9). Pesos iguais em links de velocidades muito diferentes deixam a soma mais lenta. Peso 0 = não usar.
  • Distribuição: Proporcional aos pesos (padrão), Menos conexões, Só um link, com reserva ou Menor latência (usa o link de menor ping no momento, pela média móvel; só troca quando outro fica claramente mais rápido).
  • Considerar perda de pacotes e jitter (ligado por padrão): um link que está perdendo pacotes recebe menos conexões até melhorar (10% de perda → cerca de 2/3 do peso; 30% ou mais → quase nada). No modo Menor latência, perda e jitter também contam, não só o ping.
  • Manter cada site no mesmo link: ligue se algum site (banco, login) desconectar por trocar de IP. Com isso ligado, downloads de um mesmo site não somam os links.
  • IPv6: Automático (padrão) usa IPv6 só quando todos os links ativos têm IPv6 funcionando. Se só parte deles tem, as conexões IPv6 são recusadas na hora (no UDP, descartadas) e os programas usam o IPv4, que sai por todos os links. Nos programas capturados a recusa é feita por uma regra do Firewall do Windows (MultiLinkBalancer-Ipv6, só na saída pelo adaptador MultiLink), porque o tun2socks completa a conexão antes de consultar o proxy e o programa não voltaria para o IPv4; a regra sai ao desligar a captura (ou, depois de uma queda, na abertura seguinte); sem isso, quem prefere IPv6 (navegadores, apps capturados) mandaria tudo só pelos links com IPv6. O custo: sites só IPv6 ficam sem conexão nesse caso. Sempre usa IPv6 pelos links que têm; Nunca recusa todo IPv6. Nos modos de um link só (Só um link, com reserva e Menor latência), o automático não recusa.
  • Aceitar conexões de outros aparelhos da rede: outros dispositivos podem usar IP-deste-PC:1080 como proxy.

Capturar todos os programas

Por padrão só passa pelo MultiLink o que respeita o proxy do Windows (navegadores, Store, Windows Update...). Com Capturar todos os programas (Ajustes, requer administrador) o resto também passa: jogos, apps de chat, linha de comando e tráfego UDP.

Como funciona: o tun2socks cria um adaptador de rede virtual Wintun chamado MultiLink e entrega cada conexão TCP/UDP que chega nele ao proxy SOCKS5 local. Duas rotas 0.0.0.0/1 e 128.0.0.0/1 (mais específicas que a rota padrão) mandam a internet para esse adaptador; as conexões do próprio MultiLink saem presas ao IP e à placa de cada link e por isso continuam indo direto pelos adaptadores reais. A rede local (impressoras, roteador, outros PCs) continua direta. Se um endereço da rede local de um link chegar à captura mesmo assim (o Windows não encontrou o aparelho), a conexão TCP é recusada na hora com "host inalcançável", em vez de parecer aberta e não levar a lugar nenhum, e o registro de eventos mostra o endereço e o motivo (uma vez a cada 10 min por destino). O tun2socks se identifica ao proxy com o usuário SOCKS5 captura; programas configurados para usar o proxy não são afetados.

IPv6: quando algum link tem IPv6, a rota 2000::/3 (toda a internet IPv6) também vai para o adaptador, que recebe um endereço privado (ULA). Com isso o Windows prefere IPv4 nos sites que têm os dois, e os destinos só IPv6 passam pelo MultiLink e saem pelos links que têm IPv6. Sem nenhum link com IPv6, nada muda no IPv6 do sistema. Um IPv6 instável (o teste falha ou conexões a vários destinos esgotam o tempo) deixa de ser usado e é testado de novo depois de 5 min, com a espera dobrando a cada nova queda (até 1 h).

  • Segurança: o tun2socks roda vinculado ao MultiLink (Job Object do Windows). Se o app fechar ou travar, o Windows encerra o tun2socks, o adaptador some e as rotas somem junto: a internet volta ao normal sozinha. As rotas são criadas como temporárias (store=active) e não sobrevivem a um reinício.
  • Weak host send e forwarding: com qualquer um dos dois ligado num link, o Windows ignora a placa a que as conexões do MultiLink estão presas e elas voltariam para a captura (o link pareceria sem internet). O próprio Windows liga o weak host no IPv6, e o Hotspot Móvel, o Compartilhamento de Internet, o Hyper-V e algumas VPNs ligam os dois. Por isso, enquanto a captura está ligada, o MultiLink desliga os dois nos links (temporário, verificado a cada 10 s) e devolve os valores originais ao desligá-la, ou na abertura seguinte se o app tiver fechado de repente. O registro de eventos mostra o que mudou. Compartilhar a internet de um link pelo Hotspot Móvel fica pausado enquanto isso.
  • DNS: com a captura ativa, o Windows resolve nomes por 1.1.1.1 e 8.8.8.8 através do MultiLink.
  • Limitações: um jogo ou chamada (um fluxo UDP) usa um link só; VPNs e alguns anti-cheats podem não conviver com o adaptador virtual.

Histórico

O botão de gráfico na tela inicial mostra a velocidade e a latência de cada link (1 h, 6 h ou 24 h), as quedas dos últimos 30 dias (causa e duração) e os dados recebidos por dia. Um ponto por minuto, salvo em %APPDATA%\MultiLinkBalancer\history.json.

Atalhos e bandeja

  • Ctrl+Alt+M liga/desliga o MultiLink; Ctrl+Alt+N abre/fecha o painel (de qualquer programa; podem ser desligados em Ajustes > Avisos).
  • O menu do ícone da bandeja liga/desliga, troca o modo de distribuição, inclui/retira links, mede a velocidade e testa a soma (o resultado chega num aviso do Windows).

Quedas de link

O app testa cada link a cada 3 s, mesmo com o proxy desligado, e diz onde está o problema:

Estado Significado
Sem internet (operadora) o modem/ONT responde, mas a internet não: problema na operadora
Modem não responde modem desligado, travado ou cabo com defeito
Cabo desconectado sem sinal físico no adaptador
Desativado no Windows adaptador desligado (pode ser reativado pelo botão Ativar)
  • Aviso: notificação do Windows + som quando um link cai ou volta. O ícone da bandeja fica vermelho enquanto houver link fora, e o link mostra o diagnóstico ao ser expandido.
  • Suspensão do PC: ao entrar em suspensão ou hibernação, a placa de rede desliga antes do PC; ao acordar, ela volta antes da internet. Nada disso conta como queda: a queda aberta até 30 s antes de o PC dormir é descartada, a que já vinha de antes termina ali (o tempo dormindo não conta) e, ao acordar, o link tem até 20 s para voltar sem aviso. Se ainda estiver fora depois disso, a queda é registrada e avisada normalmente.
  • Ativar/Desativar: interruptor à esquerda de cada link, faz o mesmo que o Painel de Controle (pede confirmação do Windows/UAC).
  • Tirar link caído do roteamento do Windows (opcional, requer administrador): quando um link cai, ele sai do roteamento do sistema inteiro (métrica 9000) e volta sozinho quando a internet dele retorna. Ao fechar o app, as rotas originais são restauradas. Como administrador, "Iniciar com o Windows" usa uma tarefa agendada elevada.

Qualidade dos links

Além do teste a cada 3 s, cada link recebe um ping (ICMP) saindo pelo próprio endereço. Das últimas 20 respostas (cerca de 1 minuto) saem a perda de pacotes e o jitter (variação média entre respostas seguidas), mostrados ao expandir o link. Se a rede bloqueia ICMP, a medida usa o tempo das conexões TCP de teste (uma conexão que precisa reenviar o pedido conta como perda). Com 10% de perda ou mais o link fica instável: ponto amarelo e aviso no registro de eventos, até a perda voltar para 3% ou menos.

Atualizações

Uma vez por dia (e 30 s depois de abrir) o app consulta a última release deste repositório no GitHub e avisa se há versão nova. Em Ajustes > Atualizações, Atualizar baixa o .exe, confere o SHA-256 publicado junto com ele, troca o executável e reinicia. A consulta usa a API pública do GitHub, então só funciona com o repositório público.

Memória

Medido nesta máquina (memória privada):

Situação Uso
Na bandeja (WebView2 é destruído) ~29 MB
Janela aberta (app + WebView2, renderização por software) ~131 MB

Política de assinatura de código

Assinatura de código gratuita fornecida por SignPath.io, certificado emitido pela SignPath Foundation.

Só é assinado o MultiLinkBalancer.exe publicado nas releases, compilado pelo GitHub Actions a partir deste repositório (.github/workflows/build.yml). Cada assinatura é aprovada manualmente. Builds locais e os artefatos de cada push não são assinados.

Papel Quem
Autores (alteram o código sem revisão adicional) P0sseid0n
Revisores (revisam toda contribuição de fora) P0sseid0n
Aprovadores (aprovam cada pedido de assinatura) P0sseid0n

O .exe leva embutidos, sem modificações, componentes de terceiros que não são assinados por este projeto: tun2socks (MIT), wintun.dll (assinada pela WireGuard LLC) e as DLLs do carregador do WebView2 (Microsoft).

Privacidade

O MultiLink Balancer não coleta, não guarda fora do PC e não envia dados sobre quem usa nem sobre o que é acessado. Ele só se comunica com outros sistemas para funcionar ou quando o usuário pede:

Destino Quando Para quê
api.github.com e github.com uma vez por dia, ou ao clicar em Atualizar procurar e baixar versões novas; desligue em Ajustes > Procurar atualizações automaticamente
speed.cloudflare.com na primeira execução e quando o usuário mede a velocidade medir a velocidade de cada link
1.1.1.1 (Cloudflare), 8.8.8.8 (Google), 9.9.9.9 (Quad9) a cada 3 s, por link testar se o link tem internet (conexão TCP sem dados e ping); com a captura ligada, 1.1.1.1 e 8.8.8.8 também resolvem os nomes (DNS)

Políticas de privacidade desses serviços: GitHub, Cloudflare, Google e Quad9.

O resto do tráfego vai para os sites e programas que o próprio usuário acessa. Ajustes, histórico e logs ficam só no PC (%APPDATA%\MultiLinkBalancer e %LOCALAPPDATA%\MultiLinkBalancer).

Desinstalar

O app não tem instalador: é só o .exe.

  1. Em Ajustes, desligue Iniciar com o Windows (se ele foi ligado com o app aberto como administrador, desligue também como administrador, para remover a tarefa agendada).
  2. Clique em Sair: o proxy do Windows, as rotas e o adaptador de captura voltam ao que eram.
  3. Apague o MultiLinkBalancer.exe e as pastas %APPDATA%\MultiLinkBalancer e %LOCALAPPDATA%\MultiLinkBalancer.

Licença

GPL-3.0. Os componentes de terceiros em lib/ mantêm as próprias licenças.

Estrutura

src/                 app em C# (.NET Framework 4.x), uma pasta por camada
  Links/             links e balanceador          Proxy/       SOCKS4/SOCKS5/HTTP e relé UDP
  Monitoring/        saúde, quedas, histórico     Downloads/   download acelerado
  Platform/          Windows: rotas, proxy, captura (tun2socks + Wintun)
  App/               orquestração e comandos da UI
  Ui/                janela, bandeja e WebView2   Updates/     atualização pelo GitHub Releases
ui/src/              interface (Svelte 5 + Vite)
  api/               ponte com o C# (chrome.webview.postMessage) e simulador do npm run dev
  screens/           uma pasta por tela (home, history, settings)
lib/webview2/        DLLs oficiais do pacote NuGet Microsoft.Web.WebView2 1.0.4258.31
lib/tun2socks/       tun2socks 2.7.0 (MIT) e wintun.dll 0.14.1 (assinado pela WireGuard LLC), sem modificações

Camadas, regras de dependência e contratos (comandos, estado, arquivos gravados): ver ARCHITECTURE.md.

A UI não abre nenhuma porta: ela conversa com o C# pelo canal interno do WebView2, e só aceita mensagens da própria origem (https://app.multilink). O HTML vem embutido no .exe.

Desenvolver

cd ui
npm run dev          # http://localhost:5173 com dados simulados e hot reload (use uma janela de 360x640)

Para ver a UI em desenvolvimento dentro do app real (com dados reais), abra o app com a variável MULTILINK_DEV_URL=http://localhost:5173 (o DevTools fica habilitado nesse modo).

Compilar

./build.ps1            # front + app
./build.ps1 -SkipUi    # só o C#
./build.ps1 -Restart   # compila, fecha o MultiLink aberto (como pelo "Sair"), troca o .exe e reabre

Modo de desenvolvimento: com o .exe na pasta do repositório (ao lado do build.ps1), o app mostra uma faixa nos Ajustes e troca a seção "Atualizações" por "Desenvolvimento". Nesse modo ele não procura nem instala versões do GitHub (trocaria o build local pelo da release), libera o DevTools (F12, F5) e tem Recompilar e reiniciar, também no menu da bandeja, que roda o build.ps1 -Restart numa janela do PowerShell (se falhar, a janela fica aberta com o erro).

Usa o csc.exe do .NET Framework (já incluído no Windows) e Node.js para o front. A versão gravada no .exe vem da última tag vX.Y.Z do git (ou de -Version 1.2.3).

Publicar uma versão

O GitHub Actions (.github/workflows/build.yml) compila a cada push na main e guarda o .exe nos artefatos da execução. Para publicar uma release, crie e envie uma tag:

git tag v1.1.0
git push origin v1.1.0

O workflow compila com essa versão e publica a release com MultiLinkBalancer.exe e MultiLinkBalancer.exe.sha256, que é o que a atualização automática usa. As configurações ficam em %APPDATA%\MultiLinkBalancer\config.ini.

About

Soma várias conexões de internet no Windows (proxy SOCKS/HTTP com balanceamento, captura de todos os programas via tun2socks, UI em Svelte + WebView2)

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages