我已经设置了一个运行良好的 WireGuard 服务器:我可以成功地将 Android 手机连接到它,也可以连接到运行 Windows 的笔记本电脑上的客户端。但是,我无法在同一台笔记本电脑上安装 Ubuntu 20.04 进行连接(具有讽刺意味的是,wireguard 服务器也在 Ubuntu 20.04 下运行)。
如果它有任何重要性,Ubuntu 已经从 18.04 升级,我也尝试在那里运行wireguard(虽然我不记得是否成功)。与此同时,我已经清除了wireguard,确保删除了ppa,并从“官方”存储库重新安装。我还尝试了 network-manager-wireguard(使用此处描述的 apt 源),而不是通过 /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)
当wg0traceroute 1.1.1.1
在笔记本电脑上关闭时,笔记本电脑的输出:
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(如答案中所建议的那样) - 在最初能够重现该问题之后(当我忘记重新启动服务器时),我可以获得连接。这使我走上了解决方案的正确轨道-见下文!