用于内部修补转发端口的ssh交换机

nuttssh的Python项目详细描述


TOdo:切换到poetry(或flit)和pyproject.toml?已作为开始制作

有诗

nuttssh-基于ssh的虚拟隧道交换机服务器

nuttssh是一个基于python的小型ssh服务器,它在内部连接forwarded 不同ssh客户端之间的端口。它被设计成 连接到运行在nat后面的机器,让它们启动一个传出 ssh连接,然后通过反向ssh连接访问 机器。像这样使用时,nuttssh有点像一个非常轻量级的vpn。 服务器,

通常,nuttsh可以用于让ssh客户端请求打开 侦听端口,这将导致打开内部虚拟端口(否 服务器上的实际TCP端口已打开)。然后另一个ssh客户机可以请求 要连接到该侦听端口,请使用可配置的名称来标识 要连接到其端口的客户端。

这与使用带有端口转发的普通ssh服务器非常相似, 除了使用nuttssh时:

  • 服务器上没有打开实际的TCP端口。
  • 客户端不需要作为系统用户进行实际身份验证,nuttssh 处理自己的密钥身份验证。
  • 当多个客户端请求一个监听端口时,它们可以使用同一个端口 数字,因为它们的主机名将用于选择正确的主机名。这个 消除了确保每个侦听客户端选择唯一端口的需要 数量:
  • 连接到侦听端口时,主机名和常规端口号 (例如ssh为22)可以使用,而不必跟踪哪个 端口号映射到哪个客户端。

绕过正常ssh端口转发的缺点(特别是 最后两个),nuttssh被创建。它取代了中央服务器 允许使用普通的ssh客户端。

纳茨什仍然年轻,但应该已经可以使用。还有很多 有改进的余地,特别是在可配置性方面。

术语

  • (nuttssh)服务器:接受来自不同服务器的连接的中央服务器。 客户,并将他们连接在一起。

  • 侦听客户端:连接到nuttssh服务器并请求 监听端口。这是而不是所谓的"侦听器",以防止混淆 使用异步ssh中使用的sshlistener类。

  • 启动客户端或发起程序:连接到nuttssh服务器的客户端 并请求连接到正在侦听的客户端。

  • 电路:通过nuttssh在两个客户机之间建立虚拟连接 服务器。调用一个电路来消除与 客户机和Nuttssh服务器。

    注意,客户机通常是监听或启动的,但是 足够的权限,客户端也可以同时充当这两个角色。

上面的术语还没有在任何地方使用,在某些情况下 客户机称为从机,启动客户机称为主机(即将 从遥控器的原始用例中提取)。

安装/运行

运行nuttsh最简单的方法是使用pip安装它。例如:

pip3 install nuttsh

可选地添加--user以仅为用户安装(不包括 需要根目录),或者在激活的virtualenv中运行。

然后,运行nuttsh服务器:

python3 -m nuttsh

或者,您也可以克隆这个存储库,并运行python3-m nuttsh 从存储库的根目录,无需安装。

注意,这使用pip3python3来获得python3版本。如果这样 是系统上的默认值(或者您正在使用的virtualenv包含 python 3),您也可以只使用pippython

配置

目前,不支持任何配置文件或选项。有一些 nuttssh/server.py顶部的常量十上 任何接口,在2222端口上,并设置ssh\u主机密钥的名称 授权密钥文件。

ssh主机密钥

要允许启动nuttssh,必须存在ssh主机密钥。这应该是 放入当前目录中名为ssh\u host\u key的文件中。生成一个 使用openssh的ssh-keygen,运行:

ssh-keygen -t rsa -b 2048 -P "" -f ssh_host_key

这将生成一个2048位的rsa密钥,而无需密码短语。

访问控制

要控制对nuttsh服务器的访问,必须有一个授权密钥文件 现在(没有它,纳茨将拒绝开始)。此文件使用相同的 格式化为openssh的授权密钥文件。每行必须包含一个 公钥(从id_rsa.pub文件复制)。在公众面前 键,可添加选项。

例如,一个文件可能如下所示(示例中键被截断):

access="listen" ssh-rsa AAAAB3NzaC1yc2EAAAADAJnmVYPYe94v user@host
access="listen",access="initiate",from="192.168.1.0/24" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA+ user@host

这包括一个逗号分隔的选项列表、一个keytype、实际的key 还有评论。

