AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 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“需要目标地址”

  • 772

我有一个简单的wireguard 网络,由一个“服务器”(唯一具有外部可路由IP 地址的设备)和两个客户端组成。服务器和客户端之间的通信似乎工作得很好:从服务器,我可以使用它们的线保护地址访问客户端,并且我可以访问客户端“后面”的地址。同样,我可以从客户端访问服务器的wireguard 地址。

不起作用的是客户端到客户端的通信。如果我从一个客户端尝试ping使用其wireguard ip地址到另一个客户端,则ping失败并显示:

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

此外,该ping尝试不会导致客户端和服务器之间的任何 UDP 流量。

我在下面包含了我的wireguard配置。

VPN 节点

在所有节点上:

  • net.ipv4.ip_forward是1
  • FORWARD餐桌上没有限制
  • 我不用来wg-quick调出vpn。我正在使用包含在这篇文章底部的 shell 脚本。

服务器

# 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

客户 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

客户 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

接口配置脚本

节点上的wg0接口使用以下脚本配置:

#!/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 个回答
  • 10869 Views

1 个回答

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

    让我们看看会发生什么:

    • Client1的路由表告诉它 192.168.64.11 可以通过wg0到达。
    • Client1的wg0 加密 密钥路由设置告诉 192.168.64.11 可以通过第二个对等点(密钥以 开头mRjd9)又名Client2访问。
    • 有效负载已准备好通过隧道传输到第二个对等点的当前端点......除了没有Endpoint定义到达第二个对等点并且因为从未在另一个方向接收到流量(出于同样的原因)没有端点存在。这与Server不同,它在从Client1接收到第一个数据包时会将当前Client1的源地址设置为端点。

    从Client2到Client1的另一个方向也是如此:没有Endpoint定义,也没有收到流量来设置端点。

    所以隧道目前不完整,失败了。发生这种情况时, wireguard 会发送所需的错误EDESTADDRREQ/目标地址。仅仅因为很难指定另一面是什么,并不意味着省略它会神奇地使它起作用。

    由于两者都是经过 NAT 的,因此您会在两个经过 NAT 的设备之间遇到常见的 NAT 连接问题。

    要解决此问题,您可以:

    • 使用Server作为类似 STUN 的服务器(甚至可能运行一个实际的 STUN 服务器,但在隧道之外)以同步Client1和Client2的方法,以尝试使用 WireGuard 隧道进行UDP 打孔,假设没有对称 NAT或CG NAT在方法。正确执行此操作超出了此 WireGuard 问题的范围,但这应该是避免所有流量都需要服务器的好处。

      请注意,一旦定义了两个对等点,每个对等点都使用 0.0.0.0/0inAllowedIps的值,在每个客户端上使用 in 就毫无意义AllowedIps。0.0.0.0/0最终将从加密密钥路由中默默丢弃,不应使用。一个 IP 地址可以解析(即:被加密密钥路由)到一个对等点(或没有一个),但不能超过一个。

    • 或者,正如它在 OP 中显示的那样,通过Server中继流量,这需要在其wg0接口上将Server设置为路由器(用于入口和出口)并更改Client1和Client2上的配置。没有“动态加密密钥路由”协议,必须手动或使用两个客户端上的脚本进行更改(直到出现一些能够为 WireGuard 执行此操作的路由守护程序)。例如(这里只使用而不是明确说明所有路由就可以了,现在只有一个实际的 Peer):0.0.0.0/0

      • 客户1

        [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
        

        下面的部分变得无用:Client1永远不会有Client2作为对等方,只有Server。但它仍然可以保留在配置中:

        [Peer]
        PublicKey = mRjd9...
        AllowedIps = 
        PersistentKeepalive = 30
        
      • 客户2

        [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

相关问题

  • 无法通过 Ubuntu VPN 访问外部网络

  • 用 D-LINK DFL-CPG310 防火墙替换 Cisco Pix 防火墙

  • 最好的点对点 VPN?

  • WAN 上的 VLAN

  • 通过 VPN 连接什么是远程服务器 IP?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve