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

介绍

Linux 是众所周知的,在大多数发行版中有大量成熟、有用的命令行工具可用,通常系统管理员可以使用内置的工具来完成大部分工作,而无需安装额外的软件。

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

Netcat 应该在几乎任何现代的 Linux 发行版上可用。Ubuntu 配备了 netcat 的 BSD 变体,这就是我们将在本指南中使用的。

通用语法

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

最基本的语法是:

1netcat [options] host port

这将试图在指定的端口号上启动 TCP 连接到定义的主机. 这与旧的 Linux telnet 命令相似。

如果您想发送 UDP 包,而不是启动 TCP 连接,您可以使用 -u 选项:

1netcat -u host port

您可以通过在第一个和最后一个端口之间放置一个插槽来指定一个端口范围:

1netcat host startport-endport

这通常与一些额外的旗帜一起使用。

在大多数系统中,我们可以互换使用netcatnc

如何使用Netcat进行端口扫描

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

虽然netcat可能不是最复杂的工具(nmap在大多数情况下是一个更好的选择),但它可以执行简单的端口扫描,以便轻松识别开放的端口。

我们通过指定一系列要扫描的端口,如上所述,以及执行扫描的-z选项,而不是尝试启动连接。

例如,我们可以通过发出此命令扫描所有端口高达1000:

1netcat -z -v domain.com 1-1000

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

结果将是这样的:

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

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

如果您实际上正在使用域名,这是您需要使用的表格。

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

1netcat -z -n -v 198.51.100.0 1-1000

返回的消息实际上是发送到标准错误(参见我们的 I/O 重定向文章 有关更多信息)。

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

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

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

如何通过Netcat进行沟通

Netcat 并不局限于发送 TCP 和 UDP 包,它还可以在一个端口上收听连接和包,这使我们有机会在客户端与服务器关系中连接两个 Netcat 实例。

哪台计算机是服务器,哪台是客户端,在初始配置过程中只是一个相关的区别。

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

1netcat -l 4444

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

在第二个服务器上,我们可以连接到我们选择的端口号的第一台机器,我们以同样的方式进行连接:

1[environment second]
2netcat domain.com 4444

它将看起来像什么都没有发生过,但是,您现在可以在连接的两侧发送消息,它们将在两端看到。

输入消息并按ENTER。它将出现在本地和远程屏幕上。

当您完成传递消息时,您可以按CTRL-D来关闭TCP连接。

如何通过Netcat发送文件

基于前面的例子,我们可以完成更有用的任务。

由于我们正在建立一个常规的TCP连接,我们可以通过该连接传输几乎任何类型的信息. 它不限于用户输入的聊天消息。

再次,我们需要选择连接的一端来聆听连接,但是,而不是将信息打印到屏幕上,正如我们在上一个示例中所做的,我们将把所有信息直接放到一个文件中:

1netcat -l 4444 > received_file

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

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

1[environment second]
2echo "Hello, this is a file" > original_file

我们现在可以用这个文件作为我们将建立到收听计算机的netcat连接的输入。

1netcat domain.com 4444 < original_file

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

1cat received_file
1[secondary_label Output]
2Hello, this is a file

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

例如,我们可以通过在飞行中创建一个无名 tarball 来传输整个目录的内容,将其传输到远程系统,然后将其解包到远程目录中。

在接收端,我们可以预料到一个需要被解码并通过键入提取的文件会出现:

1[environment second]
2netcat -l 4444 | tar xzvf -

终端 dash (-) 意味着 tar 将运行在标准输入上,该输入在连接时从 netcat 通过网络进行管道。

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

1tar -czf - * | netcat domain.com 4444

这一次,tar 命令中的 dash 意味着 tar 和 zip 当前目录的内容(如 * wildcard 所指定),并将结果写入标准输出。

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

这是将更复杂的数据从一台计算机传输到另一台计算机的例子之一。另一个常见的想法是使用dd命令在一侧映射磁盘并将其传输到远程计算机。

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

我们已经配置了netcat来聆听连接,以便通信和传输文件. 我们可以使用同样的概念来运行netcat作为一个非常简单的Web服务器. 这可以用于测试您正在创建的页面。

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

1nano index.html

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

 1[label index.html]
 2<html>
 3        <head>
 4                <title>Test Page</title>
 5        </head>
 6        <body>
 7                <h1>Level 1 header</h1>
 8                <h2>Subheading</h2>
 9                <p>Normal text here</p>
10        </body>
11</html>

保存并关闭文件。

没有 root 权限,您无法在默认 Web 端口 80 上服务此文件,我们可以选择端口 8888 作为常规用户。

如果您只想一次服务此页面,以检查该页面是如何渲染的,您可以执行以下命令:

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

现在,在您的浏览器中,您可以访问内容,访问:

1http://server_IP:8888

netcat page served

这将服务于页面,然后netcat连接将关闭. 如果你尝试刷新页面,它将消失:

netcat page gone

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

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

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

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

这允许您看到页面在浏览器中如何渲染,但它不会提供更多的功能. 您绝不应该使用此功能来服务实际的网站. 没有安全性和简单的东西,如链接甚至不能正常工作。

结论

它是一种多功能的工具,可用于诊断问题,并验证基层功能是否与TCP/UDP连接正常工作。

使用netcat,您可以很容易地在不同的计算机之间进行通信,以便快速交互。

Published At
Categories with 技术
comments powered by Disqus