Múltiplas interfaces wireguard, cada uma usando a interface 'real' diretamente, e através de qualquer uma delas, podendo alcançar qualquer IP

Múltiplas interfaces wireguard, cada uma usando a interface 'real' diretamente, e através de qualquer uma delas, podendo alcançar qualquer IP

Estou precisando configurar várias wg-quickinterfaces em uma única máquina, ambas usando a NIC Ethernet real diretamente e de forma independente.
O problema que parece estar acontecendo é que, por meio de cada um deles, quero acessar toda a Internet, o que presumo significar AllowedIPs = ::0, mas wg-quickgosto de adicionar rotas localmente, de modo que todo o tráfego que vai para qualquer lugar passe por essa nova interface; incluindo quaisquer wg-quicktentativas seguintes.

Existe uma maneira de ligar wg-quicke dizer "ei, não, gostaria que você usasse especificamente eno1, não o 'gateway padrão'"? Talvez usando raw wg?

Tentei ler um monte on-line, mas fico confuso com o que os outros estão perguntando quandoparececomo uma pergunta semelhante, mas acaba hospedando vários serviços wireguard ou algo assim.

Abaixo está a essência básica, com duas interfaces wg. wg0neste caso, estou fazendo o normal wg-quickde roubar todo o tráfego de forma transparente, onde wg1há uma interface disponível onde posso configurar aplicativos para conversar especificamente com ele.
Não me importo se sua solução foi wg0forçada a funcionar dessa maneira, posso configurar um proxy SOCKS e HTTP para software que não suporta sinalizadores "usar esta interface/IP para tráfego" para obter o mesmo efeito.

                                                             
      Home                ║      ISP       ║       Internet  
                          ║                ║                 
                          ║                ║                 
  ┌─────────────┐         ║                ║                 
  │             │         ║                ║                 
  │             │         ║                ║        ┌───┐    
  │             │         ║                ║     ╔══╪        
  │         eno1│         ║                ║     ║  └───┘    
  │   wg0      ┐│         ╙────────────────╜     ║  VPN0     
  │     ┐      └─────────────┘                   ║           
  │     ╞════════════════════════════════════════╝           
  │     ┘   ╔════════════════════════════════════╗           
  │   wg1   ║  ┌─────────────┐                   ║           
  │     ╓   ║  ┘│  router                        ║  ┌───┐    
  │     ╠═══╝   │         ╓────────────────╖     ╚══╪        
  │     ╙       │         ║                ║        └───┘    
  │             │         ║                ║        VPN1     
  │             │         ║                ║                 
  └─────────────┘         ║                ║                 
        PC                                                   
                                                             

"Por que?". Usando o openVPN, meu provedor permitia portas abertas, basicamente permitindo o firewall local, eu era roteável publicamente e poderia hospedar serviços em qualquer número de portas que desejasse. Eles mudaram para wireguard, o que é ótimo, mas eles suportam apenas uma porta aberta por conexão wireguard. Então, basicamente, para cada aplicativo que eu encaminhei uma porta, quero criar uma interface VPN para ele.

Isso é possível usando apenas wireguard, sem iptables ou algo assim (o que eu não entendo de jeito nenhum)?

Responder1

SIM. OK. Portanto, a solução aparentemente é tão simples que sudo ip route add $VPN1 via eno1permitirá que ele se conecte à VPN1 via eno1, independentemente da existência de wg0. Você tem total permissão para ter múltiplas ::0interfaces wg nomesmo espaço para nomecom um deles como padrão (wg0), desde que seus aplicativos suportem ligação a uma interface para conexões (como netcat -s). A ressalva é que apenas um desses túneis pode ser gerado com wg-quick's Table=auto.


NO ENTANTO, o que passei a última semana lutando é o propósito de eu querer fazer isso em primeiro lugar; fazer com que essas interfaces wg transmitam tráfego de entrada!

Tentei várias coisas;

  • ingenuamente apenas executando wg-quickvárias vezes com as rotas em vigor (isso mata tudo e tenta quebrar wg-quick downtotalmente a pilha de rede)
  • como acima, girando múltiplos, um com Table=auto, os outros comTable=off
  • como acima, girando múltiplos, um com wg-quick, os outros comwg
  • girando múltiplos comeno1se escondendo atrás de umnamespace(Eu não consegui nem fazer isso funcionar para o tráfego de saída...)
  • girando múltiplos comcada um wgna suanamespace

Mas mesmo que funcionem [para o tráfego de saída em seus respectivos túneis] (salvo indicação em contrário), todas essas conexões de entrada recusaram (testando com netcat -l -p $assignedPort), independentemente de ufw disableusarem servidores iguais ou diferentes para "VPN{0,1}".


A solução aqui é algo que eufinalmente me deparei ontem. O molho mágico wg-quickestava fazendo com Table=auto; FwMark.

O que eu estava tentando evitar era aprender a fazer sozinho "Isso é possível usando apenas wireguard?". Bem, você precisa que os pacotes sejam marcados e associados a uma tabela, MAS você não precisa entender/imitar/reimplementar o que wg-quickfaz...aparentemente você pode apenasusaristo.

Então, depois de configurar o túnel padrão para VPN0 usando wg-quickvocê pega aquele FwMark e depois de configurar o ip routepara VPN1reutilizar esse FwMarkpara wg. Esta última conexão agora passa por eno1 (de acordo com a rota), mas permite a entrada de pacotes encaminhados da VPN1 (graças à tabela configurada pelo túnel da VPN0).

informação relacionada