前言

文件传输是一个很基础且被广泛应用的需求,传统工具都不太适合给陌生人或匿名传输文件,因为它们普遍求身份认证。向服务器传输文件,我们需要 SSH 登录信息。向普通用户传输文件,我们得是对方的 IM 好友,而且通常有大小限制。

如果有一种文件传输模式,像某些远程桌面软件那样输入口令便建立传输通道,那就太方便了。本文介绍的 Wormhole(全程 Magic-Wormhole)就是这样一个工具。它可以免除身份认证,甚至匿名的发送和接收文件。

本文将告诉你如何使用 Wormhole,以及它的基本原理。这是一篇新手向教程。内容十分简单!

效果

我想有必要展示一下效果,让读者提前知道其便捷程度。在我的电脑上,使用命令发送一个文件:

$ wormhole send ./鸽鸽跳舞.mp4

Sending 14.3 MB file named '鸽鸽跳舞.mp4'

Wormhole code is: 6-ultimate-snowslide

On the other computer, please run:

wormhole receive 6-ultimate-snowslide

Wormhole 最后输出了一条接收命令,我复制它并发给他人让其执行:

$ wormhole receive 6-ultimate-snowslide

Receiving file (14.3 MB) into: '鸽鸽跳舞.mp4'

ok? (Y/n):

Receiving (->relay:tcp:transit.magic-wormhole.io:4001)..

100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 14.3M/14.3M [00:03<00:00, 4.27MB/s]

Received file written to 鸽鸽跳舞.mp4

这里我们使用 wormhole send ./鸽鸽跳舞.mp4 命令发送了一段 cxk 跳舞的视频,对面是一位 ikun,他兴奋的使用 wormhole receive 6-ultimate-snowslide 命令接收到了。

这个过程中不存在身份认证,即没有登录(如 IM 软件)或密钥交互(如 SSH)。

首先是 wormhole send 命令生成了一个以数字和单词组成的的“虫洞代码”(6-ultimate-snowslide)。然后用 wormhole receive 命令加上代码接收到发送者的文件。这便是传输的基本逻辑。

我们不用在意接收方,甚至不用在意发送方。假设你的服务器太多,用这种方式传输文件十分方便。或者你给陌生人传输文件,丢个码即可。

你也许不喜欢命令行,没关系,后文会介绍一种兼容 Wormhole 的图形客户端软件。

优势

除了建立传输关系更加便捷,Wormhole 还是即时传输的模式。也就是发送者发了多少,接收者就收到多少。不像 IM 或网盘,需要先保存到他们的服务器,然后对方再去下载。

当然,这种模式并不是万能药。它确实显得更即时了,但也加大了风险(因为同时考验发送/接收双方的网络稳定性)。所以传输特别大的文件的话,还是网盘更可靠一些。

安装

如果你使用的是 Linux 操作系统,参考此处的列表。存在的发行版,直接用包管理安装即可。如果你的发行版软件源没有这个软件包,或者你嫌弃它(的版本)太老了。也可以使用 snap 安装:

sudo snap install wormhole

Snap 是一个容器环境,可以让不同的发行版共用同一个仓库中的软件而不会出现兼容问题。如果你不喜欢 Snap 那通常只能选择本地安装了。

这里还有一些整理好的其它类型客户端的下载地址:

Wormhole 下载 Wormhole Android 客户端(Google Play) Wormhole Android 客户端(F-Droid) 图形客户端:Warp(Flathub) 图形客户端:Warp(Windows)

使用

如同效果中的例子,发送就是 send 子命令,接收就是 receive 子命令。接收命令执行后,会提醒你确认是否是要接收的文件,如果是直接回车就开始传输了。

批量发送

如果你指定的发送路径的是一个文件夹,那么 Wormhole 会将整个文件夹打包发送。当然接收方不用在意解压,因为 Wormhole 会自动做这一步。

无公网

在 Wormhole 的架构中,传输码是由 Wormhole 的中心服务器生成和维护的。所以发送/接收双方才可以在不知晓彼此的情况下建立连接。

也就是说发送者和接受者并不能在无公网的环境下使用,但如果你自行部署服务端则可以(具体原因参考下文的解释原理)。

原理

Wormhole 需要两个不同角色的服务器:一个用于传输码管理以及客户端之间的通信/协商,被称作邮箱服务器。一个负责中继传输客户端之间的流量,被称作中继服务器。

无论客户端之间否能直连,都需要跟邮箱服务器通信。经过邮箱服务器协商以后,如果客户端之间可以直连,便会直连传输文件。如果不能直连,就会使用中继服务器传输。其关系图如下:

sequenceDiagram

participant S as 发送者

participant M as 邮箱服务器

participant R as 接收者

participant RS as 中继服务器

S->>M: 协商

R->>M: 协商

M-->>S: 返回协商结果

M-->>R: 返回协商结果

alt 可以直接连接

S->>R: 直接传输文件

else 不能直接连接

S->>RS: 发送文件

RS->>R: 转发文件

end

Wormhole 顾名思义就是「虫洞」,无论双方能否直连,它都将尝试建立一个直接路径或间接的隧道用于传输。并且即使通过中继服务器,传输也是免费的。

一般在服务器之间或具有 IPv6 网络的设备之间,或内网设备之间,都会优先直连传输。

GUI 客户端

Warp 是 PC 上最值得推荐的 GUI 客户端,它由 Gnome 团队开发,但不依赖 Gnome 桌面。从安装章节访问下载地址,若是 Linux 也可以从发行版自己的软件源中检索,Windows 则从 GitLab 的发布页面找资源包下载。

它的界面简约美观:

匿名发送/接收

Wormhole 支持利用 Tor 网络匿名发送和或接收。在使用前要打开 Tor 浏览器,并连接上 Tor 网络。像这样:

wormhole send --tor ./鸽鸽跳舞.mp4

接收时也可以利用 Tor 保护自己:

wormhole receive --tor

如果双方都使用 Tor 网络传输,那么发送方和接收方就不可能知道彼此是谁(即和哪个设备 IP 通信)。这在某些情况下是有意义的,但传输速度可能会很慢。

部署服务端

邮箱服务端

中继服务端

如果你想把 Wormhole 应用于公司内部,可以选择自己部署服务端。这样做可以提高安全性,甚至可以无节制的使用而不用担心占用公共资源。部署以后,需要修改 Wormhole 或 Warp 的配置中的两个地址,对应自己的部署的服务端访问地址。

注意:接收方必须和发送方使用同一个邮箱服务器地址,否则他们无法建立联系。

结束语

这就是 Wormhole 的入门使用教程和基本介绍了。我认为这个工具无论是普通网民还是 IT 从业者,都有相当高的实用价值,值得推荐。