Featured image of post Linker:P2P 异地组网与内网穿透工具

Linker:P2P 异地组网与内网穿透工具

家里宽带没公网 IP,公司服务器在几千里外,NAS 塞在朋友家柜子底层。你想连上去查看个日志,传统做法是 FRP 或者 VPN,配置麻烦,还得租一台中转服务器。

Linker 就是来解决这种问题的。它是一套 P2P 异地组网工具,支持内网穿透,代码开源,用 C# 写的。目前在 GitHub 上有 1.3k+ stars,253 个 fork。

它的核心思路很简单:能打洞就直接连,打不了再走服务器中继。

具体而言,Linker 支持 TCP 和 UDP 打洞,IPv4 和 IPv6 双栈。如果两个设备都有 IPv6 地址,直接点对点直连。如果有一边有公网 IPv4 配合 UPNP,也能直连。只有双方都在大内网、NAT 类型严格的情况下,才会回退到服务器中继。

这套混合架构的意义在于,日常使用中大部分流量是端对端的,不会经过第三方服务器,延迟最低,带宽不受限。只有在打洞失败时才需要服务器兜底,这才是合理的组网逻辑。

在隧道建立之后,Linker 提供三种通信方式。

第一种是异地组网。它在设备上创建虚拟网卡,自动分配虚拟 IP,支持点对点、点对网、网对网三种拓扑。你的设备就像接在同一个交换机下一样,可以直接 ping 通,直接 SSH,直接用 SMB 传文件。

第二种是端口转发。如果你不想整虚拟网卡,或者某些系统里装网卡驱动比较麻烦,可以用一对一端口映射。Linker 甚至支持单隧道多服务的端口转发状态管理,比传统方案更省资源。

第三种是 Socks5 代理。端口转发需要提前指定两端端口,而 Socks5 更灵活,直接代理所有端口的流量,实现类似于点对网的效果,配置成本更低。

除了这三种基础能力,Linker 还藏了一堆硬核功能。

比如 TCP over TCP 优化。TCP 隧道套 TCP 连接是业界常识性的坑,Linker 用 tun324 做了 TCP/IP 三层转四层代理,把这个问题解决掉了。

比如网段映射。多个家庭局域网都是 192.168.1.0/24,组网之后 IP 直接冲突。Linker 的网段映射可以把这些冲突网段翻译成不重叠的地址,让所有子网和平共处。

比如应用层 NAT 和应用层防火墙。如果目标设备没有 iptables 或者你懒得配置系统防火墙,Linker 内置的应用层 NAT 和防火墙可以直接接管,做到只允许 A 设备的某个 IP 访问 B 设备的 3389 端口,其它流量统统拒绝。

再比如远程唤醒。你公司的电脑关机了,不用找人去按电源键。Linker 支持 WOL 魔术包唤醒,甚至支持通过 USB COM 继电器和 USB HID 继电器触发开机。

还有 FEC 前向纠错和强优化 KCP。丢包严重的链路可以开启 FEC,用额外的带宽换稳定性。KCP 的优化版本则让端口转发和 Socks5 代理也能跑在 UDP 隧道上,享受 UDP 的低延迟和抗丢包能力。

甚至它还支持子网划分,可以把一个大虚拟网切成若干隔离的子网;支持局域网设备发现协议代理,像 mDNS、SSDP、LLMNR、NBNS 这些,让你的打印机、摄像头在虚拟组网后依然能被自动发现。

部署方面,Linker 几乎全平台覆盖:Windows、Linux、Android、Docker、OpenWrt、NAS、PVE、LXC、macOS。作者唯一没有支持 iOS 的原因是——他没有苹果手机,也没有开发者账号。这理由非常真实。

我自己试下来的感受是,Linker 不是那种凑功能数的 hobby project。它的打洞成功率比 ZeroTier 更直接,功能列表比 Tailscale 在某些方向上更深。对于有公网 IP 但不想折腾 WireGuard 配置的人来说,Linker 开箱即用的 Web UI 非常友好。对于完全没公网 IP 的,它的中继和打洞组合也基本够用。

如果你手里有多个设备分散在不同城市,或者需要在外网访问家里的 NAS、路由器和树莓派,Linker 值得放进你的备选方案里。

本文由 BOSH 的博客助手 HerMES 整理 🛠️

原文链接:https://github.com/snltty/linker

热爱生活 学无止境
使用 Hugo 构建
主题 StackJimmy 设计