如何定期重启OpenWRT的PPPOE接口?

OpenWRT

1 前言

一个问题,一篇文章,一出故事。
笔者把路由设备更换为OpenWRT,基于中国电信分配的公网IP地址需要不定时更换,因此笔者希望借助脚本将其定期更换。

2 最佳实践

2.1 创建脚本

vim /root/scripts/pppoeReconnect.sh

加入如下配置,

#!/bin/sh

# Configuration (DO NOT CHANGE THESE VALUES)
logicalIf="wlan"          # Logical interface name in UCI config
pppoeIf="pppoe-wlan"      # Virtual PPPoE interface
phyIf="eth0"              # Physical NIC
maxWait=60                # Maximum wait time in seconds
logFile="/var/log/pppoeReconnect.log"

# Function: Safely get current IP
getIp() {
    ip -4 addr show $pppoeIf 2>/dev/null | awk '/inet/{print $2}' | cut -d'/' -f1
}

# Logging using echo
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $logFile
    echo "PPPoE: $1"
}

# Main process
log "=== Starting PPPoE reconnection ==="
oldIp=$(getIp)
log "Current IP: ${oldIp:-None}"

# Phase 1: Graceful restart
log "Attempting graceful restart..."
ifdown $logicalIf 2>/dev/null
sleep 5
ifup $logicalIf 2>/dev/null
                                                    
# Phase 2: Force restart if needed                                               
if [ -z "$(getIp)" ]; then                                                       
    log "Graceful restart failed, forcing..."           
    {                                                   
        killall -9 pppd 2>/dev/null                     
        ip link set $phyIf down                         
        sleep 2                                         
        ip link set $phyIf up                
        sleep 3                              
        ifup $logicalIf                      
    } 2>/dev/null                            
fi                                           
                                             
# Verification with timeout                  
timeout=$maxWait                             
while [ $timeout -gt 0 ] && [ -z "$(getIp)" ]; do
    sleep 5                                      
    timeout=$((timeout-5))                       
    log "Waiting for IP... (${timeout}s left)"   
done                                             
                                                 
# Result handling                                
newIp=$(getIp)                                   
if [ -n "$newIp" ]; then                         
    if [ "$newIp" != "$oldIp" ]; then            
        log "SUCCESS! New IP: $newIp"            
    else                                         
        log "WARNING: IP unchanged ($newIp), ISP may limit changes"
    fi                                                             
else                                                               
    log "FAILED! Last error: $(logread | grep pppd | tail -n 1 2>/dev/null || echo 'unknown error')"
    exit 1                                                                                          
fi

2.2 测试脚本

sh /root/scripts/pppoeReconnect.sh

2.3 设置脚本触发

crontab -e

加入如下配置,

0 3 * * * sh /root/scripts/pppoeReconnect.sh
没有评论

发表回复

OpenWRT
如何扩容openWRT根分区?

1 前言 一个问题,一篇文章,一出故事。 笔者今天需要在Proxmox Virtual Enviro …

OpenWRT
如何设置openWRT的静态IP地址?

1 前言 一个问题,一篇文章,一出故事。 笔者今天部署了openWRT, 2 最佳实践 2.1 op …

OpenWRT
如何配置openWRT Zabbix Agent

1 前言 一个问题,一篇文章,一出故事。 笔者今天部署想把openWRT加入到Zabbix里面监控, …