如何使用Netcat建立和测试TCP和UDP连接

来自菜鸟教程
跳转至:导航、​搜索

介绍

Linux 以在大多数发行版中开箱即用的大量成熟、有用的命令行实用程序而闻名。 通常,系统管理员可以使用内置工具完成大部分工作,而无需安装额外的软件。

在本指南中,我们将讨论如何使用 netcat 实用程序。 这个多功能命令可以帮助您监控、测试和跨网络连接发送数据。

Netcat 应该可以在几乎所有现代 Linux 发行版上使用。 Ubuntu 附带了 netcat 的 BSD 变体,这就是我们将在本指南中使用的内容。 其他版本可能会以不同的方式运行或提供其他选项。

一般语法

默认情况下,netcat 通过启动到远程主机的 TCP 连接来运行。

最基本的语法是:

netcat [options] host port

这将尝试在指定的端口号上启动与已定义主机的 TCP 连接。 这个功能类似于旧的 Linux telnet 命令。 请记住,您的连接是完全未加密的。

如果你想发送一个 UDP 数据包而不是发起一个 TCP 连接,你可以使用 -u 选项:

netcat -u host port

您可以通过在第一个和最后一个之间放置破折号来指定一系列端口:

netcat host startport-endport

这通常与一些附加标志一起使用。

在大多数系统上,我们可以交替使用 netcatnc。 它们是同一命令的别名。

如何使用 Netcat 进行端口扫描

netcat 最常见的用途之一是用作端口扫描器。

尽管 netcat 可能不是这项工作最复杂的工具(在大多数情况下,nmap 是更好的选择),但它可以执行简单的端口扫描以轻松识别打开的端口。

如上所述,我们通过指定要扫描的端口范围以及 -z 选项来执行扫描而不是尝试启动连接来执行此操作。

例如,我们可以通过发出以下命令扫描最多 1000 的所有端口:

netcat -z -v domain.com 1-1000

除了 -z 选项,我们还指定了 -v 选项来告诉 netcat 提供更详细的信息。

输出将如下所示:

Outputnc: connect to domain.com port 1 (tcp) failed: Connection refused
nc: connect to domain.com port 2 (tcp) failed: Connection refused
nc: connect to domain.com port 3 (tcp) failed: Connection refused
nc: connect to domain.com port 4 (tcp) failed: Connection refused
nc: connect to domain.com port 5 (tcp) failed: Connection refused
nc: connect to domain.com port 6 (tcp) failed: Connection refused
nc: connect to domain.com port 7 (tcp) failed: Connection refused
. . .
Connection to domain.com 22 port [tcp/ssh] succeeded!
. . .

如您所见,这提供了大量信息,并会告诉您每个端口的扫描是否成功。

如果您实际使用的是域名,则必须使用这种形式。

但是,如果您知道所需的 IP 地址,您的扫描会更快。 然后您可以使用 -n 标志来指定您不需要使用 DNS 解析 IP 地址:

netcat -z -n -v 198.51.100.0 1-1000

返回的消息实际上被发送到标准错误(有关更多信息,请参阅我们的 I/O 重定向文章 )。 我们可以将标准错误消息发送到标准输出,这将使我们能够更轻松地过滤结果。

我们将使用 2>&1 bash 语法将标准错误重定向到标准输出。 然后我们将使用 grep 过滤结果:

