![是否可以通过 netcat 加密通信?](https://linux22.com/image/1084707/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%20netcat%20%E5%8A%A0%E5%AF%86%E9%80%9A%E4%BF%A1%EF%BC%9F.png)
我知道可以使用 在 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,而不是让发送方等待。以下是使用mbuffer
1GB 数据缓冲区和 128k 发送/接收缓冲区的示例:
在目标端,替换nc -l 1234
为mbuffer -s 128k -m 1G -4 -l 1234
在发送方,替换nc dest.server.tld 1234
为mbuffer -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}"
然而,多装甲输出文件的解密有点棘手...所以这里是脚本因为这篇文章太长了,不适合在这里发布,所以就写了这篇文章。