使用 Netcat 进行简单网络通信

LinuxBeginner
立即练习

简介

在本实验中,你将使用 Netcat 学习网络通信的基础知识。Netcat 是一款功能灵活的网络工具,常被称为网络工具中的「瑞士军刀」。你将了解这个强大的实用工具如何通过 TCP 或 UDP 协议,在网络连接中读取和写入数据。

通过动手实践,你将探索客户端与服务器通信的基本原理,创建一个简单的聊天系统,并理解端口等重要网络概念。本实验还会介绍用于保护数据传输的基础加密技术。

安装 Netcat

在开始我们的秘密特工通信之前,首先需要准备好合适的工具。Netcat 之所以常被称为网络工具中的「瑞士军刀」,是因为它能够处理各种网络任务。下面我们将逐步在系统中安装 Netcat。

首先,打开终端。在桌面上找到并打开 Xfce Terminal。终端是我们输入命令、使用 Netcat 完成各种操作的地方。

Xfce Terminal opening screenshot

注意:免费用户无法连接互联网,因此 Netcat 已预装在实验环境中。你可以直接跳到列表中的第 4 项(检查 Netcat 是否已安装)。升级为专业版后,你可以自行练习安装 Netcat。

仅限专业版用户

打开终端后,我们需要先更新软件包列表,以确保获取 Netcat 的最新版本。输入以下命令并按 Enter:

sudo apt update

系统可能会要求你输入密码。输入密码后按 Enter(输入时屏幕不会显示字符)。其中,sudo 表示以管理员权限运行该命令。

软件包列表更新完成后,就可以安装 Netcat 了。软件包管理器会自动处理所有依赖项。输入以下命令:

sudo apt install netcat -y

-y 选项会自动对所有提示回答「yes」,让安装过程更加顺畅。当你确定要安装该软件包时,这个选项非常方便。

安装完成后,我们来验证 Netcat 是否正确安装。可以通过查看其版本信息进行检查。输入:
nc -h

你应该会看到以「OpenBSD netcat」开头的输出,后面跟着一系列选项。这表示 Netcat 已安装并可以使用。-h 选项用于显示帮助信息,也是检查程序是否正常运行的简单方法。

恭喜!你刚刚安装了一款功能强大的网络工具。Netcat 支持许多功能,从简单的文件传输到创建网络连接都可以完成。在本实验中,我们将重点学习它的基础用法,帮助你了解其能力。你可以把 Netcat 理解为一种在计算机之间建立连接并相互传输信息的简单工具。

理解端口并创建监听器

现在通信工具已经准备就绪,接下来我们学习端口并设置监听器。在网络通信中,端口就像收音机上的不同频道,允许同一台设备同时进行多项通信。你也可以把端口想象成带有编号的房门,每扇门都通向计算机上的不同服务或应用程序。

让我们创建一个监听器。本实验使用端口 12345 进行通信。端口号的范围是 0 到 65535,我们选择 12345 是因为它容易记忆,并且通常不会被系统服务占用。在终端中输入:

nc -l 12345

该命令会让 Netcat 在端口 12345 上进行监听(-l 选项)。-l 代表「listen」模式,也就是让计算机等待通过该端口发起的传入连接。

终端看起来可能像是卡住了,不用担心!这是正常现象,因为 Netcat 现在正在主动监听,并等待其他设备连接到端口 12345。光标持续闪烁,说明程序正在正常运行并处于监听模式。

为了测试监听器,我们需要再打开一个终端窗口。你可以右键单击终端图标并选择「New Terminal」,也可以使用快捷键 Ctrl+Shift+N。第二个终端将作为连接监听器的「客户端」。

在新终端中连接到监听器。输入:

nc localhost 12345

该命令会让 Netcat 连接到 localhost 的端口 12345。localhost 表示当前计算机,是一个始终指向本机的特殊主机名。

现在,在第二个终端中输入一条简单的消息,例如「Hello」,然后按 Enter。你应该会在第一个运行监听器的终端中看到这条消息。这说明数据可以通过网络端口,从发起连接的终端传输到正在监听的终端。

Netcat listener and connection

你可以在任意一个终端中继续输入消息,消息会显示在另一个终端中。这展示了 Netcat 的全双工通信能力,也就是说,通信可以同时双向进行。尝试来回发送几条消息,观察它的工作方式。

要结束连接,请在两个终端中分别按 Ctrl+C。这个快捷键会发送中断信号,从而正常关闭 Netcat 会话。测试完成后,正确关闭连接非常重要。

使用 Netcat 传输文件

现在我们已经学习了如何使用 Netcat 建立基础网络通信,接下来探索它最实用的功能之一:在系统之间传输文件。这项功能简单却非常强大,因此 Netcat 成为了系统管理员和网络工程师常用的工具。

首先,创建一个用于传输的示例文件。在终端中输入:

cd ~/project
echo "Top Secret: The cake recipe is actually a lie" > secret.txt

该命令完成两项操作:进入项目目录,并创建一个名为 secret.txt 的新文件,其中包含示例消息。> 符号会将 echo 命令的输出重定向到文件中。

接下来设置文件传输的接收端。打开一个终端窗口并运行:

cd ~/project
nc -l 12345 > received_secret.txt

这里,nc -l 12345 会让 Netcat 在端口 12345 上以监听模式运行。> 会将接收到的数据重定向到名为 received_secret.txt 的新文件中。此终端随后会静默等待传入连接。

在另一个终端窗口中(保持第一个终端继续运行),发送文件:

