Wireguard - LAN 计算机无法执行 ping 操作(目标主机无法访问),但 DNS 流量到达 LAN PiHole/Unbound

Wireguard - LAN 计算机无法执行 ping 操作(目标主机无法访问),但 DNS 流量到达 LAN PiHole/Unbound

概括:

LAN 地址解析适用于某些wireguard 客户端(我的andorid 手机),但不适用于其他客户端(我的linux 笔记本电脑)。

细节:

我在我的家庭网络中的两个不同的 Pi(主树莓派和故障转移 - 在不同的端口上运行)上运行wireguard。

我使用 PiVPN 设置两个客户端。使用 PiVPN 的选项,连接我的手机几乎是自动的-qr(我只需将 DNS 更改为我的 PiHole)。从表面上看,这不仅仅是我在.conf文件中犯了一些基本错误,我也只是盲目的。

每个wireguard服务器有两个客户端:

  1. 我的安卓手机
  2. 我的 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/0AllowedIPs = 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 awg0 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对所有内容使用自定义表 - 除非数据包标记已设置为518200xca6c十六进制)。 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

相关内容