尝试在 EC2 和我的本地 PC(带有虚拟机)之间创建 WireGuard 隧道时没有握手

尝试在 EC2 和我的本地 PC(带有虚拟机)之间创建 WireGuard 隧道时没有握手

我有一个装有 Ubuntu 22.04 的 EC2 实例。我正在尝试在 EC2 实例和我的 PC 之间创建隧道。在我的 PC 上,我有一个装有 Ubuntu 22.04 的 VirtualBox VM(桥接网络)EC2 实例充当公开其 IP 的服务器。

这是 EC2 实例上的 wg0.conf:

[Interface]
Address = 10.8.0.11/24
Address = fc1d:86gb:c3bc::1/64
SaveConfig = true
ListenPort = 51820
PrivateKey = <ec2_private_key>

[Peer]
PublicKey = <my_local_pc_public_key>
AllowedIPs = 10.8.0.22/32, fd0d:86gb:c3bc::2/128

这是我本地 PC VM 上的 wg0.conf:

[Interface]
PrivateKey = <my_local_pc_private_key>
Address = 10.8.0.22/24
Address = fc1d:86gb:c3bc::2/64

[Peer]
PublicKey = <ec2_public_key>
AllowedIPs = 10.8.0.0/24, fc1d:86gb:c3bc::/64
Endpoint = <ec2_public_IPv4_address>

51820在我的 EC2 入站规则中,我允许来自所有 IPv4 和 IPv6 地址的UDP 端口。

在服务器上我启动了 wg 服务。虽然没有显示active(running),但它显示了active(exited)

ubuntu@ip:~$ sudo systemctl status [email protected][email protected] - WireGuard via wg-quick(8) for wg0
     Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor pre>
     Active: active (exited) since Mon 2022-11-07 05:17:24 UTC; 10h ago

然后我在本地电脑上输入 wg-quick 命令:sudo wg-quick up wg0 但是我没有看到两台机器之间的握手 我该如何进一步调试它?

答案1

仅当需要发送某些数据时(或为该对等方启用了“持久保持连接”)才会发生握手。否则隧道将保持安静。尝试对ping等接口的 IP 地址生成一些流量。

如果您尝试 ping 某个东西,但在 tcpdump 中看到没有发送任何数据包,请尝试启用 WireGuard 内核模块的“动态调试”,这样dmesg就会记录忽略数据包的原因:

# echo "module wireguard +p" > /sys/kernel/debug/dynamic_debug/control
# dmesg -ew

如果你看到握手开始从一端但未到达另一端(例如,如果您看到握手 UDP 数据包离开一个对等方的 eth0 接口,但它们从未出现在另一端) - 这可能是由网络级阻塞引起的(例如 AWS 安全规则或 VirtualBox NAT 很奇怪)。

如果你看到握手数据包正在被发送和接收(即它们显示在两端的 tcpdump 上),但是被忽略另一端,它可以是主机级防火墙(iptables/nftables)或 WireGuard 本身:

  • 如上所述启用内核模块调试;如果 WireGuard 本身忽略了握手数据包,则会在 dmesg 中提及。如果数据包在 tcpdump 中,但 dmesg 中没有提及它 - 则可能是防火墙丢弃了它。
  • 如果目标运行 iptables,请-p udp --dport 51820 -j LOG在 iptables 规则集中的各个位置添加一些规则,以查看数据包是否到达它们(日志事件也将在 dmesg 中)。
  • 如果您在目标主机上使用 nftables,请添加一条udp dport 51820 meta nftrace set 1规则,然后运行nft monitor trace以查看数据包是如何处理的。

相关内容