cd ~/project
nc localhost 12345 < secret.txt

该命令使用 Netcat 连接到监听器,在端口 12345 上连接 localhost(表示「本机」)。< 符号告诉 Netcat 使用 secret.txt 作为输入,从而通过网络连接发送文件内容。

由于发送端和接收端位于同一台计算机上,传输会立即完成。要验证文件是否成功传输,请查看接收文件的内容:

cat received_secret.txt

cat 命令会显示文件内容,结果应与原始秘密消息完全一致。

Netcat file transfer screenshot

恭喜!你已经成功使用 Netcat 传输了文件。虽然本示例使用的是 localhost,但相同流程也适用于网络中的不同计算机,只需将 localhost 替换为接收端计算机的 IP 地址即可。当无法使用更复杂的协议时,这种简单的方法非常适合快速传输文件。

实现加密通信

接下来,我们将使用 OpenSSL 实现加密,并将其与 Netcat 集成,为通信增加一层安全保护。在网络传输过程中,加密对于防止敏感信息被未授权人员截获和读取至关重要。

在之前的实验中,我们已经学习过如何使用 OpenSSL。OpenSSL 提供了强大的密码学功能,我们将利用这些功能保护消息安全。具体来说,我们会使用 openssl enc 命令,通过 AES-256-CBC 加密算法对消息进行加密和解密。AES-256-CBC 是一种强大的对称加密算法。我们还会使用密码短语派生加密密钥,你可以把它理解为发送方和接收方之间共享的秘密。

首先创建发送方脚本。该脚本负责加密并发送消息。打开一个名为 secure_sender.sh 的新文件:

nano secure_sender.sh

将以下内容添加到文件中(你可以直接复制并粘贴):

#!/bin/bash

echo "Secure Sender - Enter messages to send. Press Ctrl+C to exit."

while true; do
  echo "Enter message:"
  read message
  encrypted=$(echo "$message" | openssl enc -aes-256-cbc -salt -base64 -pbkdf2 -iter 10000 -pass pass:secretpassword 2> /dev/null)
  echo "$encrypted" | nc -N localhost 12345
done

该脚本的工作流程如下:

  • 持续循环,提示你输入消息
  • 获取你输入的内容,并通过管道交给 OpenSSL 加密
  • 使用 Netcat(nc)将加密后的数据发送到本机的端口 12345
  • 加密参数包括用于增强安全性的盐值、便于安全传输的 Base64 编码,以及经过 10,000 次迭代的 PBKDF2 密钥派生

Secure sender script example

Ctrl+X,然后按 Y,最后按 Enter 保存并退出文件。为脚本添加可执行权限:

chmod +x secure_sender.sh

现在创建接收方脚本。该脚本负责监听并解密传入的消息。打开一个名为 secure_receiver.sh 的新文件:

nano secure_receiver.sh

添加以下内容:

#!/bin/bash

echo "Secure Receiver - Waiting for messages. Press Ctrl+C to exit."

while true; do
  encrypted=$(nc -l 12345)
  if [ ! -z "$encrypted" ]; then
    decrypted=$(echo "$encrypted" | openssl enc -aes-256-cbc -d -salt -base64 -pbkdf2 -iter 10000 -pass pass:secretpassword 2> /dev/null)
    echo "Received message: $decrypted"
  fi
done

在本实验使用的 Ubuntu 22.04 环境中,默认的 OpenBSD Netcat 监听语法是 nc -l 12345。在这里使用 -l 时,不要添加 -p

该脚本会:

  • 持续监听端口 12345,等待传入数据
  • 收到数据后,通过管道将其交给 OpenSSL 解密
  • 使用与发送方相同的加密参数,正确解密消息
  • 显示原始明文消息

Ctrl+X,然后按 Y,最后按 Enter 保存并退出文件。为脚本添加可执行权限:

chmod +x secure_receiver.sh

现在测试加密通信系统。你需要同时打开两个终端窗口,一个用于接收方,另一个用于发送方。

在第一个终端中启动接收方:

./secure_receiver.sh

你会看到提示接收方正在等待消息。此时,接收方已经在端口 12345 上主动监听。

在第二个终端中启动发送方:

./secure_sender.sh

系统会提示你输入消息。在这里输入的任何内容,都会在通过网络发送前先进行加密。

在发送方终端中输入一条消息并按 Enter。你应该会看到加密消息被发送出去(由于加密内容只是短暂传输,因此你可能只能短暂看到加密后的版本)。

Encrypted Message

在接收方终端中,你应该会看到解密后的消息,并且内容与在发送方终端中输入的内容完全一致。

你可以继续在发送方终端中发送消息。消息会在接收方终端中自动完成加密、发送、接收和解密,形成一个完整的安全通信流程。

要结束通信,请在两个终端中分别按 Ctrl+C,以安全终止两个脚本。

这个配置展示了一个简单而有效的加密通信系统。虽然我们使用 localhost 进行测试,但相同方法也适用于跨网络通信。消息会在发送前自动加密,并在接收后自动解密,从而为通信提供安全通道。不过请注意,在实际应用中,密钥交换应采用比硬编码密码更安全的方法。

总结

在本实验中,你学习了使用 Netcat 进行网络通信的基础知识,并探索了用于安全数据传输的基础加密技术。你练习了安装 Netcat、通过指定端口建立连接,以及在系统之间传输文件。

通过使用 OpenSSL 进行实际操作,你进一步理解了加密在网络通信中的重要作用。这些基础技能为理解更复杂的网络安全概念和安全通信协议打下了良好基础。