netcat -z -n -v 198.51.100.0 1-1000 2>&1 | grep succeeded
OutputConnection to 198.51.100.0 22 port [tcp/*] succeeded!

在这里,我们可以看到远程计算机上唯一开放的 1-1000 范围内的端口是 22 端口,即传统的 SSH 端口。

如何通过 Netcat 进行通信

Netcat 不限于发送 TCP 和 UDP 数据包。 它还可以在端口上侦听连接和数据包。 这使我们有机会以客户端-服务器关系连接两个 netcat 实例。

哪台计算机是服务器,哪台计算机是客户端,这只是初始配置时的相关区别。 建立连接后,双向通信完全相同。

在一台机器上,您可以告诉 netcat 侦听特定端口以进行连接。 我们可以通过提供 -l 参数并选择一个端口来做到这一点:

netcat -l 4444

这将告诉 netcat 侦听端口 4444 上的 TCP 连接。 作为普通(非 root)用户,作为安全措施,您将无法打开 1000 以下的任何端口。

在第二台服务器上,我们可以通过我们选择的端口号连接到第一台机器。 我们这样做的方式与之前建立连接的方式相同:

netcat domain.com 4444

看起来好像什么都没发生。 但是,您现在可以在连接的任一端发送消息,并且它们将在任一端看到。

键入消息并按 ENTER。 它将出现在本地和远程屏幕上。 这也适用于相反的方向。

传递完消息后,可以按 CTRL-D 关闭 TCP 连接。

如何通过 Netcat 发送文件

在前面的例子的基础上,我们可以完成更多有用的任务。

因为我们正在建立一个常规的 TCP 连接,所以我们可以通过该连接传输几乎任何类型的信息。 它不限于用户输入的聊天消息。 我们可以利用这些知识将netcat变成一个文件传输程序。

再一次,我们需要选择连接的一端来监听连接。 但是,不像我们在上一个示例中所做的那样将信息打印到屏幕上,我们将所有信息直接放入一个文件中:

netcat -l 4444 > received_file

此命令中的 >netcat 的所有输出重定向到指定的文件名。

在第二台计算机上,通过键入以下内容创建一个简单的文本文件:

echo "Hello, this is a file" > original_file

我们现在可以使用这个文件作为我们将建立到侦听计算机的 netcat 连接的输入。 该文件将被传输,就像我们以交互方式键入它一样:

netcat domain.com 4444 < original_file

我们可以在等待连接的计算机上看到,我们现在有一个名为 received_file 的新文件,其中包含我们在另一台计算机上键入的文件的内容:

cat received_file
OutputHello, this is a file

正如你所看到的,通过管道,我们可以很容易地利用这种连接来传输各种东西。

例如,我们可以通过动态创建一个未命名的 tarball 来传输整个目录的内容,将其传输到远程系统,然后将其解压缩到远程目录中。

在接收端,我们可以预见到一个需要解压缩并提取的文件,方法是键入:

netcat -l 4444 | tar xzvf -

结尾的破折号 (-) 表示 tar 将在标准输入上运行,当建立连接时,标准输入将通过网络从 netcat 传输。

在有我们要传输的目录内容的一侧,我们可以将它们打包成一个 tarball,然后通过 netcat 将它们发送到远程计算机:

tar -czf - * | netcat domain.com 4444

这一次,tar 命令中的破折号表示对当前目录的内容(由 * 通配符指定)进行 tar 和压缩,并将结果写入标准输出。

然后将其直接写入 TCP 连接,然后在另一端接收并解压缩到远程计算机的当前目录中。

这只是将更复杂的数据从一台计算机传输到另一台计算机的一个示例。 另一个常见的想法是使用 dd 命令在一侧镜像磁盘并将其传输到远程计算机。 我们不会在这里讨论这个。

如何使用 Netcat 作为简单的 Web 服务器

我们一直在将 netcat 配置为侦听连接,以便进行通信和传输文件。 我们可以使用同样的概念来操作 netcat 作为一个非常简单的 Web 服务器。 这对于测试您正在创建的页面很有用。

首先,让我们在一台服务器上制作一个简单的 HTML 文件:

nano index.html

以下是您可以在文件中使用的一些简单 HTML:

索引.html

<html>
        <head>
                <title>Test Page</title>
        </head>
        <body>
                <h1>Level 1 header</h1>
                <h2>Subheading</h2>
                <p>Normal text here</p>
        </body>
</html>

保存并关闭文件。

如果没有 root 权限,您将无法在默认 Web 端口 80 上提供此文件。 我们可以选择8888端口作为普通用户。

如果您只想提供此页面一次以检查其呈现方式,则可以运行以下命令:

printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888

现在,在您的浏览器中,您可以通过以下方式访问内容:

http://server_IP:8888

这将提供页面,然后 netcat 连接将关闭。 如果您尝试刷新页面,它将消失:

我们可以通过将最后一个命令包装在无限循环中来让 netcat 无限期地为页面提供服务,如下所示:

while true; do printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888; done

这将允许它在第一个连接关闭后继续接收连接。

我们可以通过在服务器上输入 CTRL-C 来停止循环。

这允许您查看页面在浏览器中的呈现方式,但它没有提供更多功能。 您永远不应该将其用于服务实际网站。 没有安全性,链接之类的简单事情甚至无法正常工作。

结论

您现在应该对 netcat 的用途有了一个很好的了解。 它是一种通用工具,可用于诊断问题并验证基本功能是否与 TCP/UDP 连接一起正常工作。

使用 netcat,您可以非常轻松地在不同计算机之间进行通信,以实现快速交互。 Netcat 试图通过消除形成连接的复杂性来使计算机之间的网络交互变得透明。