是否可以通过 netcat 加密通信?

是否可以通过 netcat 加密通信?

我知道可以使用 在 Linux 终端中聊天netcat。我想知道是否可以加密netcat通信。

我确实通过 PC-1 上的监听进行了聊天

nc -l 1234

并连接到另一台机器上的我的IP。

nc $IP 1234

答案1

这是可能的 - 但是我不认为 nc 本身会这样做:echo "Words" | gpg -e将在 stdout 上生成加密版本;您可以像往常一样指定接收用户。
如果您将其通过管道传输到 gpg 的另一个副本,那么gpg -d它会要求输入密码 - 这将被记住一段时间,从而实现对话。

因此,echo "words" | gpg -e | nc target 4321将会发送,并且nc -l 4321 | gpg -d将会聆听。

另请参阅这个问题这很相似。

答案2

总结:

让目标监听端口 12345:

nc -l 12345 | gpg --decrypt --batch --passphrase "MySuperSecret123" > output.file

让发送方发送数据到目标端口12345:

cat MyFile | gpg --symmetric --cipher-algo AES256 --batch --passphrase "MySuperSecret123" | nc destination.server.tld 12345

长版

这是我用来通过 netcat 复制原始硬盘的解决方案(也可以用于 Linux 中的物理到虚拟操作,或原始 VM 复制)。

如果我碰巧读取磁盘,我会使用 livecd 上启动源,有时它缺少 openssl 二进制文件,但总是带有 gpg 二进制文件。

当然,通过互联网使用 netcat,我希望我的数据至少使用 goodenough(TM) 加密算法进行加密:

设置目标端:

nc -l 8888 | gpg --decrypt --batch --passphrase "MySuperSecret123" |zstd -d | pv > output.file

解释:

  • 设置 netcat 监听 8888 端口(根据你的防火墙更改端口)
  • 解密netcat收到的数据
  • 解压缩数据
  • 可选:使用 pv 显示统计数据,免责声明:如果您没有安装光伏,请移除
  • 将输出写入文件

笔记:pv 是一个提供管道统计信息的程序。如果不存在,则将其删除。

在我的发送方:

dd id=/dev/sda status=progress | zstd --fast -T0 | gpg --compression-algo none --symmetric --cipher-algo AES256 --batch --passphrase "MySuperSecret123" | nc destination.server.tld 8888

解释:

  • 使用 dd 读取硬盘并显示进度
  • 使用非常快的 zstd 算法压缩内容,同时使用与 CPU 核心一样多的线程
  • 使用 GPG 加密数据
  • 通过netcat发送到8888端口(当然,根据接收方更改端口号)

先生,表现更出色吗?

GPG 几乎随处可用。如果您有 openssl,它可能会大大加快加密/解密过程。

在目标端,运行:

nc -l <port> | openssl enc -aes-256-cbc -pbkdf2 -d -k "MySuperSecretPassword" | zstd -d | pv > sda.raw

在发送方,运行以下命令:

dd if=/dev/sda status=progress | zstd --fast -T0 | openssl enc -aes-256-cbc -pbkdf2 -k "MySuperSecretPassword" | nc <destination> <port>

再次,先生,表现更出色吗?

在某些情况下,例如 zfs send/recv,可能会出现 IO 瓶颈,主要出现在接收端。此时用 mbuffer 替换 netcat 可能会有所帮助,因为它会缓冲 IO,而不是让发送方等待。以下是使用mbuffer1GB 数据缓冲区和 128k 发送/接收缓冲区的示例:

在目标端,替换nc -l 1234mbuffer -s 128k -m 1G -4 -l 1234

在发送方,替换nc dest.server.tld 1234mbuffer -s 128k -m 1G -O dest.server.tld:1234

在 zfs 传输中,我可以使用 mbuffer 而不是 netcat 从 2Gbit/s 提高到 3.5Gbit/s。

安全 在发送方和目的地,您都应该禁用 bash 历史记录或至少随后将其删除,这样history -c就没有人会找到您的(一次性)密码。

截至撰写本文时(2023 年),安全研究人员认为 GPG(自 v2.1 起)和 openssl 使用的 AES-256 加密似乎没有问题。此信息并不总是正确的。

答案3

netcat 本身没有加密或身份验证控制,因此虽然可以通过 OpenSSL 或 GnuPG 加密流量,并使用一些巧妙的管道和监听端的一点 if 循环,但如果您处于不可信的网络上,您可能会失去使用它来读取的竞争条件,并且 netcat 不允许没有巧妙脚本的多个客户端......但我在这里不是要批评一个工具,而是要通知您一个 Bash 工具 ;-)

请注意,它还处于实验阶段,你应该看看特拉维斯-CI构建日志以准确了解它的作用,提示打开第二个窗口/选项卡并按照travis.yml启用脚本来查看迄今为止开发的每个工作/测试功能。

第二个提示,以下命令示例为更好的根据我加密随机字符串的经验。

Var_input="$@"
Var_gpg_opts="--armor --batch --no-tty --recipient [email protected] --encrypt"
Var_log_file="${PWD}/output.enc
## Output to terminal
cat <<<"${Var_input}" | gpg ${Var_gpg_opts}
## Save output to file
cat <<<"${Var_input}" | gpg ${Var_gpg_opts} >> "${Var_log_file}"

然而,多装甲输出文件的解密有点棘手...所以这里是脚本因为这篇文章太长了,不适合在这里发布,所以就写了这篇文章。

相关内容