介绍
Linux 以在大多数发行版中提供大量成熟、有用的命令行实用程序而闻名。通常,系统管理员可以使用内置工具完成大部分工作,而无需安装其他软件。
在本指南中,我们将讨论如何使用netcat实用程序。这个多功能命令可以帮助您监控、测试和跨网络连接发送数据。
Netcat 几乎可以在任何现代 Linux 发行版上使用。Ubuntu 附带了 netcat 的 BSD 变体,这就是我们将在本指南中使用的。其他版本可能以不同方式运行或提供其他选项。
一般语法
默认情况下,netcat 通过启动与远程主机的 TCP 连接来运行。
最基本的语法是:
- netcat [options] host port
这将尝试在指定的端口号上启动到已定义主机的 TCP 连接。它的功能类似于旧的 Linuxtelnet
命令。请记住,您的连接是完全未加密的。
如果您想发送 UDP 数据包而不是启动 TCP 连接,您可以使用以下-u
选项:
- netcat -u host port
您可以通过在第一个和最后一个之间放置一个破折号来指定一系列端口:
- netcat host startport-endport
这通常与一些附加标志一起使用。
在大多数系统上,我们可以使用netcat
或nc
互换使用。它们是同一命令的别名。
如何使用 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 和 zip 压缩,并将结果写入标准输出。
然后将其直接写入TCP连接,然后在另一端接收并解压缩到远程计算机的当前目录中。
这只是将更复杂的数据从一台计算机传输到另一台计算机的一个例子。另一个常见的想法是使用该dd
命令在一侧对磁盘进行映像并将其传输到远程计算机。不过,我们不会在这里介绍。
如何使用 Netcat 作为简单的 Web 服务器
我们一直在配置 netcat 以侦听连接,以便进行通信和传输文件。我们可以使用相同的概念将 netcat 作为一个非常简单的 Web 服务器运行。这对于测试您正在创建的页面很有用。
首先,让我们在一台服务器上制作一个简单的 HTML 文件:
- nano index.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 试图通过消除形成连接的复杂性来使计算机之间的网络交互透明。