Featured image of post Linux网络工具之nc和socat

Linux网络工具之nc和socat

这是一篇关于Linux网络工具nc和socat的介绍,通过实例展示如何提升网络操作效率

前言

作为一名开发人员,日常工作中不可避免地会遇到一些网络相关的任务,例如网络连通性测试、临时发送文件、端口转发等。

传统工具如 scprsync 在文件传输时存在认证流程复杂的问题,而 telnet 等工具功能单一。但我们还有 ncsocat 这两款强大的命令行工具,它们简化了许多复杂的网络操作。

本文将结合我的实际经验,重点介绍nc在文件传输和网络测试中的应用,以及socat在端口转发方面的强大功能,并总结一些常见的使用场景和安全建议。


nc(Netcat)命令详解

nc(Netcat)被誉为“网络瑞士军刀”,因为它支持TCP和UDP协议,适用于端口扫描、数据传输、网络调试等多个场景。

安装与版本差异

安装

1
2
3
4
5
6
7
8
# Debian/Ubuntu (默认安装traditional版本)
sudo apt install netcat

# 可选OpenBSD变体(支持加密)
sudo apt install netcat-openbsd

# RHEL/CentOS
sudo yum install nc

版本差异

版本特性TraditionalOpenBSD变体
加密支持✅ Twofish 256位加密
UNIX套接字
轻量化✅ 仅基础功能❌ 功能更丰富

常用参数

