WireGuard 握手失败

WireGuard 握手失败

编辑:我明白了,解决方案如下。

我一直在尝试手动将 WireGuard 设置为 VPN 网关,而不是使用 wg-quick,因为我不想通过隧道路由本地计算机的流量,而只想路由特定接口和子网的流量。我创建了一个 VLAN 接口,该接口的 IP 通过 DHCP 用作默认网关,并使用 iptables 设置了 NAT 和路由。

我使用以下命令序列来执行此设置:

ip link add wg0 type wireguard
wg setconf wg0 /etc/wireguard/wg0.conf
ip address add w.x.y.z/32 dev wg0
iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
iptables -A FORWARD -i eth0.30 -o wg0 -j ACCEPT
iptables -A FORWARD -i wg0 -o eth0.30 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i wg0 -j DROP
ip link set up dev wg0

我正在连接到 UDP 2049 上的端点,并随机选择了侦听端口。接口已配置并成功启动,但似乎从未发生过握手。运行 tcpdump 甚至没有显示主接口上的任何流量来表明正在发生握手。这是我清理后的配置:

[Interface]
PrivateKey = myprivkey

[Peer]
PublicKey = theirpubkey
AllowedIPs = 0.0.0.0/0
Endpoint = w.x.y.z:2049

以下是 的输出wg

interface: wg0
  public key: mypubkey
  private key: (hidden)
  listening port: 36236 (random)

peer: theirpubkey
  endpoint: w.x.y.z:2049
  allowed ips: 0.0.0.0/0

除了数据包捕获之外,我还能做什么来弄清楚或调试发生了什么?如果我运行wg-quick up wg0,握手实际上会发生!如果我手动分配 IP 地址,我可以通过隧道发送和接收数据。我设置接口的命令序列实际上是从wg-quick执行的命令中派生出来的,所以我很困惑为什么一个有效而另一个无效,而它们本质上是同一件事。有人能给我指出正确的方向吗?

解决方案:

我最终Table = off在 WireGuard 配置文件中添加了阻止其自动修改路由的功能,并使用 启动了接口wg-quick。然后,我ip rule添加了基于策略的路由,以便仅推送来自eth0.30隧道两端的流量,然后使用 NAT 和 iptables 转发流量。以下是我从头到尾实现此目的的方法(我将命令序列添加到WireGuard 配置的PostUp和部分):PostDown

#!/usr/bin/env sh

wg-quick up wg0
ip route add default wg0 table 1
ip rule add dev eth0.30 lookup 1
ip rule add from 192.168.30.10/32 lookup main  # exception for DNS nameserver so queries can return
ip rule add lookup main suppress_prefixlength 0
iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
iptables -A FORWARD -i eth0.30 -o wg0 -j ACCEPT
iptables -A FORWARD -i wg0 -o eth0.30 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

撤消更改的方法非常相似:

#!/usr/bin/env sh

wg-quick down wg0
ip rule delete dev eth0.30 lookup 1
ip rule delete from 192.168.30.10/32 lookup main
ip rule delete lookup main suppress_prefixlength 0
iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE
iptables -D FORWARD -i eth0.30 -o wg0 -j ACCEPT
iptables -D FORWARD -i wg0 -o eth0.30 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

所有命令都必须放在一行上,并用分号分隔,以便适合WireGuard 配置的PostUpPostDown部分,尽管文件本身看起来不好看,但这是迄今为止最干净的方法。我希望这能帮助那些遇到这个死线程的人哈哈

相关内容