我使用这个完全相同的配置工作了一年多,直到几周前我旅行时我的wireguard 连接突然停止工作。当我回到家时,我试图解决问题,但没有任何想法。
家庭服务器在 192.168.1.2 上运行,位于 Unifi USG 路由器后面。 51820/udp 端口已从 USG 正确转发到服务器。服务器上的 UFW 防火墙已禁用,但由于同一服务器上运行着各种 docker 容器,因此有大量 IP 表规则处于活动状态。不幸的是,我无法弄清楚 IP 表规则。
wg0.conf:
[Interface]
# wg0
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = [redacted]
# PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o enp4s0 -j MASQUERADE
# PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o enp4s0 -j MASQUERADE
# These rules should NOT be necessary according to Arch Wiki and other places I have read since the wireguard "server" sits behind NAT home router. Regardless, it doesn't work with or without these iptables rules uncommented.
[Peer]
# iphone
PublicKey = [redacted]
AllowedIPs = 10.0.0.2/32
iPhone.conf:
[Interface]
Address = 10.0.0.2/32
PrivateKey = [redacted]
DNS = 192.168.1.1 #address of my USG router serving dns. Have also tried public DNS like 1.1.1.1 with no luck
[Peer]
PublicKey = [redacted]
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = vpn.mydomain.dev:51820 # DNS records set correctly via cloudflare (no proxying) and I know this works because I can get a handshake with the server, just no internet or LAN access.
PersistentKeepalive = 25
启用 ipv4 转发:
[email protected]: ~ ➜ cat /proc/sys/net/ipv4/ip_forward
1
在 192.168.1.2 服务器上禁用 ipv6:
[email protected]: ~ ➜ sudo sysctl -p /etc/sysctl.d/ipv6.conf
net.ipv6.conf.enp4s0.disable_ipv6 = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
请让我知道我还可以在哪里进行故障排除。提前谢谢了!
编辑 - 自原始帖子以来尝试了其他故障排除步骤但未成功 -
我完全停止了所有 docker 容器,然后停止了 docker 服务本身,然后刷新了所有 iptables 规则,同时仍然确保接受所有转发的数据包:
#!/bin/sh
ipt="/sbin/iptables"
$ipt -P INPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -P OUTPUT ACCEPT
$ipt -F
$ipt -X
$ipt -t nat -F
$ipt -t nat -X
$ipt -t mangle -F
$ipt -t mangle -X
$ipt -t raw -F
$ipt -t raw -X
刷新后检查 IPv4 iptables:
sudo iptables -L -v -n
Chain INPUT (policy ACCEPT 3111 packets, 355K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 2087 packets, 156K bytes) pkts bytes target prot opt in out source destination
然后尝试了wireguard隧道,情况仍然相同——握手,但没有互联网或局域网连接。
答案1
握手有效并且字节被传输(PersistentKeepalive = 25
在配置中)。但连接会默默失败,并且您尝试通过连接发送的任何内容都会超时。
如果这是你的问题,那么问题就很严重了重要的是要意识到当两个对等点之间的 Address/AllowedIPs 或 PrivateKey/PublicKey 配置不匹配时,连接确实会简单地超时,即使握手仍然可以工作(根据wg show
)。
通过以下方式修复问题:
- 确保A的Interface-section的条目在B的Peer-section的条目
Address
范围内。AllowedIPs
- 确保与B 的对等部分的条目
wg pubkey <<<"<PrivateKey of A's Interface-section"
匹配。PublicKey
反之亦然(交换 A 和 B)。
然后,您必须使用以下命令重置两个对等点上的接口(其中 wg0 是您的接口的名称):
wg-quick down wg0
wg-quick up wg0
请注意,如果您更改了,这wg syncconf wg0 <(wg-quick strip wg0)
还不够Address
。
根据您的具体情况,您可以更改Address = 10.0.0.1/24
为Address = 10.0.0.1/32
或 简单地Address = 10.0.0.1
。我认为您不应该在条目中设置 IP 范围Address
,该范围仅适用于 AllowedIPs 以允许多个 IP 地址。