4

我目前正在开发一个使用主从模型的 VPS 面板。一台主服务器运行一个用 PHP 编写的面板,并通过 SSH 管理多个从服务器。从服务器通过受限帐户访问,该帐户可以 sudo 执行特定的服务器管理相关命令,并且所有交互都记录在帐户本身无权访问的目录中。

我目前正在使用 PHP-SSH2,但是这种方法存在一些问题:

  • 退出代码不能可靠地返回,因此所有命令都必须在包装脚本中执行,该脚本将标准输出、标准错误和退出代码打包成 JSON 对象并通过标准输出返回。该脚本必须存在于每个从服务器上。
  • PHP-SSH2 库不知道“自定义连接超时”的概念,这意味着我必须在尝试使用 PHP-SSH2 连接之前使用 fsockopen 探测服务器 - 如果我不这样做,则可能无法访问服务器将页面加载延迟一分钟或更长时间。由于下一个问题,这更加糟糕。
  • 持久连接是不可能的。这会在面板中导致绝对荒谬的页面加载时间,尤其是结合上一个超时问题。

现在,我主要尝试解决最后一个问题。

我遇到过几种可能的解决方案,但它们都存在某种问题:

  • 使用 PHPSecLib,一个纯 PHP SSH 实现,并将所有 fsockopen 调用替换为 pfsockopen 调用。这将使连接持久化,但它比我想要的更hacker,并且PHP中持久套接字的安全含义尚不清楚。
  • 设置从主服务器到每个从服务器的持久 SSH 隧道,并在每个从服务器上运行一个简单的守护程序(绑定到 localhost),该守护程序运行它被告知的任何内容。这是一个问题,有两个原因。首先,它介绍了从属服务器上需要一个守护进程,这是我宁愿避免的。第二个问题是,如果有人要破坏从服务器上的受限帐户,他们仍然可以通过连接到“命令守护程序”来运行某些系统命令,即使他们无法从自己的 shell 访问这些命令。这是个问题。
  • 在代表面板管理与从属服务器的持久 SSH 连接的主服务器上运行一个守护进程。这将涉及用 Python 编写一个 SSH 客户端(这是我熟悉的唯一合适的语言),并且可能归结为使用 paramiko。由于 paramiko 的文档很差,这不是一个非常有吸引力的选择,甚至可能导致安全问题,因为我并不完全清楚paramiko应该如何使用这些东西。

以下不是一个选项:

  • 为面板本身切换到不同的语言。我正在用 PHP 编写面板,因为这是我最熟悉的语言,而且我知道我可能会遇到的怪癖和潜在问题。用我不熟悉的语言编写这样一个面向公众的重要项目将是一个坏主意。
  • 将 Twisted 用于第三个“可能的解决方案”。Twisted 是一个非常庞大且复杂的依赖项,文档似乎比 paramiko 的文档还要糟糕。
  • 在从属服务器上运行 HTTPd 或其他非 SSH 面向公众的守护进程。

在实践中,当必须联系多个服务器进行页面加载时,我看到有时超过一分钟的页面加载时间。这对于 VPS 面板来说显然是不可接受的。

我的目标是有某种实现来避免使用 PHP-SSH2 时引入的连接开销。以安全的方式做到这一点的最佳方法是什么,同时在从属服务器上引入最少的依赖关系?

4

2 回答 2

1

您可以使用 autossh,并使用 autossh 创建反向(前向)隧道。然后让您的 php 应用程序与那些反向 ssh 端口对话。如果 ssh 连接失败,autossh 将继续尝试重新创建连接。您的 php 应用程序将无法连接到反向隧道,甚至不会超时。

于 2013-01-23T13:33:22.563 回答
0

选项 3 怎么样,但也用 PHP 编写守护程序?这就是我在自己的类似项目中尝试的路线。

您可以使用 FIFO 文件而不是套接字与其通信。

于 2013-02-04T06:35:31.123 回答