目的:实时监控台湾 VPS 的原生(公网)IP 可达性并在异常时自动修复。要点:1) 定期外连探测(ICMP/HTTP);2) 本地网络重置动作(restart network、dhclient);3) 若本机无法修复则调用 VPS 提供商 API 远程重启或切换 IP;4) 告警到 Slack/Telegram/邮件并记录日志以供审计。
步骤:1) 确认 VPS 有公网管理 API(文档、API Key);2) 在 VPS 上安装基础工具:curl、jq、iputils-ping、traceroute;命令示例:apt install -y curl jq iputils-ping traceroute;3) 规划外部探测目标(推荐 8.8.8.8、1.1.1.1、你的监控节点 IP);4) 准备告警 webhook(Slack/Telegram)和一个存放日志的目录,例如 /var/log/ip-monitor/。
脚本要点:1) 每次检测:检测 ICMP、检测外网 HTTP(curl ifconfig.me)、检查本地网口状态(ip addr show eth0);2) 判断规则:若连续 N 次 ping 失败且本地链路 down 或外网 IP 与期望不符则判定故障;3) 示例核心判断(伪代码):check_ping && check_http && check_ip_same;4) 建议把脚本放 /usr/local/bin/ip_monitor.sh 并赋可执行权限。
优先级与动作:1) 先重启网络接口:ip link set dev eth0 down && ip link set dev eth0 up;2) 如果使用 DHCP:dhclient -r eth0 && dhclient eth0;3) 重启网络服务:systemctl restart networking || systemctl restart NetworkManager;4) 记录每一步输出到 /var/log/ip-monitor/repair.log 并在成功时退出并发送恢复告警。
当本机操作无效时:1) 用 Provider 的 API 发起软重启或硬重启(使用 curl 调用带 API Key 的 endpoint);2) 如果支持 IP 切换:调用解绑/绑定 IP 或请求重新分配公网 IP;3) 示例:curl -X POST "https://api.provider.com/v1/servers/{id}/reboot" -H "Authorization: Bearer TOKEN";4) 将 API 响应写入日志并触发告警包含 Request ID 以便人工跟进。
告警策略:1) 异常立即发送告警到 Slack/Telegram 并附上失败类型与最近日志片段;2) 告警模板包含:时间、主机名、检测结果、采取动作、API 返回;3) 使用 curl 调用 webhook:curl -X POST -H 'Content-type: application/json' --data '{"text":"..."}' WEBHOOK_URL;4) 同时写入本地 rotating log 便于后续分析(logrotate 配置 /etc/logrotate.d/ip-monitor)。
部署方式:1) 推荐用 systemd service + timer:创建 /etc/systemd/system/ip-monitor.service 调用 /usr/local/bin/ip_monitor.sh;创建 ip-monitor.timer 每 1 分钟触发;2) 若使用 cron:*/1 * * * * root /usr/local/bin/ip_monitor.sh >/dev/null 2>&1;3) 为避免重复运行,脚本内使用锁文件(flock)或 pidfile。
安全要点:1) API Key 存放使用受限权限的凭证文件并chmod 600,或使用系统密钥管理(Vault);2) 脚本运行用户尽量使用非 root,必要动作(重启网卡、调用 provider)通过 sudo 授权特定命令;3) 审计:将每次自动修复动作的 stdout/stderr 与 API 响应归档 30 天。
问:如果脚本误报导致频繁重启怎么办?
答:采取防护措施:1) 设定阈值(连续失败次数 >=3 才触发);2) 每次触发后启用冷却期(例如 10 分钟内不再执行重启);3) 在执行危险动作前先发送告警并等待人工确认(可配置为半自动模式);4) 在日志中保留可回滚信息。
问:如何检测是真正的公网 IP 丢失还是仅 ICMP 被封?
答:组合检测:1) 同时做 ICMP、TCP(如 curl 到 http://ifconfig.me)、traceroute;2) 若 ICMP 失败但 HTTP 能返回正确公网 IP,说明仅 ICMP 被过滤;3) 根据结果采取不同动作:对 ICMP 过滤只发送告警,不重启;对 HTTP/IP 不一致或无法访问则执行修复流程。
问:如何把自动修复纳入企业级监控(如 Prometheus/Alertmanager)?
答:集成方式:1) 将脚本的健康状态暴露为 Prometheus 指标(使用 textfile collector 或 /metrics HTTP 服务);2) 在 Alertmanager 中配置告警规则(如 ip_down 且持续时间 >5m 触发);3) 在告警接收器中配置 runbook 链接和自动触发 webhook,webhook 可调用一个受控的修复服务并记录操作 ID。