无法让 wireguard 客户端在 Ubuntu 20.04 上运行

无法让 wireguard 客户端在 Ubuntu 20.04 上运行

我已经设置了一个 WireGuard 服务器,它运行良好:我可以成功将 Android 手机连接到它,也可以将客户端连接到运行 Windows 的笔记本电脑上。但是,我无法让安装在同一台笔记本电脑上的 Ubuntu 20.04 进行连接(这很讽刺,因为 wireguard 服务器也在 Ubuntu 20.04 下运行)。

如果有什么重要的话,Ubuntu 已经从 18.04 升级了,我也尝试在那里运行 wireguard(虽然我不记得是否成功)。与此同时,我清除了 wireguard,确保 ppa 被删除,并从“官方”存储库重新安装。我还尝试了 network-manager-wireguard(使用此处描述的适当来源) 而不是通过 /etc/wireguard 手动配置,结果不会发生任何变化。

我的客户端配置是(/etc/wireguard/wg0.conf):

[Interface]
PrivateKey = clientprivatekey
Address = 192.168.1.3/32
ListenPort = clientport
DNS = ip-of-DNS-in-destination-network

[Peer]
PublicKey = serverpublickey
PresharedKey = presharedkey
Endpoint = fully.qualified.domain.server.name:serverport
AllowedIPs = 0.0.0.0/0

服务器上相应的对等部分也存在:

[Interface]
Address = 192.168.1.1/24
SaveConfig = false
PrivateKey = serverprivatekey
ListenPort = serverport

[Peer]
PublicKey = clientpublickey
PresharedKey = presharedkey
AllowedIPs = 192.168.1.3/32

UFW 设置为让 UDP 流量通过正确的端口(如上所述ListenPort),但我也尝试在客户端上完全禁用 UFW 以排除任何干扰。

通过 连接时sudo wg-quick up wg0sudo wg show显示:

$ sudo wg
interface: wg0
  public key: clientpublickey
  private key: (hidden)
  listening port: clientport
  fwmark: 0xca6c

peer: serverpublickey
  preshared key: (hidden)
  endpoint: serverip:serverport
  allowed ips: 0.0.0.0/0
  transfer: 0 B received, 148 B sent

因此,它似乎已连接;但从未收到任何信息。服务器上的相同命令显示尚未发生握手(因此从服务器端看来,客户端从未连接过)。

我也尝试使用该network-manager-wireguard插件,它也显示一条消息,表明连接“成功”,但输出wg保持不变。

因此似乎有什么东西阻碍了 WireGuard 流量,但我不知道是什么,也不知道如何调试。客户端似乎认为它已连接,但它没有到达服务器?可能我遗漏了一些非常简单的东西,但我完全陷入了困境;提前感谢您的帮助!

编辑:$ wg-quick up wg0客户端的输出:

