云或 Web 服务器上的原始 TCP 侦听套接字

Posted

技术标签:

【中文标题】云或 Web 服务器上的原始 TCP 侦听套接字【英文标题】:Raw TCP Listen Socket on Cloud or Web Server 【发布时间】:2015-01-20 12:46:15 【问题描述】:

我有硬件可以连接到任何给定 IP 和端口组合上的原始 TCP 套接字。然后它不断地发送字符。下面这段 Python 代码可能会让您了解硬件的作用。

import socket

serverIP = '*server IP or domain*'
serverPort = 60000

Sock = socket(AF_INET, SOCK_STREAM)
Sock.connect((serverIP, serverPort))
while (1):
f = open ("send-data.txt","r")
while 1:
    c = f.readline()
    if not c:
        break
Sock.send(c + '\n')

Sock.shutdown(0)
Sock.close()

运行此代码时,它的行为与我的硬件系统完全一样。 send-data.txt 文件包含类似于硬件发送的字符。

我使用SocketServer 库在 Python 中编写了一个套接字服务器。它允许连接、接收字符流并将其存储到本地(新创建的)文件中。目前,我在我的系统上运行此代码,作为localhost,它可以工作。我想通过网页提供这些文件。

我希望能够在远程服务器上做同样的事情。如您所见,我的硬件限制我只能使用原始 TCP 套接字。据我了解,我需要对 IaaS 等服务器机器进行低级访问。我试过pythonanywhere,但我猜他们不允许简单的python套接字。 Heroku 还要求您编写一个 Web 应用程序,我不知道该怎么做,也不知道它是否适用于我的硬件。

那里的托管/云解决方案可以充当上述套接字服务器,也可以充当 HTTP 服务器,稍后将为这些文件和网页提供服务。

【问题讨论】:

如果您建议的服务器可以运行我已经编写好的 Python Socket 服务器,那将是理想的。 PythonAnywhere dev 这里只是为了确认 OP 是正确的,我们不支持任意套接字服务器。 (还没有?) 【参考方案1】:

如果我正确理解您的问题,您想知道哪种经济实惠的托管解决方案可以让您通过任意 TCP 套接字进行通信。

答案很简单:几乎任何 VPS(虚拟专用服务器)公司或 IaaS 提供商。由于您使用 Amazon-EC2 标记了您的问题,是的,他们也这样做了,但是让您的第一个实例运行和配置安全组(阅读:防火墙规则,位于您的 VM 之外)的学习曲线相当陡峭。也就是说,您确实有一年的所谓“免费套餐”,这使您可以免费试用他们的大部分服务。

其他提供商可能更合适。 (我不确定是否允许在此处推荐提供商,但您可以例如查看 Linode 或 Rackspace Cloud;它们提供的灵活性远低于 EC2,但入门要容易得多。)

与任何 IaaS 选项一样,了解 Linux、网络和一些安全基础知识(至少)将是有益的,因为您将全权负责您创建的东西。

谈论安全......

如果您发布的那段代码具有类似的基本接收端,那么一旦公开,您就会遇到麻烦,因为通信是以纯文本 [*] 进行的,而且看起来并不要求任何类型的身份验证。任何人都可能 telnet 到接收端并只注入一些文本行?

(这就是为什么相当理智的 PaaS 提供商通常不允许您通过任意端口和套接字进行通信的原因 :-))

[*] 我猜是因为你使用 readline。如果涉及任何加密,您可能会以字节块的形式进行写入/读取。

【讨论】:

感谢您的回答。试用 EC2 似乎是一个有吸引力的选择,但我对此了解不多。我可以将它配置为任何 linux-ubuntu 服务器吗?至少,我需要一个稳定的 IP 地址和打开端口的权限。 关于安全性:正如我提到的,实际数据(字符流)将由嵌入式硬件模块发送,因此没有加密。我的套接字服务器与每个请求者建立单独的连接。您确定任何人都可以通过 telnet 将文本添加到我已经建立的连接中吗?此外,发送的数据是公开的,因此任何人都可以点击并收听。 @Ics 是的,您可以使用 EC2 实例在其上运行 Ubuntu。只要实例正在运行,IP 就会保持分配状态。他们对您如何使用他们的基础设施几乎没有限制。默认情况下,安全组被锁定,但您可以根据自己的喜好轻松打开它们。话虽这么说,如果您有客户端的静态 IP 地址,那么这些安全组可以派上用场来处理我提到的安全问题(当然是疯狂的猜测,源自代码 sn-p :)) 感谢您的帮助!!!在您的回答中,您说 EC2 的学习曲线对于配置安全组来说非常陡峭。这与 Linode 有何不同? AWS 如何将任何实例的私有 IP 映射到公共 IP?我无法承受定期更改公共 IP 的费用,因为我必须将其硬编码到我的硬件中。此外,要使任意端口可访问,是否需要端口转发?我目前正在寻找最简单/最快的解决方案。 @Ics 不客气! (不要忘记将此标记为答案,如果您认为它有资格作为答案:))您可以拥有所谓的弹性 IP,它们是静态 IP,使您的实例可以从该 IP 下的外部访问。无需端口转发。此外,它们不需要任何成本,除非您实际上没有将它们与实例相关联。 Linode 对于初学者来说更容易使用,他们不打算通过像亚马逊这样的庞大 API 来自动化整个基础设施设置。只需单击几下,您就可以开始了。他们不提供免费套餐,但物有所值。

以上是关于云或 Web 服务器上的原始 TCP 侦听套接字的主要内容,如果未能解决你的问题,请参考以下文章

rust实践 - 使用tcp链接监听web请求,进行http解析

侦听两个不同端口的 TCP 服务器

如何在 tcp 套接字侦听器中唯一标识套接字 id

侦听两个不同套接字接口的服务器程序

原始套接字

Http