目前,支持以下选项:

  • 访问以指定客户端的权限。支持的值是 侦听(允许打开侦听端口)和初始化(允许 连接到监听端口)。此选项可以指定多次, 给予一种以上的许可。

  • 限制到特定主机的连接。值是 以逗号分隔的模式列表。每个模式都可以是全局模式(使用 *,例如,"*.mydomain.tld")与地址和 主机名,或CIDR样式的地址和掩码(例如"192.168.1.0/24")。一 如果连接至少与 名单。可以多次指定此选项,在这种情况下 连接必须分别与每个from选项匹配(一个元素)。

    有关此选项的详细信息,请参见openssh授权密钥手册页。

  • 主机名别名允许配置可用于 连接到此客户端。详情见下文。

注意,当客户机有多个密钥时,客户机提供的第一个密钥 使用授权密钥文件中的 同时提供并拥有更多权限或其他选项。

从属主机名和别名

每个连接的客户端都有一个主机名和一个可选的别名列表。这个 主机名在不同的地方被用来指代客户机,而 主机名和别名可用于选择要连接的侦听客户端 到

默认情况下,客户端指定的用户名用作其主机名(这 看起来有点像黑客,但似乎是最干净的方法)。使用 主机名选项在授权密钥中,此主机名可以被 给定连接。使用alias选项,其他别名可以是 指定(必须为多个别名多次指定该选项)。

当多个侦听客户端各自声明相同的名称(主机名或别名)时, 将使用该名称访问最后一个要连接的客户端。到达另一个 客户端,可以向主机名添加索引。例如,当两个倾听的客户 两者都使用test作为主机名,您可以使用 测试(或测试~0)和使用测试~1的旧测试

连接监听客户端

到nuttssh服务器的连接使用普通的ssh协议,因此可以使用 常规ssh客户端。要打开监听端口,正常的端口转发 可以使用选项。例如:

ssh myhost@nuttsh.example.org -p 2222 -R 22:localhost:22 -N

它连接到nuttsh服务器,该服务器运行在2222端口的nuttsh.example.org上。 我们的主机名(myhost)作为用户名传递。没有外壳或其他远程 命令运行(-n),但nuttssh服务器中打开(虚拟)端口22。 该端口上的任何传入电路都通过ssh连接转发,并且 连接到localhost:22(换句话说,我们的本地端口22通过 胡说)。

通常情况下,您希望监听客户端持续连接(并且 错误时重新连接)。这很容易使用autossh,只需将ssh替换为 自动刷新,这将处理自动连接。

默认情况下,autossh使用附加端口转发来测试连接,这 不要使用nuttssh,因此应该禁用这些选项,以便让ssh 它本身也很活泼。另外,在无人值守的情况下运行时,autossh应该是 被告知即使在出现启动错误时也要继续重试。

待办事项:systemd/sh/dropbear/etc.

更改端口号

上面的例子都假设监听客户机请求监听 端口22并将任何输入电路转发到localhost:22,这可能是 常见的情况。但是,也可以转发到不同的本地 使用-r选项指定主机或端口。

例如:

ssh myhost@nuttsh.example.org -p 2222 -R 80:localhost:8080 -N

这将请求nuttssh服务器上的虚拟端口80并连接任何传入的 到本地主机上8080端口的电路。注意,这对于 初始化的客户机,因为它们只需要指定主机名 (myhost)和虚拟监听端口(80)。

连接启动客户端

启动客户机也使用普通的ssh协议,并且可以使用普通的ssh 客户端。例如,从 上一个示例,使用通过nuttssh服务器的电路:

ssh -J nuttsh.example.org:2222 myhost

这指示ssh首先连接到nuttssh.example.org,端口2222和 然后在这个连接中,让nuttssh服务器设置一个电路 (隧道连接)到myhost,端口22(未显式指定)。这个 然后,nuttsh服务器将主机名和端口组合与 先前连接的侦听客户端和电路被路由到该客户端。 最后,监听客户端通过本地连接完成电路 根据localhost:22部分在其-r 选项. < /P>

这将使用ssh-j选项,使用nuttssh作为跳转主机。这个 便于通过电路路由ssh连接,但不起作用 其他类型的连接。幸运的是,ssh允许使用其他方式设置 这些电路连接也是。

注意,这将建立两个ssh连接,一个到nuttsh服务器,一个到 倾听的客户。这也意味着身份验证必须发生两次。