参数功能说明
-l监听模式(服务端)
-p指定监听端口
-u使用UDP协议(默认TCP)
-v显示详细输出(调试信息)
-z端口扫描时不发送数据
-w设置超时时间(秒)
-e执行指定程序(如cmd.exe/bin/bash

传输结束不断开问题

不同版本和操作系统里的 nc 的行为不完全一致,最常见的问题是文件传输完毕不断开,仍保持连接。

可通过以下方式解决(需 man nc 查看当前平台的参数支持情况,选择合适方式):

  • 传输完毕后直接 CTRL+C 中断或者 kill 掉进程
  • client端 添加参数 -N,会在输入遇到 EOF 时立即关闭 socket 连接
  • client端 添加参数 -q 0,表示输入遇到 EOF 后等待指定秒数再退出,0表示立即退出

下文以 -N 为例,如你的环境是其他方式请自行修改相关命令。

核心功能

  • 端口监听与连接:通过nc可以轻松地作为服务端或客户端建立TCP/UDP连接。
  • 文件传输:利用nc的管道特性,快速实现跨主机文件传输。
  • 端口扫描:可以快速扫描目标主机的开放端口。
  • 反向Shell:通过nc-e选项,简单实现远程控制。

文件传输(支持双向)

client(发送端) -> server(接收端)

1
2
3
4
5
# 接收端先启动监听(保存为data.iso)
nc -l -p PORT > data.iso

# 发送端推送文件
nc -N IP PORT < data.iso

server(发送端) -> client(接收端)

1
2
3
4
5
# 发送端先启动监听等待发送
nc -l -p PORT < data.iso

# 接收端主动拉取
nc -N IP PORT > local_copy.iso
可用于网络测速
1
2
3
4
# 接收端
nc -l 9999 > /dev/null
# 发送端
nc TARGET_IP 9999 < /dev/zero

性能对比:千兆网络下传输速度可达900Mbps,比SCP快2.3倍

目录传输

传输目录因需要与 tar 组合使用,建议在接收端监听,发送端打包发送,结束后可以自动断开。

若在发送端监听,传输结束后需手动中断

或者先打包为tar文件再用发送文件的方式传输,更加灵活

在接收端先执行监听命令
1
nc -l PORT | tar xvfp -
  • tar 参数说明:
    • x: 解压
    • v: 显示进度
    • f: 文件操作
    • p: 保留权限
在发送端执行打包发送命令
1
tar cfp - /path/to/directory | nc IP PORT
  • c: 创建压缩包

  • f: 文件操作

  • p: 保留权限

  • -: 表示输出到标准输出

  • 注意事项:

    1. 此处不用添加 -N 参数,传输结束自动断开,因为 tar 命令会自动关闭输出流
    2. 请确保两端防火墙允许该端口通信
    3. 传输完成后建议进行校验:
      1
      2
      3
      4
      
      # 发送端生成校验
      tar cf - /path | md5sum
      # 接收端验证
      tar xf - | md5sum
      

大文件目录传输(带进度显示)

  • 搭配 pv 命令显示进度
  • 可选用 z 参数压缩大文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 安装进度监控工具pv
sudo apt install pv             # Debian/Ubuntu
sudo yum install pv             # RHEL/CentOS

# 接收端
nc -l PORT | tar xvf -

# 显示已发送数据量、已进行时间、发送速度
tar cf - /path | pv | nc TARGET_IP PORT

# 显示已发送数据量、已进行时间、发送速度,以及数据量百分比
DIR=/data && tar cf - $DIR | pv -s $(du -sb $DIR | awk '{print $1}') | nc TARGET_IP PORT
💡 性能技巧:使用 mbuffer 增加传输缓冲区
1
2
3
4
5
6
7
8
9
# 安装mbuffer
sudo apt install mbuffer        # Debian/Ubuntu
sudo yum install mbuffer        # RHEL/CentOS

# 发送端优化
tar cf - /data | mbuffer -m 4G | nc ...

# 接收端优化
nc ... | mbuffer -m 4G | tar xf -

快速端口诊断

1
2
3
4
5
6
7
8
# TCP端口扫描(20-30端口范围)
nc -zv example.com 20-30 # 可添加 -w 1 设置超时1秒

# UDP服务测试(DNS示例)
nc -u DNS_IP 53

# HTTP请求测试
echo "GET / HTTP/1.1\nHost: example.com\n" | nc example.com 80

反弹Shell 实现远程控制

1
2
3
4
# 服务端监听
nc -l -p 12345 -e /bin/bash
# 客户端连接
nc TARGET_IP 12345

安全注意事项

  • 明文传输风险:默认情况下,nc 不会加密数据,敏感信息可能被窃取。如有需要,建议使用 ncat --ssl 来代替。
  • 反弹Shell防护:避免在公网环境中启动未授权监听。

socat 命令详解

socatnc的增强版,支持更多协议(如SSL、UNIX套接字)和复杂场景(如多路复用、协议转换)。它在端口转发和加密通信方面尤其强大。

安装

1
2
3
# 主流Linux发行版安装
sudo apt install socat  # Debian/Ubuntu
sudo yum install socat  # RHEL/CentOS

常用参数与地址描述符

参数/地址功能说明
TCP-LISTEN:<端口>监听TCP端口
UDP-LISTEN:<端口>监听UDP端口
OPENSSL-LISTEN:<端口>启用SSL加密监听
EXEC:<程序>执行指定程序(如/bin/bash
fork多路复用,处理并发连接

核心功能

  • 协议转换:支持TCP ↔ UDP、TCP ↔ SSL、UNIX套接字 ↔ 网络端口等转换。
  • 加密通信:通过OpenSSL实现端到端加密。
  • 多路复用:通过fork选项处理并发连接。
  • 端口转发:可以将本地端口流量转发至远程服务。

稳定端口转发

1
2
# 将本机8000端口转发至内网指定端口
socat TCP4-LISTEN:8000,fork,reuseaddr TCP4:LOCAL_IP:TARGET_PORT

🔒 安全增强:限制源IP范围,比如内网段

1
2
3
4
socat TCP4-LISTEN:8000,fork,range=10.0.0.0/8 TCP4:LOCAL_IP:TARGET_PORT

# 安全增强版端口转发(IP白名单+日志记录)
socat TCP-LISTEN:8000,fork,range=10.0.0.0/8,su=nobody TCP:LOCAL_IP:TARGET_PORT 2>&1 | tee -a /var/log/socat.log
systemd 服务化配置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建服务文件
sudo tee /etc/systemd/system/socat-proxy.service > /dev/null <<EOF
[Unit]
Description=Socat Port Forward Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/socat \\
    TCP-LISTEN:SRC_PORT,fork,reuseaddr,range=10.0.0.0/8 \\
    TCP:LOCAL_IP:TARGET_PORT
Restart=always
RestartSec=5s
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

# 启用服务
sudo systemctl daemon-reload
sudo systemctl enable --now socat-proxy

SSL加密通信

1
2
3
4
5
6
7
8
# 生成自签名证书(示例)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

# 服务端(需提前生成证书)标准SSL终端代理配置
socat OPENSSL-LISTEN:443,cert=cert.pem,key=key.pem,fork,verify=0 TCP:localhost:80

# 客户端连接(verify=0表示不验证服务端证书)
socat - OPENSSL-CONNECT:gateway.example.com:443,verify=0
双向认证
1
2
3
4
5
# 服务端
socat OPENSSL-LISTEN:443,cert=server.pem,key=server.key,cafile=client.crt,verify=1,fork...

# 客户端
socat - OPENSSL-CONNECT:host:443,cert=client.pem,key=client.key,cafile=server.crt,verify=1

协议转换

TCP转UDP
1
2
# 接收TCP请求转发至UDP服务
socat TCP-LISTEN:1234,fork UDP:LOCAL_IP:5678
UNIX套接字转TCP
1
2
3
4
# 服务端
socat UNIX-LISTEN:/tmp/sock,fork TCP:localhost:80
# 客户端
socat UNIX-CONNECT:/tmp/sock -

反向Shell,远程控制

1
2
3
4
# 目标主机
socat TCP-LISTEN:4444 EXEC:/bin/bash
# 控制端
socat TCP:TARGET_IP:4444 -
加密Shell
1
2
3
4
# 服务端
socat OPENSSL-LISTEN:4443,cert=server.pem,fork EXEC:/bin/bash
# 客户端
socat OPENSSL:<目标IP>:4443,cert=client.pem -

安全注意事项

  • 加密传输:优先使用OPENSSL地址描述符来配置SSL证书,避免明文通信。
  • 权限控制:限制EXEC参数绑定的程序权限,防止未授权访问。

核心功能对比与选型指南

功能对比

功能ncsocat
协议支持TCP/UDPTCP/UDP/SSL/UNIX套接字等
加密传输需依赖ncat--ssl选项)原生支持OpenSSL
多路复用不支持支持(fork选项)
端口转发需手动组合命令直接支持
脚本集成简单易用复杂但功能强大
典型场景快速端口扫描、简单文件传输加密通信、协议转换、复杂代理

选型指南

场景推荐工具优势说明典型命令
内网大文件传输nc+tar无需加密,极限速度tar czf - /data | nc...
跨网段服务暴露socat支持协议转换/IPv6socat TCP6-LISTEN...TCP4...
加密远程维护socat双向SSL认证socat OPENSSL...EXEC:/bash
临时日志收集nc快速搭建HTTP服务nc -l 80 < /var/log/nginx/access.log

安全增强方案

网络层防护

最小化监听范围

1
2
3
4
5
# 使用iptables限制访问
sudo iptables -A INPUT -p tcp --dport 8000 ! -s 192.168.1.0/24 -j DROP

# 或仅允许指定IP段访问
socat TCP-LISTEN:8000,fork,range=192.168.1.0/24 ...

审计监控方案

1
2
3
4
5
6
# 使用auditd监控敏感操作
sudo auditctl -w /usr/bin/nc -p x -k net_tool
sudo auditctl -w /usr/bin/socat -p x -k net_tool

# 记录所有传输日志
socat ... 2>&1 | tee /var/log/socat_audit.log

安全使用建议

  1. 禁用高危参数(如nc -e
  2. 定期更新工具版本(修复CVE漏洞)
  3. 敏感操作通过VPN进行

总结

通过合理搭配使用 ncsocat,可以做到:

  • 🚀 效率提升:快速完成日常网络任务
  • 🔧 场景覆盖:从简单调试到复杂网络工程
  • 🛡️ 安全可靠:SSL加密+系统级防护
使用 Hugo 构建
主题 StackJimmy 设计