网络诊断与运维技巧
网络运维中常用的诊断和调试技巧。
HTTP 状态码
HTTP 状态码用来表示请求是否成功,以及出现了什么错误。
状态码分类
| 范围 | 类型 | 说明 |
|---|---|---|
| 1xx (100-199) | 信息性 | 请求正在处理 |
| 2xx (200-299) | 成功 | 请求正常处理完毕 |
| 3xx (300-399) | 重定向 | 需要进一步操作 |
| 4xx (400-499) | 客户端错误 | 请求有问题或无法实现 |
| 5xx (500-599) | 服务器错误 | 服务器处理时出错 |
不常见的状态码
| 状态码 | 说明 | 备注 |
|---|---|---|
| 101 | 切换协议 | 服务器同意切换到请求的协议,常用于 WebSocket |
| 104 | 连接重置 | Nginx 定义,客户端取消了请求 |
| 429 | 请求过多 | 触发了频率限制 |
| 499 | 客户端关闭连接 | Nginx 定义,客户端在服务器响应前关闭了连接 |
104 连接重置示例
('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
常见场景:AWS NAT Gateway 会在 30 秒内关闭空闲连接,导致客户端收到 104 错误。
499 客户端关闭连接
这是 Nginx 自定义的状态码,表示客户端在服务器准备响应前就关闭了连接,通常发生在用户取消请求时。
TCP 端口连通性测试
需要测试远程服务器的某个端口(如 MySQL 的 3306)是否可访问。介绍几种常用的测试方法。
快速测试方法
使用 nc (推荐)
最简洁的方式:
nc -zv 192.168.1.100 3306
输出:
Connection to 192.168.1.100 3306 port [tcp/mysql] succeeded!
参数说明:
-z:扫描模式,不发送数据-v:显示详细信息
使用 telnet
传统方式:
telnet 192.168.1.100 3306
成功时会显示:
Trying 192.168.1.100...
Connected to 192.168.1.100.
退出方式:按 Ctrl + ],然后输入 quit
批量测试端口
nc 批量扫描
# 测试多个端口
for port in 3306 80 443 22; do
nc -zv -w 3 192.168.1.100 $port
done
扫描端口范围
# 扫描 3000-3010 端口
nc -zv 192.168.1.100 3000-3010
高级测试方法
使用 nmap
功能最强大的扫描工具:
# 扫描单个端口
nmap -p 3306 192.168.1.100
# 扫描多个端口
nmap -p 3306,80,443 192.168.1.100
# 扫描端口范围
nmap -p 3000-4000 192.168.1.100
# 快速扫描(跳过主机发现)
nmap -Pn -p 3306 192.168.1.100
输出示例:
PORT STATE SERVICE
3306/tcp open mysql
使用 timeout 避免卡住
# 3 秒超时
timeout 3 bash -c "cat < /dev/null > /dev/tcp/192.168.1.100/3306"
# 检查返回值
if [ $? -eq 0 ]; then
echo "端口 3306 开放"
else
echo "端口 3306 关闭或超时"
fi
使用 /dev/tcp (内置方法)
不需要额外工具:
# Bash 内置 TCP 测试
(echo > /dev/tcp/192.168.1.100/3306) &>/dev/null && echo "开放" || echo "关闭"
编写测试脚本
#!/bin/bash
host="192.168.1.100"
port=3306
timeout=3
# 测试端口
if timeout $timeout bash -c "cat < /dev/null > /dev/tcp/$host/$port" 2>/dev/null; then
echo "✓ $host:$port 可访问"
exit 0
else
echo "✗ $host:$port 不可访问"
exit 1
fi
使用:
chmod +x test-port.sh
./test-port.sh
方法对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
nc | 简单快速 | 需要安装 | 日常测试 |
telnet | 通用性好 | 难以脚本化 | 交互式测试 |
nmap | 功能强大 | 较慢,需要安装 | 批量扫描 |
/dev/tcp | 无需工具 | 仅 Bash 支持 | 脚本中使用 |
timeout + /dev/tcp | 内置 + 超时控制 | 语法复杂 | 生产脚本 |
安装工具
CentOS/RHEL
yum install nc nmap telnet
Ubuntu/Debian
apt-get install netcat nmap telnet
macOS
brew install netcat nmap telnet
注意事项
telnet连接成功后需要手动退出,不适合脚本nc的-w参数可以设置超时时间nmap扫描大量端口可能触发防火墙告警/dev/tcp方法在某些受限环境下可能不可用- 使用
timeout命令避免无限等待