概括:
LAN 地址解析适用于某些wireguard 客户端(我的andorid 手机),但不适用于其他客户端(我的linux 笔记本电脑)。
细节:
我在我的家庭网络中的两个不同的 Pi(主树莓派和故障转移 - 在不同的端口上运行)上运行wireguard。
我使用 PiVPN 设置两个客户端。使用 PiVPN 的选项,连接我的手机几乎是自动的-qr
(我只需将 DNS 更改为我的 PiHole)。从表面上看,这不仅仅是我在.conf
文件中犯了一些基本错误,我也只是盲目的。
每个wireguard服务器有两个客户端:
- 我的安卓手机
- 我的 Microsoft Surface 笔记本电脑/平板电脑(它运行的是 Pop-OS 22.04 - 向 Surface-Linux 内核项目致敬)。
我通过 Wireguard 24/7 汇集所有 Android 手机的流量,因为其中一台 Pi 还为 DNS 运行 PiHole/Unbound 组合。为了避免为除我之外的任何人提供技术支持,我只是将我的计算机指向本地 DNS 服务器,而不是将其设置在 ISP 路由器上。
我的局域网:
ISP路由器
- Pi 的静态 IP 保留。
- 51820 和 51821 上的端口转发
博伊森家庭实验室
- Wireguard(端口 51821)
鹅之家实验室
- 皮霍尔
- 未绑定
- Wireguard(端口 51820)
wg0.conf - 表面:
[Interface]
PrivateKey = (redacted)
Address = 10.140.235.3/24,fd11:5ee:bad:c0de::3/64
DNS = 192.168.1.92 # My LAN PiHole's IP
[Peer]
PublicKey = <public key>
PresharedKey = (redacted)
Endpoint = my.personal.ddns.net:51820
AllowedIPs = 0.0.0.0/0, ::0/0
旁白:我尝试过更改,
AllowedIPs = 0.0.0.0/0, ::0/0
但AllowedIPs = 192.168.1.0/24
没有效果。
wg0.conf - 服务器:
不幸的是,目前这只是一个占位符,因为我不在家,而且我的各种机器的 SSH 密钥都在我的表面上,而不是我的手机上(在触摸屏上进行终端工作也是一种折磨)。
我尝试将我的 Surface 绑定到手机,尝试将流量传递到 LAN 以获得 SSH 连接,但由于某种原因,我的绑定流量似乎没有传递到wireguard 接口。
问题
我的手机能够解析 LAN 内机器的 IP,但我的 Surface 平板电脑无法解析
但
我的 Surface 能够通过我通过 LAN IPtcpdump
设置的wireguard 将 DNS 流量传递到 pihole(通过 PiHole 管理控制台和 dnsleaktest.org 确认) 。wg0.conf
事实上,DNS 流量正在通过我的 LAN 中的 PiHole,但无法 ping 通设备,这一事实非常令人困惑。
尝试在表面上对 LAN 中的任何机器执行 ping 操作,如下所示:
stenolepis@pop-os:~$ ping 192.168.1.92
PING 192.168.1.92 (192.168.1.92) 56(84) bytes of data.
From 192.168.1.89 icmp_seq=1 Destination Host Unreachable
From 192.168.1.89 icmp_seq=2 Destination Host Unreachable
From 192.168.1.89 icmp_seq=3 Destination Host Unreachable
如果我尝试通过浏览器连接到 LAN 中运行的任何服务,我会得到以下信息: browser_unable_to_connect
这看起来非常类似于Ubuntu Wireguard 故障排除文档中提到的“需要目标地址”只是我不明白ping: sendmsg: Destination address required
。
我认为这是一个路由问题,因为如果我运行:
stenolepis@pop-os:~$ sudo ip route get 192.168.1.92
192.168.1.92 dev wlp1s0 src 192.168.1.89 uid 0
cache
它似乎没有路由到wireguard 接口,我不明白为什么。
显然,我所在的网络和我的家庭 LAN(均使用 192.168.1.x)存在子网冲突,但如果将wireguard设置为获取我的所有流量,我不明白为什么这会成为问题,更不明白为什么它也不会影响我的手机。
或者我在欺骗自己,因为我的网络调试技能有限。
其他故障排除:
ip a
wg0 up的结果:
stenolepis@pop-os:~$ 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: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:a2:c4:09 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 28:16:a8:51:52:82 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.70/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp1s0
valid_lft 84617sec preferred_lft 84617sec
inet6 2001:569:70d6:d700:568c:4fcf:4983:1bd5/64 scope global temporary dynamic
valid_lft 14682sec preferred_lft 14382sec
inet6 2001:569:70d6:d700:ecfe:8f0d:350f:414e/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 14682sec preferred_lft 14382sec
inet6 fe80::6bd3:60c3:353b:c5d0/64 scope link noprefixroute
valid_lft forever preferred_lft forever
14: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.140.235.3/24 scope global wg0
valid_lft forever preferred_lft forever
inet6 fd11:5ee:bad:c0de::3/64 scope global
valid_lft forever preferred_lft forever
答案1
这是你的核心问题:
我所在的网络和我的家庭 LAN(均使用 192.168.1.x)存在子网冲突
在某些平台上,例如 Android,如果您设置AllowedIPs
为所有内容(例如0.0.0.0/0
和/或::/0
),WireGuard 客户端将自动覆盖所有主机的路由,以将所有内容(除了其自己的加密数据包)路由到 WireGuard 接口之外。
但在 Linux 上,WireGuard 客户端脚本快速工作组AllowedIPs
当设置为所有内容时,会非常努力地避免覆盖除主机默认路由之外的所有路由。
如果您ip route show table main
在 Pop!_OS 平板电脑上运行,而该平板电脑在非家庭 LAN 上运行且 WireGuard 接口已打开,您将看到如下内容:
$ ip route show table main
default via 192.168.1.1 dev wlp1s0 proto dhcp src 192.168.1.70 metric 100
10.140.235.3/24 dev wg0 scope link
169.254.0.0/16 dev wlp1s0 scope link metric 1000
192.168.1.0/24 dev wlp1s0 proto kernel scope link src 192.168.1.70 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
主路由表中列出的所有路由(默认路由除外)将优先于 wg-quick 脚本设置的默认路由使用。因此,当您尝试连接到192.168.1.0/24
网络中的任何主机(例如位于 的 Pi)时192.168.1.92
,连接将从您的wlp1s0
接口路由到您所在的任何 LAN 的网关,而不是从您的 WireGuard 接口路由。
wg-quick 脚本将在自定义路由表中设置新的默认路由51820
:
$ ip route show table 51820
default dev wg0 scope link
wg-quick 脚本将设置一些策略路由规则来定义何时使用此自定义51820
路由表 - 使用它来覆盖主表中的默认路由:
$ ip rule list
0: from all lookup local
32764: from all lookup main suppress_prefixlength 0
32765: not from all fwmark 0xca6c lookup 51820
32766: from all lookup main
32767: from all lookup default
如果希望覆盖主路由表中的所有路由,而不仅仅是默认路由,则需要在wg0
接口启动时添加不同的策略路由规则:
$ sudo ip rule add not fwmark 51820 table 51820 priority 123
此规则指示系统51820
对所有内容使用自定义表 - 除非数据包标记已设置为51820
(0xca6c
十六进制)。 WireGuard 将在其发出的所有加密数据包上设置此数据包标记 - 这些数据包需要使用主路由表,以便将它们发送到 LAN 网关并转发到互联网。
wg0
您可以通过将以下 PreUp/PostDown 脚本添加到文件[Interface]
的部分,使 wg-quick 脚本在启动和关闭界面时自动添加和删除此规则:wg0.conf
PreUp = ip rule add not fwmark 51820 table 51820 priority 123
PostDown = ip rule del not fwmark 51820 table 51820 priority 123