AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1037398
Accepted
larsks
larsks
Asked: 2020-10-13 07:45:42 +0800 CST2020-10-13 07:45:42 +0800 CST 2020-10-13 07:45:42 +0800 CST

wireguard "endereço de destino necessário" ao tentar se comunicar de cliente para cliente em vez de cliente para servidor

  • 772

Eu tenho uma rede wireguard simples composta por um único "servidor" (o único dispositivo com um endereço IP roteável externamente) e dois clientes. A comunicação entre o servidor e os clientes parece funcionar muito bem: a partir do servidor, posso acessar os clientes usando seus endereços wireguard e posso acessar endereços "atrás" dos clientes. Da mesma forma, dos clientes eu posso acessar o endereço wireguard do servidor.

O que não funciona é a comunicação cliente a cliente. Se de um cliente eu tento para pingoutro cliente usando seu endereço IP wireguard, a pingfalha com:

From 192.168.64.10 icmp_seq=1 Destination Host Unreachable
ping: sendmsg: Destination address required

Além disso, essa pingtentativa não resulta em nenhum tráfego UDP entre o cliente e o servidor.

Eu incluí minha configuração wireguard abaixo.

Nós VPN

Em todos os nós:

  • net.ipv4.ip_forwardé1
  • Não há restrições na FORWARDmesa
  • Eu não estou usando wg-quickpara abrir a vpn. Estou usando um script de shell que está incluído na parte inferior deste post.

Servidor

# ip addr show wg0
39: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 192.168.64.1/24 scope global wg0
       valid_lft forever preferred_lft forever
# ip route show | grep wg0
10.0.0.0/8 dev wg0 scope link
192.168.1.0/24 dev wg0 scope link
192.168.11.0/24 dev wg0 scope link
192.168.13.0/24 dev wg0 scope link
192.168.64.0/24 dev wg0 proto kernel scope link src 192.168.64.1
[Interface]
PrivateKey = <secret key>
ListenPort = 50001

[Peer]
PublicKey = 1cML7...
AllowedIps = 192.168.1.0/24, 192.168.11.0/24, 192.168.13.0/24, 192.168.64.10/32
PersistentKeepalive = 30

[Peer]
PublicKey = mRjd9...
AllowedIps = 10.0.0.0/8, 192.168.64.11/32
PersistentKeepalive = 30

Cliente 1

# ip addr show wg0
33: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 192.168.64.10/24 scope global wg0
       valid_lft forever preferred_lft forever
# ip route | grep wg0
10.0.0.0/8 dev wg0 scope link
192.168.64.0/24 dev wg0 proto kernel scope link src 192.168.64.10
[Interface]
PrivateKey = <secret key>
ListenPort = 50001

[Peer]
PublicKey = 2VtQ/...
Endpoint = wg.example.com:50001
AllowedIps = 0.0.0.0/0, 192.168.64.1/32
PersistentKeepalive = 30

[Peer]
PublicKey = mRjd9...
AllowedIps = 10.0.0.0/8, 192.168.64.11/32
PersistentKeepalive = 30

Cliente 2

# ip addr show wg0
11: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 192.168.64.11/24 scope global wg0
       valid_lft forever preferred_lft forever
# ip route show | grep wg0
192.168.1.0/24 dev wg0 scope link
192.168.11.0/24 dev wg0 scope link
192.168.13.0/24 dev wg0 scope link
192.168.64.0/24 dev wg0 proto kernel scope link src 192.168.64.11
[Interface]
PrivateKey = <secret key>
ListenPort = 50001

[Peer]
PublicKey = 2VtQ/...
Endpoint = wg.example.com:50001
AllowedIps = 0.0.0.0/0, 192.168.64.1/32
PersistentKeepalive = 30

[Peer]
PublicKey = 1cML7...
AllowedIps = 192.168.1.0/24, 192.168.11.0/24, 192.168.13.0/24, 192.168.64.10/32
PersistentKeepalive = 30

Script de configuração de interface

A wg0interface nos nós é configurada com o seguinte script:

#!/bin/sh

dev=$1
addr=$2

ip link add $dev type wireguard
ip addr add $addr dev $dev

wg setconf $dev /etc/wireguard/$dev.conf