通过电路转发本地端口

您还可以要求ssh打开本地侦听端口,并为 该端口上的每个传入连接。例如:

ssh -L 22:myhost:22 nuttsh.example.org -p 2222 -N

在本地打开端口22,并通过电路将任何连接转发到 端口22打开myhost。再次指定-n以防止尝试执行 远程外壳或命令。

注意,这样可以创建多个电路,每个电路 通过同一个ssh连接路由到nuttssh服务器。

通过电路转发stdin/stdout

ssh还可以将stdin和stdout流上的数据转发到电路中。为了 例子:

ssh -W myhost:22 nuttsh.example.org -p 2222

这将打开端口22上的myhost电路,并将其连接到stdin和 本地ssh客户端的stdout。-n选项由-w隐含,同样 需要单独指定。

通过电路路由SOCKS代理请求

ssh支持公开socks代理。此代理完全在 本地ssh客户端,并允许(本地)程序,例如电子浏览器,至 通过代理路由他们的所有流量。在这种情况下,这意味着 将通过电路进行连接(因此可以连接到 所有正在收听的主机,但不包括其他主机)。

要设置此设置,请运行:

pip3 install nuttsh
0

这指示ssh在本地端口3128上打开socks代理端口,它可以 然后被其他程序使用。

注意,此设置要求客户端支持socks v5和do name 通过代理解析(例如firefox在使用socks时有一个"代理dns V5"光电管)。没有这个(和socks v4),名称是本地的 已解决(将失败),并且只有生成的IP地址包含在 代理请求。

使用ssh配置文件

上面提到的所有ssh选项(除了看起来的-n之外)也可以是 通过ssh配置文件选项配置,因此可以定义一些 通过将主机名传递给ssh来预设和应用它们。请参见ssh配置 手册页了解更多信息。

贡献

这是一个开放的项目,欢迎大家的贡献。对于错误报告, 功能建议和问题,请使用github问题跟踪器。到 提供修补程序,使用github pull请求。

当贡献补丁时,确保提供高质量的贡献。在 特别是,代码样式应该一致,提交应该干净 每个提交和提交消息都应该用一个逻辑更改分隔 清楚。换句话说,确保代码和提交历史记录易于阅读 并回顾。另外,请明确声明 麻省理工学院许可证下提供的修补程序。

要检查代码的编码样式,请使用flake8工具。作为一个 为方便起见,提供了一个makefile文件,允许运行make check 所有支票(目前只有第8张)。在任何 承诺,所以一定要定期运行。若要修复导入排序错误,请运行 进行排序

许可证(也是setup.py)

纳茨什是由马蒂耶斯库伊曼写的。它的来源,以及 此存储库中提供了随附文档和其他文件 在麻省理工学院的执照下。有关完整的许可证文本,请参见许可证文件。

关于nuttssh

nuttssh最初是为meetjestad创建的! 项目,为Lora网关扩展提供轻量级远程控制 在整个城市的不同互联网连接(通常不公开 由于NAT而可访问)。在使用反向ssh进行了一些初步实验之后 连接和ssh通道多路复用(工作正常,但导致脆弱 代码),实现了当前使用端口转发的方法。为此, 一些灵感来自 ssh代理也使用远程端口 转发(但使用密钥指纹识别客户端,可能 早于ssh"跳转主机"功能)。

因为nuttssh的工作方式看起来有点像电话交换机 Nuttssh多年前就开始工作了,它是以Emma&Stella Nutt命名的,而Emma&Stella Nutt 前两位女性电话总机接线员。"电路"的名字是 也取自电话术语。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何创建一个透明的Android应用程序,它将占据整个屏幕(位于状态/导航栏上方)?   Spark Java编码器。bean无法转换为Scala定义的类   java无法在可执行jar中加载资源   java如何避免Checkstyle的FinalClass模块在存在从基继承的内部类时抱怨?   文件Netbeans java小程序项目屏幕弹出   java解析增量特性的增量不会超过值1   java从另一个类创建一个对话框,该类在Android中有自己的线程   java如何在绘制线条时向JPanel添加背景网格?   方法来确定路径字符串是本地计算机还是Java的远程计算机   批处理文件在java中如何在执行命令之前设置目录   需要关于Java8流逻辑的帮助吗   java Guice注入和请求工厂:扩展ServiceLayerCorator