跳转到主要内容

在本地通过虫洞向前提供双向流数据,通过安全且持久的膨胀虫洞连接。易于设置的加密通信。

项目描述

Fowl Logo: a chicken head with two blue ethernet cables

从一台计算机安全地获取到另一台计算机的TCP流。

(以下基本协议基于 Magic Wormhole,提供了一个强大的无账户、点对点网络解决方案 - fowl 帮助您立即使用现有程序利用这种力量)

🤔 为什么?

我们有时会结对编程,但不喜欢通过第三方服务器发送按键的想法。我们还喜欢避免“在公共IP地址上设置服务器”的额外工作。

更多背景信息,请参阅我的博客文章: 通过Magic Wormhole转发流巫师花园愿景

为了稍微概括一下:有许多客户端/服务器程序 _可以_ 自托管 - fowl 让我们以点对点的方式使用这些类型的程序。这意味着只依赖一个通用、具有公共IP的服务器(用于设置连接的Magic Wormhole“邮箱服务器”)。

🦃 什么是?

命令行工具 fowl 允许您通过 Magic Wormhole 使用任何客户端/服务器程序。Magic Wormhole提供了一个 持久、强加密的会话(端到端),无需预先共享密钥。

从概念上来说,这与组合ssh -Rssh -L有些相似。fowl可用于在参与者之间直接设置复杂的流程,整合那些“传统上”需要在公共IP地址上的服务器提供的服务。

主要功能

  • 无需预先交换密钥

  • 简单、一次性使用的代码,易于转录

  • 安全(通过SPAKE2的全强度密钥)

  • 端到端加密(且没有未加密的应用数据泄露的可能)

  • 可与任何可以监听或连接到localhost的工具集成

这允许作者用任何语言编写一个“胶水”程序,将未变更的网络程序连接起来。通信通道是

  • 无需预先共享密钥;

  • 完全加密的;;

  • 并且能够在IP地址变化或故障时存活。

所有这些都不需要在应用级别采取行动,它只是一个正常的localhost TCP(或UNIX)流式套接字。

✍ 动机示例

当使用tty-share进行结对编程时,一个方便的选项是使用默认的公共服务器。然而,我不喜欢将按键操作发送到我不运行的第三方服务器上的想法。(请注意:我没有任何理由相信这个特定的人会做任何恶意的事情!)

我可以自己启动这样的服务器并和我的朋友们一起使用它...

...但是使用fowl,一方可以运行localhost tty-share服务器,而另一方可以运行一个连接到localhost端点的tty-share客户端——数据通过虫洞连接(仅此一条路径)流动。

主要优势无需将按键暴露给第三方服务器

附加优势无需在公共IP地址上设置服务器

🐃 为什么这个特别的牦牛要被剪毛?

我想用Haskell编写一个结对编程应用程序,但不想在Magic Wormhole Haskell库中实现Dilation(也许有一天会!)

我还想到,其他人可能喜欢在缺乏Magic Wormhole实现的语言(即大多数语言)中实验Magic Wormhole(以及像Dilation这样的高级功能)

因此,“编写Haskell结对编程工具”的第一步变成了“编写并发布一个Python程序” :)

(p.s. 更高层次的Yak现在可以在sr.ht上找到,但尚未“发布”)

⌨ 它是如何工作的?

fowl使用Dilation协议的功能。

这意味着使用Magic Wormhole Mailbox服务器通过一个短(但仅一次)的配对代码执行SPAKE2交换。关于安全论证的详细信息,请参阅Magic Wormhole文档。之后,在两台计算机之间建立端到端加密的直接P2P连接(在某些情况下通过“中转中继”服务),即创建虫洞代码的计算机和消耗它的计算机之间。

连接上加密消息的密钥只被两台计算机所知;Mailbox服务器无法看到任何消息内容。(它,就像任何攻击者一样,可以尝试猜测一次虫洞代码)。有关更多详细信息,请参阅Magic Wormhole文档

“Dilation”功能进一步扩展了上述协议,以提供子通道和“持久性”——这意味着整体连接能够应对网络变化、断开连接等情况。您可以在更改WiFi网络或将一台计算机休眠时仍然保持连接。

“fowl”增加的功能是在两端设置任意数量的本地监听器,通过子通道转发数据。始终存在的“控制”子通道用于协调打开和关闭此类监听器。

通过一些高级协调,“fowl”可以用于在参与者之间设置复杂的流程,整合那些“传统上”需要在公网IP地址上的服务器上的服务。

另一种看待它的方式:流式网络服务可以在不查找、链接和使用Magic Wormhole库(以及隐含的代码更改)的情况下集成Magic Wormhole协议——所有集成都是通过本地流进行的。(有一些语言实现了这些功能,如果您愿意,可以走这条路)。

👤谁应该使用这个?

我们处理并期望这个程序有两个主要的使用场景:集成者和最终用户。

人类CLI用户可以使用“fowl”本身来设置和使用连接,用于任何目的。

