住宅IP可用性监控脚本,批量检测代理连通性自动下线坏IP
住宅IP代理池在使用一段时间后,经常会出现部分IP响应缓慢、连接超时或者直接被目标站点屏蔽的情况。
如果这些坏IP还留在池子里,不仅会拖慢业务,还会增加大量无效重试。
本文提供一个轻量的住宅IP可用性监控脚本,能批量检测代理连通性,并自动下线失效IP,适合刚接触代理池维护的用户直接部署使用。
整个方案只需要一个脚本、一个IP列表和一台能执行bash命令的Linux服务器,不需要额外安装复杂组件。
脚本思路:先测通,再判定,最后下线
监控脚本的核心逻辑只有三步:读取代理IP列表 → 逐个发起连接测试 → 把失败或超时的IP标记并下线。
这里说的“下线”并不是删除记录,而是把失效IP移入一个单独的坏IP文件,或者修改上游的加载名单,让程序不再调度这些IP。
在动手写脚本前,你需要准备三样东西:
- 一个包含住宅IP、端口、用户名、密码的文本文件,每行一条记录,字段之间用冒号分隔,例如
1.2.3.4:8080:user:pass - 一个可用的测试目标地址,比如
http://httpbin.org/ip,用来验证代理是否真的能访问外网 - 一台Linux服务器,能执行bash脚本即可,不挑发行版
批量检测脚本与自动下线逻辑
下面这段脚本适合放在服务器上直接运行,它会循环检测每个IP的连通性,失败次数达到阈值后自动写入下线名单。
请把 proxy_list.txt 替换成你的代理列表文件路径。
#!/bin/bash
# 住宅IP可用性监控脚本
PROXY_FILE="/opt/proxy_check/proxy_list.txt"
BAD_FILE="/opt/proxy_check/bad_ip.txt"
TEST_URL="http://httpbin.org/ip"
FAIL_THRESHOLD=2
TIMEOUT=10
temp_file="${PROXY_FILE}.tmp"
: > "$temp_file"
: > "$BAD_FILE"
while IFS= read -r line; do
[ -z "$line" ] && continue
ip=$(echo "$line" | cut -d':' -f1)
port=$(echo "$line" | cut -d':' -f2)
user=$(echo "$line" | cut -d':' -f3)
pass=$(echo "$line" | cut -d':' -f4)
fail_count=0
for i in $(seq 1 $FAIL_THRESHOLD); do
if curl -x "http://${user}:${pass}@${ip}:${port}" --connect-timeout "$TIMEOUT" -o /dev/null -s -w "%{http_code}" "$TEST_URL" | grep -q 200; then
fail_count=0
break
else
fail_count=$((fail_count+1))
fi
done
if [ "$fail_count" -ge "$FAIL_THRESHOLD" ]; then
echo "$line" >> "$BAD_FILE"
echo "[下线] $ip:$port"
else
echo "$line" >> "$temp_file"
fi
done < "$PROXY_FILE"
mv "$temp_file" "$PROXY_FILE"
echo "检测完成,有效IP已保留,失效IP已写入 bad_ip.txt"
完成检测后,源文件 proxy_list.txt 会自动移除所有检测失败的IP,被移除的IP会聚集在 bad_ip.txt 里。
你可以在业务端加上一个定时任务,比如每隔10分钟执行一次脚本,就能持续保持代理池可用。
建议先把脚本保存为 check_proxy.sh,然后执行 chmod +x check_proxy.sh 赋予权限。
部署时容易踩的几个坑
第一次运行脚本时,最常遇到的问题是curl 未安装、认证信息含特殊字符和误杀慢IP。
这里给你三条避坑建议:
- 检测前先执行
which curl确认curl存在,没有就安装:apt install curl -y或yum install curl -y - 如果用户名或密码中包含
@、:、%等特殊字符,curl 会解析异常,建议先用--proxy-user "user:pass"参数替代直接拼接URL格式 - 住宅IP本身延迟波动比较大,阈值建议保持在2次测试,超时时间不要低于5秒,否则容易把正常IP误判为坏IP
另外,如果你使用的是宝塔面板,执行脚本前记得在Supervisor或cron里设置正确的环境变量,避免脚本因PATH问题找不到curl命令。
怎么验证脚本真的生效
脚本跑完不能只看输出,需要实际确认IP是否已经无法使用。
你可以分别查看正常工作名单和失效名单里的IP,手动测试一个被下线的IP:
curl -x "http://user:pass@下线IP:port" --connect-timeout 5 http://httpbin.org/ip
正常情况下,这个请求会超时或返回代理错误,说明下线判断准确。
与此同时,随机抽验 proxy_list.txt 里剩余的IP,应该都能正常返回目标网页内容。
如果业务端有监控面板,也可以观察代理池请求成功率是否上升。
建议首次运行前先备份 proxy_list.txt,避免脚本逻辑异常导致有效IP被误删。
关于住宅IP监控的常见疑问
脚本能否同时检测 IPv4 和 IPv6 住宅IP? 可以,只要你的服务器支持对应网络栈,并保证curl能通过IPv6地址连接代理即可。
但注意IPv6地址中包含冒号,不能简单用冒号作字段分隔符,建议改用逗号或竖线分隔。
如何让下线IP自动重新上线? 坏IP有可能是临时抖动,不一定永久失效。
你可以把 bad_ip.txt 里的IP单独再做一次延迟测试,连续通过后再手动加回正式列表。
追求自动化的用户,可以配合一个第二脚本定期重测坏IP,恢复条件设为连续三次检测成功。
监控频率设多久比较合理? 住宅IP的稳定性随服务商和地区差异较大,一般业务建议10到15分钟检测一轮。
频率太高容易触发目标站点反爬,反而增加误封风险;
频率太低则无法及时清理失效IP。
住宅IP代理池的维护重点不是出问题后的紧急替换,而是常态化的自动检测。
这套脚本帮你把最耗时的探测和下线动作自动化,之后只需要定期观察坏IP文件和整体代理池规模,就能比较省心地保持业务稳定运行。
如果在生产环境使用,建议同时保留一份历史日志,方便定位某段时间代理池质量下滑的原因。