我已经设置了一个 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 wg0
,sudo 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
是的,如果密钥不匹配,服务器会默默失败(丢弃客户端输入)。我明白为什么服务器不想对这种情况做出响应,但在服务器上本地报告错误似乎是明智的做法。这肯定有助于调试。