对于进行集成的开发者,“fowld”提供了一个简单的基于协议的方式供任何运行时使用。也就是说,一些“胶水”代码以子进程的方式运行“fowld”。这个程序还将协调运行客户端类型或服务器类型的网络应用程序,这些应用程序对用户有实际帮助。例如,“结对编程”(以我的情况为例)。

一些其他想法来让您开始

  • “私人”/仅邀请流式传输(一边运行视频源,受邀方看到它)

  • 按需技术支持或服务器访问(例如,设置有限时间的SSH、VNC等)

💼安装和基本使用

“fowl”和“fowld”是使用Twisted异步网络库的Python程序。

您可以使用

pip

安装它们。

pip install fowl

完成此操作后,“fowl”和“fowld”将出现在您的路径上。运行任意一个以获取使用说明。

根据最佳实践,我们建议使用virtualenv安装所有Python程序。永远不要使用sudo pip。例如,在您的fowl检出的virtualenv中创建virtualenv

python -m venv venv
./venv/bin/pip install --upgrade pip
./venv/bin/pip install fowl
# or: ./venv/bin/pip install --editable .
./venv/bin/fowl

💬Hello World:聊天!

如今网络应用程序的“hello world”实际上是聊天,对吧?😉

我们将使用两个古老的网络工具(nc和telnet)来实现一个简单、安全且端到端加密的聊天。

是的,这是正确的:我们将在telnet上实现安全的聊天。第一个见解是我们可以让nc监听localhost-only端口,我们也可以让telnet连接到localhost TCP端口。

最初我们可以从一台终端到另一台终端本地证明这个概念。打开两个终端。在第一个终端中运行:nc -l localhost 8888 这告诉nc(又称“net cat”)在localhost TCP端口“8888”上监听(它将回显所有传入的内容,并发送您输入的内容)。

在第二个终端中:telnet localhost 8888 这指示telnet连接到localhost TCP端口8888——即第一个终端中运行的netcat实例。在任一终端中输入“hello world”,您应该会在另一端看到它。

目标实现!部分实现。我们通过nc和telnet实现了“聊天”。它可能不太美观,但效果不错。

然而,我们想要与其他机器交谈。这意味着我们需要:*加密;*以及安排网络连接的方式。

这些额外功能正是“fowl”提供给我们的。

因此,我们仍然运行完全相同的 nctelnet 命令,但在每台机器上首先执行一些 fowl 魔法。

第二台 机器(运行 telnet 的机器)上,我们需要添加一个监听 8888 端口的程序。这个程序是: fowl --listen 8888 invite 当连接到公共邮箱服务器时,它会打印出类似 1-foo-bar<secret code>

接下来,我们希望将此监听器获取的所有信息神奇地转发到第一台机器(运行 nc 的机器)。因此,在它上面我们运行: fowl --allow-connect 8888 accept <secret code>。这个 <secret code> 来自上面的“邀请”,通常通过一个人或两个人传递给第二台机器。

请注意,如果我们交换“邀请”和“接受”的顺序,对某个人来说可能更方便。

在幕后发生的事情是,两个 fowl 程序通过公共邮箱服务器建立了一个安全连接。然后,它们使用这个连接来维护一个持久的(可能变化的)TCP连接,彼此之间(最坏的情况是使用公共中转中继)发送端到端加密的消息。

fowl 使用这个连接通过一个简单的协议进行通信,该协议可以在任一端建立监听器或请求新的连接。这些结果产生“子通道”(在魔法虫洞扩展协议中),可以发送或接收字节。

连接任一端的任何接收到的字节都简单地通过子通道转发。

完整示例,计算机一

$ nc -l localhost 8888
$ fowl --allow-connect 8888 invite
Invite code: 1-foo-bar

计算机二

$ fowl --listen 8888 accept 1-foo-bar
$ telnet localhost 8888

现在我们有加密聊天.

这两个程序可以在 互联网上的任何地方 运行。就像 TCP 承诺的那样,所有字节都按顺序交付。此外,它们是 加密 的。此外,流将 在网络变化的情况下(断开连接、新的 IP 地址等)生存;也就是说,实际的计算机间 TCP 连接被重新建立,但对应用程序(nctelnet)来说,它看起来是连续的。

📦 其他平台

我们欢迎有其他打包安装方法经验的贡献者;请联系我们!

🚚 稳定性和发布

这是一个早期发布,基本上是一个概念证明。虽然我们打算将其作为一个稳定的平台,在上面放置协调软件,但它还没有达到那里。API 可能会更改,选项也可能更改。如果您正在 fowl 之上开发,请与我们联系,以便我们知道您需要什么 😊

所有发布都在 PyPI 上,版本号遵循 CalVer 变体:年.月.编号,例如 23.4.0(2023 年 4 月的第一个发布)。

请参阅 NEWS.rst 获取特定发布信息。

🧙 贡献者

  • meejah:主要开发

  • balejk:早期反馈、校对、审查和测试

项目详情


下载文件

下载您平台对应的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

fowl-24.3.2.tar.gz (160.6 kB 查看哈希值)

上传于

构建分发

fowl-24.3.2-py3-none-any.whl (44.8 kB 查看哈希值)

上传于 Python 3

由支持