从基础到高级实战

目录导读
- 为什么需要脚本测试端口连通性?
- 端口连通性测试的核心原理
- 新手必学:使用Telnet与nc测试端口
- 高手进阶:Shell脚本自动化批量检测
- 跨平台方案:Python脚本实现端口扫描
- 常见问题问答(Q&A)
- 最佳实践与安全建议
为什么需要脚本测试端口连通性?
在运维与开发工作中,端口连通性测试是网络故障排查的基础操作,无论是检查Web服务是否正常(如80/443端口),还是验证数据库、中间件连接(如3306、6379),手动一条条执行telnet命令不仅低效,还容易遗漏关键节点。
脚本化测试的优势在于:
- 批量检测:针对多台服务器、多个端口一次性扫描
- 定时巡检:结合cron任务实现自动化监控
- 结果记录:生成日志文件便于复盘
- 告警触发:当端口不通时自动发邮件或钉钉通知
端口连通性测试的核心原理
端口测试底层依赖TCP三次握手,脚本工具(如nc、telnet、Python socket)会向目标IP的指定端口发送SYN包,若收到SYN-ACK响应,则认为端口开放;否则超时或收到RST/ICMP不可达。
需要注意:ICMP防火墙可能阻止ping但允许端口通信,而端口探测也可能被防火墙的ACL规则过滤,因此脚本测试结果需结合业务场景解读。
新手必学:使用Telnet与nc测试端口
telnet(系统自带,但部分环境需安装)
telnet 192.168.1.1 22
若连接成功,会返回SSH版本信息;若失败,提示“连接被拒绝”或“找不到主机”。
nc(netcat)(更灵活,推荐)
nc -zv 192.168.1.1 80
-z:扫描模式,不发送数据-v:详细输出 输出示例:Connection to 192.168.1.1 port 80 [tcp/http] succeeded!
高手进阶:Shell脚本自动化批量检测
以下脚本可检测多个IP与端口的连通性,输出结果并记录日志:
#!/bin/bash
# port-check.sh
HOSTS=("192.168.1.1" "192.168.1.2")
PORTS=(22 80 443 3306)
LOG_FILE="/tmp/port_check_$(date +%Y%m%d).log"
for host in "${HOSTS[@]}"; do
for port in "${PORTS[@]}"; do
timeout 3 bash -c "echo >/dev/tcp/$host/$port" 2>/dev/null
if [ $? -eq 0 ]; then
echo "[OK] $host:$port is reachable" | tee -a $LOG_FILE
else
echo "[FAIL] $host:$port is not reachable" | tee -a $LOG_FILE
fi
done
done
关键技巧:
- 使用
/dev/tcp特殊文件实现无需外部工具的TCP连接测试 timeout命令防止长时间卡死- 结合crontab可定时执行:
*/5 * * * * /path/port-check.sh
跨平台方案:Python脚本实现端口扫描
Python的socket模块能更精准控制超时和错误处理:
#!/usr/bin/env python3
# port_scanner.py
import socket
def check_port(host, port, timeout=3):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
try:
result = sock.connect_ex((host, port))
sock.close()
return result == 0
except socket.error as e:
print(f"Error: {e}")
return False
targets = [("google.com", 80), ("gitlab.example.com", 443)]
for host, port in targets:
status = "Open" if check_port(host, port) else "Closed/Filtered"
print(f"{host}:{port} - {status}")
优势:
- 支持IPv6、UDP(需修改socket类型)
- 可扩展为多线程扫描(使用
concurrent.futures) - 兼容Windows/Linux/macOS
常见问题问答(Q&A)
Q1: 为什么telnet能连上,但应用认为连接失败? A: 可能是应用层协议不匹配,例如端口开放但要求SSL握手(SMTP的465端口需TLS),Telnet纯TCP连接后无协议交互,应用会主动断开。
Q2: 如何测试UDP端口连通性? A: UDP无连接特性,脚本需发送特定应用层数据(如DNS查询)并等待响应,Python示例:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(3) sock.sendto(b'\x00\x00\x01\x00\x00\x01', (host, 53)) data, addr = sock.recvfrom(1024)
若收到回复则端口可达。
Q3: 脚本测试显示端口通,但业务却报错? A: 检查:
- 目标端口是否绑定正确IP(如Nginx监听127.0.0.1而非0.0.0.0)
- 防火墙规则是否限制特定源IP
- 目标服务是否过载(连接数限制)
最佳实践与安全建议
- 权限控制:扫描端口可能被安全设备告警,生产环境建议使用专用监控IP
- 速度控制:批量扫描时增加
timeout和间隔,避免被判定为DoS攻击 - 协议感知:对HTTP/HTTPS端口增加curl验证
curl -s -o /dev/null -w "%{http_code}" http://target:8080/health - 日志归档:使用gzip压缩历史日志,保留30天
- 告警集成:将检测结果通过API推送给Prometheus或Zabbix
通过本文的脚本方案,你可以从手动测试升级为自动化巡检,显著提升网络运维效率,建议先在小范围测试环境验证脚本逻辑,再正式部署至生产系统。