
在国内部署 IPv6 时,经常遇到 IPv6 地址自动获取失败或连接不稳定的情况。为了解决这个问题,我整合了一份 国内优化版 IPv6 监控脚本,支持日志轮转,并可以通过 systemd 实现开机自动执行和异常重启。
下面我详细介绍脚本及配置方法。
1️⃣ IPv6 监控脚本
脚本核心功能:
- 定时检测 IPv6 连通性
- 自动刷新 IPv6 地址(支持 SLAAC,兼容 NetworkManager 或系统网络服务)
- 日志记录并支持轮转,防止日志无限增长
- 可长时间后台运行
完整脚本如下:
#!/bin/bash
# IPv6检测脚本 - 国内优化版
LOG_FILE="/var/log/ipv6_monitor.log"
MAX_LOG_SIZE=1048576 # 1MB
TEST_HOSTS=(
"2400:3200::1"
"2400:3200:baba::1"
"ipv6.sjtu.edu.cn"
"ipv6.ustc.edu.cn"
"ipv6.baidu.com"
)
MAX_FAILS=3
FAIL_COUNT=0
CHECK_INTERVAL=300
RETRY_INTERVAL=30
log_message() {
# 日志轮转
if [ -f "$LOG_FILE" ] && [ $(stat -c%s "$LOG_FILE") -gt $MAX_LOG_SIZE ]; then
mv "$LOG_FILE" "${LOG_FILE}.1"
echo "$(date '+%Y-%m-%d %H:%M:%S') - 日志文件轮转" > "$LOG_FILE"
fi
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
logger -t ipv6-monitor "$1"
}
check_ipv6() {
local success_count=0
local total_tests=${#TEST_HOSTS[@]}
local required_success=$((total_tests / 2 + 1))
if ! ip -6 route show default | grep -q default; then
log_message "警告: 没有IPv6默认路由"
return 1
fi
for host in "${TEST_HOSTS[@]}"; do
if ping6 -c 2 -W 3 "$host" > /dev/null 2>&1; then
((success_count++))
log_message "检测通过: $host"
else
log_message "检测失败: $host"
fi
sleep 1
done
if host ipv6.sjtu.edu.cn > /dev/null 2>&1; then
((success_count++))
fi
if [ $success_count -ge $required_success ]; then
log_message "IPv6连接正常 (通过 $success_count/$total_tests 个测试点)"
return 0
else
log_message "IPv6连接异常 (仅通过 $success_count/$total_tests 个测试点)"
return 1
fi
}
renew_ipv6() {
log_message "开始重新获取IPv6地址..."
local interface=$(ip -6 route show default | awk '{print $5}' | head -n1)
[ -z "$interface" ] && interface=$(ip link show | grep -E '^[0-9]+:' | grep -v lo: | awk -F': ' '{print $2}' | head -n1)
log_message "使用网络接口: $interface"
ip -6 addr flush dev "$interface"
sleep 2
local method_used=""
if command -v nmcli > /dev/null 2>&1; then
log_message "使用方法1: NetworkManager"
nmcli device disconnect "$interface" 2>/dev/null
sleep 2
nmcli device connect "$interface" 2>/dev/null
method_used="networkmanager"
sleep 10
else
log_message "使用方法2: 重启网络服务"
if command -v systemctl > /dev/null 2>&1; then
systemctl restart systemd-networkd 2>/dev/null || \
systemctl restart NetworkManager 2>/dev/null || \
systemctl restart networking 2>/dev/null
else
service networking restart 2>/dev/null || \
service network-manager restart 2>/dev/null
fi
method_used="restart-service"
sleep 15
fi
sleep 5
if check_ipv6; then
log_message "IPv6地址更新成功 (方法: $method_used)"
else
log_message "警告: IPv6地址更新可能未成功"
fi
}
show_ipv6_info() {
log_message "=== 当前IPv6信息 ==="
ip -6 addr show | grep inet6 | grep -v fe80 | head -5 >> "$LOG_FILE"
ip -6 route show default 2>/dev/null >> "$LOG_FILE"
log_message "===================="
}
log_message "IPv6监控脚本启动"
show_ipv6_info
while true; do
if check_ipv6; then
FAIL_COUNT=0
sleep $CHECK_INTERVAL
else
((FAIL_COUNT++))
log_message "IPv6检测失败次数: $FAIL_COUNT/$MAX_FAILS"
if [ "$FAIL_COUNT" -ge "$MAX_FAILS" ]; then
renew_ipv6
FAIL_COUNT=0
show_ipv6_info
sleep 60
else
sleep $RETRY_INTERVAL
fi
fi
done2️⃣ 脚本改动说明
- 日志轮转:当日志文件大于 1MB 时,自动重命名为
ipv6_monitor.log.1并新建日志文件。 - SLAAC 支持:自动刷新 IPv6 地址,不再使用 dhclient,兼容 NetworkManager 或系统服务。
- 测试点优化:IPv6 测试点改为确认可 ping 通的五个地址。
3️⃣ 自动执行脚本(开机自启)
推荐使用 systemd,可以保证脚本异常退出后自动重启,并可在开机启动。
3.1 保存脚本
sudo nano /usr/local/bin/ipv6_monitor_cn.sh
sudo chmod +x /usr/local/bin/ipv6_monitor_cn.sh3.2 创建 systemd 服务文件
sudo nano /etc/systemd/system/ipv6-monitor.service内容如下:
[Unit]
Description=IPv6 Connection Monitor (China Optimized)
After=network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/ipv6_monitor_cn.sh
Restart=always
RestartSec=10
User=root
[Install]
WantedBy=multi-user.target3.3 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable ipv6-monitor
sudo systemctl start ipv6-monitor查看服务状态:
sudo systemctl status ipv6-monitor实时查看日志:
tail -f /var/log/ipv6_monitor.log✅ 这样,每次开机 systemd 会自动运行你的 IPv6 监控脚本,并保证异常退出时自动重启,长期稳定运行。
这就是完整的 国内优化版 IPv6 监控方案,长期运行无需人工干预,同时保证日志不会无限增长。
评论0
暂时没有评论