我如何能够远程登录到 HTTP 端口 80?

我如何能够远程登录到 HTTP 端口 80?

在谷歌搜索后,我发现我们可以telnet将网络服务器连接到其http端口并用于GET检索html页面。

例如:

$ telnet web-server-name 80

但我无法理解这怎么可能?

我想如果80端口用于http服务器,那么80端口只会监听http请求。但我怎样才能telnet到达HTTP港口呢?

不是telnet两个HTTP不同的协议吗?

答案1

恭喜,您刚刚通过认识到端口和协议并不直接相互连接而深入研究了网络层的概念。正如其他人所说,telnet 可用于连接到任何 TCP 端口。然而,要理解为什么这是可能的,您需要了解一些有关网络层的知识。如果您听说过OSI 7 层模型这允许您使用 telnet 连接到另一个端口。虽然在互联网上,他们只关心其中的 4 层,它被称为互联网协议套件。如果没有网络层,每个程序不仅需要了解自己的协议,而且还必须定义自己的 IP 寻址方案和端口系统,这意味着每个路由器都需要了解如何路由这些方案,并且不同的协议会产生很大的影响。更难学习和诊断。简而言之,如果没有分层,互联网就无法正常工作。

您关心的是传输层和应用层。在传输层,我们有 TCP 和 UDP 等 Internet 协议,每个协议的端口号范围为 1 到 65535。在应用层,我们有 HTTP、SMTP 和 DNS 等协议。通常,每个定义协议的 Internet 标准文档都会指定该协议默认使用的默认 TCP 或 UDP 端口。例如用于 HTTP 的 TCP 端口 80、用于 SMTP 的 TCP 端口 25、用于 DNS 的 UDP 端口 53 以及用于 Telnet 的 TCP 端口 23。 telnet 程序实际上讲的是 TELNET 协议,这是一个标准协议,但以目前的标准来看,大部分都是古老的。因为它的协议序列是由 8 位字符组成的,所以您很少看到协议本身,并且与其他更现代的协议(如 HTTP 和 SMTP)相比,它基本上是透明的,这些协议使用 ASCII 中人类可见的单词,如 GET、POST、HELO、LOGIN、 ETC。

因为它的协议通常不可见,所以 telnet 成为了一个不错的工具,用于连接到其他 TCP 端口并允许用户手动输入协议。一些网络管理员使用此技术来诊断服务器问题。然而,由于 telnet 程序仍然有自己的协议,并且有时可能会发送额外的数据位,因此您仍然会遇到此技术的问题。当您使用 telnet 时,您实际上是在应用层和传输层“建立连接”。碰巧其他应用层协议可以通过它正常工作以进行大多数诊断,并且不会干扰 telnet 协议。有一个更好的程序可以通过称为 nc(Net Cat。它因 cat 命令的基于网络的版本而得名)来执行此操作。

$ nc www.stackexchange.com 80

nc 程序不使用任何应用层协议,当您与其建立连接时,您仅在互联网层(IP 地址)和传输层(TCP 或 UDP)“建立连接”。这意味着您可以控制使用什么应用程序层协议。几乎任何事物都是公平的游戏,即使是二进制协议。这还允许您执行有用的操作,例如传输文件而不损坏文件以及侦听端口的传入流量:

nc -l 9000 < movie.mp4  (Your friend runs this)

nc friends.computer.hostname 9000 > movie.mp4  (you run this)

然后,完全不使用应用层协议(例如 FTP)通过网络传输 movie.mp4。应用程序协议实际上是您的朋友告诉您他们已准备好让您运行命令。

nc 还可以处理 UDP 数据包和 UNIX 域套接字。用它来听也很有趣。

nc -l 12345

现在,在您的 Web 浏览器中访问 http://localhost:12345/,在 nc 会话中您应该会看到浏览器的GET / HTTP/1.1请求。此时,您可以输入一些内容并按下Ctrl-D,它应该以纯文本形式显示在您的浏览器中(如果您希望显示 HTML,则必须将其发送回正确的 HTTP 协议响应,后跟 HTML 代码)。

有时,本身使用一种协议(例如 HTTP)的程序可以连接到适用于不同协议的其他端口。您通常无法再在 GUI 浏览器中执行此操作,因为它们限制它们连接到某些端口,但如果您使用像curl 这样的程序连接到端口 25(用于发送邮件的 SMTP),您可能会看到几个有关破坏协议的错误。

$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.

发生这种情况是因为curl通常使用HTTP协议,因此在建立TCP握手后,它开始发送如下数据:

GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl

但SMTP服务器期待的是SMTP,它更像是这样的:

HELO myhomecomputername.local

此时服务器发回其标识行:

250 yourispsmtpserverhost.com

所以你会看到,没有什么可以阻止curl与SMTP服务器建立传输层连接,它只是无法使用协议。但是您可以使用 telnet 或更佳的 nc 之类的程序自己说出该协议。

答案2

telnet是一个可以连接任何tcp端口的工具。

默认情况下,它连接到 telnet 端口 (23),但您可以告诉它连接到 http 端口 (80) 或 smtp 端口 (25) 或其他端口。

不过,您需要知道如何“说出”远程服务器在该端口上侦听的协议。

例如,如果您想获取网站的标题(更改域名等以保护有罪者):

$ telnet www.example.com 80
Trying xxx.xxx.xxx.xxx...
Connected to www.example.com.
Escape character is '^]'.
HEAD http://www.example.com/ HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 30 Oct 2015 09:28:58 GMT
Server: Apache/2.4.17 (Debian)
Last-Modified: Sun, 14 Nov 2010 06:30:26 GMT
ETag: "843-494fd75830480"
Accept-Ranges: bytes
Content-Length: 2115
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

Connection closed by foreign host.

HEAD行是我在连接中输入的内容。请注意,http 协议要求您发送一个空行来指示 HEAD 或 GET 或任何请求的结尾。这是紧接在 HEAD 请求之后的空行。

答案3

两种协议的初始协商都使用文本命令,因此您可以连接并开始输入命令。其他的也是如此老的SMTP、telnet 等协议长期以来一直被用来排除故障连接到相应的服务。

例如

这些协议独立于它们进行通信的端口。几乎所有实现都可以配置为侦听任何端口。

某些协议(例如 HTTPS)不使用文本命令进行协商。但是,您(通常)可以连接到港口服务器侦听,但不执行任何有用的操作。

答案4

您的一些理解是正确的,而另一些则不正确。端口 80 通常是为 HTTP 保留的,但这只是一个约定;任何程序都可以侦听系统上的任何开放端口。如果您连接的系统上有一个 Web 服务器正在侦听端口 80,则您确实需要使用 HTTP 与其通信。

telnet根本不是一个协议,它是一个程序,可以让您将原始文本发送到任何端口上的任何主机。远程主机不知道什么程序正在连接到它;它所能看到的只是发送给它的数据包。任何发送符合远程主机期望的协议的数据包的程序都可以工作,因此您可以使用它telnet通过任何基于文本的协议进行通信。

您发送了类似于 的内容GET /path/to/a/file HTTP/1.1,这是有效的HTTP 1.1 命令看起来与网络浏览器发送的请求相同,所以它工作得很好。

相关内容