[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.1.3/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a wg0 -m 0 -x
[#] wg set wg0 fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n

ip a连接配置完成后输出:

服务器:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0: <NO-CARRIER,...
3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether MAC brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.142/24 brd 192.168.0.255 scope global dynamic noprefixroute enp3s0
       valid_lft 769974sec preferred_lft 769974sec
    inet6 ...
12: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 192.168.1.1/24 scope global wg0
       valid_lft forever preferred_lft forever

客户:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: wlp59s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN  ...
4: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether MAC brd ff:ff:ff:ff:ff:ff
    inet 192.168.42.67/24 brd 192.168.42.255 scope global dynamic noprefixroute usb0
       valid_lft 3301sec preferred_lft 3301sec
    inet6 ...
6: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 192.168.1.3/24 scope global wg0
       valid_lft forever preferred_lft forever

route -n当 wg0 在两端都启动时,笔记本电脑的输出:

Kernel IP routing table
0.0.0.0         192.168.42.129  0.0.0.0         UG    100    0        0 usb0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 usb0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 wg0
192.168.42.0    0.0.0.0         255.255.255.0   U     100    0        0 usb0

(请注意,我更改了互联网连接 - 我之前尝试过通过 WiFi,因为我现在在家,所以我尝试通过 USB 网络共享到我的手机,因此 usb0 地址得到了 192.168.42... 地址)。

ping 192.168.1.1 当 wg0 在两端都启动时,笔记本电脑的输出:

PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
^C
--- 192.168.1.1 ping statistics ---
9 packets transmitted, 0 received, 100% packet loss, time 8185ms

traceroute 1.1.1.1当 wg0 在两端都启动时,笔记本电脑的输出:

traceroute to 1.1.1.1 (1.1.1.1), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 ... (you get the gist)

traceroute 1.1.1.1当笔记本电脑上的 wg0 关闭时,笔记本电脑的输出:

traceroute to 1.1.1.1 (1.1.1.1), 30 hops max, 60 byte packets
 1  _gateway (192.168.43.1)  4.736 ms  4.858 ms  5.571 ms
 2  * * *
 3  10.15.19.26 (10.15.19.26)  103.204 ms  103.372 ms  103.038 ms
 4  * * *
 5  185099072070.public.t-mobile.at (185.99.72.70)  103.646 ms  103.488 ms  103.795 ms
 6  vix.as13335.net (193.203.0.195)  103.900 ms  40.076 ms  40.039 ms
 7  one.one.one.one (1.1.1.1)  28.038 ms  32.379 ms  32.238 ms

(请注意,这是通过移动热点连接的不同情况,因此子网不同(上面的 192.168.42.x 与这里的 192.168.43.)

所以我现在非常确定 Ubuntu 客户端上的某些东西阻止了 wireguard 流量的流出。但可能是什么呢?我目前怀疑可能出现的问题包括

  • 保护机制正在干扰(但它必须在客户端,因为到同一服务器的其他连接可以正常工作) - 例如 AppArmor /... 或除 ufw 之外的某些防火墙(即,即使 ufw 被禁用,它仍然处于活动状态)
  • 一些路由问题(路由应该由 wireguard 自动设置,对吗?我该如何检查?)
  • wireguard/wg-quick 与 Ubuntu 20.04 存在一些不兼容问题

我可以检查任何特定日志来查找问题吗?

更多编辑:我现在尝试通过服务器/客户端通信nc(如下方@FedonKadifeli 所推荐的;并且我看到了Test Message服务器端 - 所以这肯定是 wireguard 问题。我现在如何调试 wireguard 连接尝试?

刚刚在 VirtualBox 上尝试了全新的 Ubuntu 20.04(如答案中所示)——在最初能够重现该问题(当我忘记重启服务器时)之后,我能够建立连接。这让我走上了解决问题的正确轨道——见下文!

答案1

您应该做的第一件事是检查 WireGuard 服务器和客户端之间的连接:

  • 将两侧的 WireGuard 都关闭。
  • 在服务器上运行nc -lu serverport服务器端口 是您在 WireGuard 中使用的 UDP 端口。
  • 在客户端运行:echo Test message | nc -4u -w1 fully.qualified.domain.server.name serverport
  • 客户端发送的测试消息应该显示在服务器的终端上。

假设服务器端口可供客户端访问,您可以继续测试 WireGuard。


在服务器配置[Peer]部分

AllowedIPs = 192.168.1.3/32

是正确的。但是,在客户端配置[Interface]部分,您应该输入

Address = 192.168.1.3/24

或者某个掩码值(而不是/24),该值与服务器配置部分中给出的值相同[Interface]。请检查服务器配置[Interface]部分并确定您在该行中使用的网络掩码值Address。如果是/24,则应在客户端配置中输入我给出的上述值。


此外,

ListenPort = clientport

客户端配置中的行是不需要的,因为该行属于服务器配置:它是服务器倾听,而不是客户

答案2

事实证明答案非常简单(令我感到羞愧的是,这里的好心人竟然没有发现,因为我遗漏了公认的隐私关键密钥):

我显然使用了上次安装时遗留的私钥(与我提供给服务器的公钥不匹配)。一旦我修复密钥以使其匹配,连接就可以正常工作了!

不过,我觉得奇怪的是,客户端上的 wireguard 没有给出任何无法正确建立连接的反馈(或者更好的是,服务器不接受其密钥)?这本可以帮助我缩小问题范围;但可能密钥应该是首先要仔细检查的东西!

答案3

是的,如果密钥不匹配,服务器会默默失败(丢弃客户端输入)。我明白为什么服务器不想对这种情况做出响应,但在服务器上本地报告错误似乎是明智的做法。这肯定有助于调试。

相关内容