Wireguard下KDE-Connect的使用问题

背景

KDE-Connect是一款很好用的局域网文件传输解决方案软件,支持剪切板同步以及基于SFTP的文件传输功能,其插件拓展还实现了诸如媒体控制,鼠标键盘远程操作,通知同步等能力,可以说非常香。

如何通过wireguard让其在远程可用呢?一般来说,通过wireguard一键回家理论上应该和局域网中使用无异,但是怪就怪在当我在移动数据下使用wireguard一键回家后,KDE-Connect无论是手机端还是电脑端都检测不到对方的存在了。我在网上也搜罗了各类方法,但是都不能解决我的问题,也有相关网友为此困惑不已。首先先上网络拓扑。

1
2
3
4
5
6
7
8
9
   Lan 192.168.100.56
+------+
| PC |
+---+--+ WG 10.0.0.1
| Lan 192.168.100.233 WG 10.0.0.2
+-----------+-+ +----------------+ wg隧道 +------------+
| 网关路由 +------| 软路由 |==============| 移动设备 |
+-------------+ +----------------+ +------------+

目前的拓扑在正常情况下回家正常,可以排除因为wireguard配置不正确导致的异常。

过程

既然没有现成的解决方案,那就自己动手来创造。首先我先想到的是KDE-Connect基于UDP包的局域网发现机制,我想会不会是因为wireguard配置上没有正确路由相关的包导致的呢?我发现KDE-Connect在手机端上可以指定主机IP,但是在重新设置完成后依然无法探查到主机。干脆抓包看看。

抓包

根据官方Wiki所讲,KDE-Connect的活动端口为1714-1764。从图中可以看到,PC主机首先是接收到一个来自于软路由的UDP包,分析其数据可以发现其携带有KDE-Connect探查信息且目标端口为主机的1716号端口,随后,主机主动向软路由的1716号端口发起连接请求,但是因为软路由并没有对相关端口连接建立SNAT,因此,最后报错:port unreachable,连接建立失败。

这个时候我才意识到KDE-Connect不是由移动端主动发起连接请求的(如果是移动端主动发起,那么SNAT就会被正确建立,自然没有转发的问题)。此外,令我感到困惑的是为什么wireguard的本地出口包会自动被做SNAT?正常情况下,局域网环境应该能看到其wireguard网段的IP才对(路由表已经被正确创建),经过反复排查,我突然意识到当初在配置软路由的时候为了网络能够正常访问,在自定义规则中加入了一条iptables -t nat -I POSTROUTING -j MASQUERADE(详情请见原因),这就导致了所有的出包都被做了SNAT。

解决

解决方法有很多,比如排除特定来源IP的包,但是这样可能会导致无法访问外网(类似于内网内的其他机器在没有做SNAT时无法联网的情景);还可以将PC主机连入wirguard网络,使其可以直接用IP连接。