ip link set $dev  up
vpn firewall wireguard
  • 1 1 respostas
  • 10869 Views

1 respostas

  • Voted
  1. Best Answer
    A.B
    2020-10-13T14:30:36+08:002020-10-13T14:30:36+08:00

    Vamos acompanhar o que acontece:

    • A tabela de roteamento do Client1 informa que 192.168.64.11 é alcançável por meio de wg0 .
    • As configurações de roteamento de chave criptográfica wg0 do Client1 informam que 192.168.64.11 é alcançável através do 2nd Peer (com uma chave começando com ) aka Client2 .mRjd9
    • a carga útil está pronta para ser encapsulada para o ponto final atual do 2º par... exceto que não há Endpointdefinição para alcançar o 2º par e como nunca houve tráfego recebido na outra direção (pelo mesmo motivo), nenhum ponto final existe. Isso é diferente para o servidor que ao receber o primeiro pacote do Client1 definirá o endereço de origem do Client1 atual como o endpoint.

    O mesmo acontece na outra direção de Client2 para Client1 : não há Endpointdefinição e nenhum tráfego foi recebido para ter um endpoint definido.

    Portanto, o túnel estando atualmente incompleto, falha. wireguard envia o erro EDESTADDRREQ/ endereço de destino necessário quando isso acontece. Só porque é mais difícil especificar o que é esse outro lado, não significa que omiti-lo magicamente fará com que funcione.

    Como ambos são NAT, você obtém os problemas usuais de conectividade NAT entre dois dispositivos NAT.

    Para resolver isso você pode:

    • Use o servidor como um servidor do tipo STUN (talvez até mesmo executando um servidor STUN real, mas fora do túnel) para sincronizar o método para Client1 e Client2 para tentar perfurar UDP com túneis WireGuard, supondo que não haja NATs simétricos ou CG NAT no caminho. Isso está além do escopo desta questão do WireGuard para fazer isso corretamente, mas isso deve ser o que favorecer para evitar a necessidade de servidor para todo o tráfego.

      Observe que usar 0.0.0.0/0in AllowedIpsem cada cliente não faz sentido assim que houver dois peers definidos, cada um com valores em AllowedIps. 0.0.0.0/0será descartado silenciosamente da rota de criptografia no final e não deve ser usado. Um endereço IP pode resolver (ou seja: ser roteado por criptografia) para exatamente um Peer (ou nenhum), mas nunca mais de um.

    • ou, como parece ter sido planejado no OP, retransmitir o tráfego por meio do servidor que exige definir o servidor como roteador em sua interface wg0 (usada para entrada e saída) e alterar a configuração em Client1 e Client2 . Não há protocolo de "rota de criptografia dinâmica", a alteração deve ser feita manualmente ou com scripts em ambos os clientes (até que apareça algum daemon de roteamento capaz de fazer isso para o WireGuard). Por exemplo (aqui, apenas usar 0.0.0.0/0em vez de declarar explicitamente todas as rotas seria bom, agora há apenas um Peer real):

      • Cliente1

        [Interface]
        PrivateKey = <secret key>
        ListenPort = 50001
        
        [Peer]
        PublicKey = 2VtQ/...
        Endpoint = wg.example.com:50001
        AllowedIps = 192.168.64.1/32, 10.0.0.0/8, 192.168.64.11/32
        PersistentKeepalive = 30
        

        A parte abaixo se torna inútil: Client1 nunca tem Client2 como peer, apenas Server . Mas ainda pode ser mantido na configuração:

        [Peer]
        PublicKey = mRjd9...
        AllowedIps = 
        PersistentKeepalive = 30
        
      • Cliente2

        [Interface]
        PrivateKey = <secret key>
        ListenPort = 50001
        
        [Peer]
        PublicKey = 2VtQ/...
        Endpoint = wg.example.com:50001
        AllowedIps = 192.168.64.1/32, 192.168.1.0/24, 192.168.11.0/24, 192.168.13.0/24, 192.168.64.10/32
        PersistentKeepalive = 30
        
        [Peer]
        PublicKey = 1cML7...
        AllowedIps = 
        PersistentKeepalive = 30
        
    • 2

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve