Для реализации переключения (failover) между точками доступа на OpenWrt лучше всего подходит режим **AP+STA** (когда роутер одновременно принимает интернет по Wi-Fi и раздает его), а не устаревший режим `relayd`. В режиме AP+STA у каждого подключения есть свой сетевой интерфейс, которыми можно управлять через скрипты.

Ниже представлен скрипт для автоматического переключения. Он проверяет наличие интернета через основной канал, и если пинг не проходит, отключает текущую STA-сеть и подключается к резервной.

### 1. Настройка интерфейсов в LuCI (предварительный шаг)
Перед установкой скрипта необходимо настроить два профиля подключения:
1. Зайдите в Network -> Wireless.
2. Добавьте новое беспроводное соединение (`Add`), выберите устройство `radio0` (или ваше), установите Mode: **Client**, укажите SSID, пароль и сеть `wwan_main` первой точки доступа. Включите его.
3. Добавьте еще одно соединение, также Mode: **Client**, но для второй точки доступа. Назовите сеть `wwan_backup`.
4. Убедитесь, что ваша точка доступа (AP) работает в сети `lan`.
5. В разделе Network -> Interfaces убедитесь, что интерфейсы `wwan_main` и `wwan_backup` используют протокол DHCP Client.

### 2. Скрипт переключения

Создайте файл `/etc/wifi_failover.sh`:

```bash
#!/bin/sh

# --- НАСТРОЙКИ ---
# Интерфейс радиомодуля (обычно radio0 или radio1)
RADIO="radio0"

# Профиль 1 (Основной)
SSID_MAIN="VashaOsnovnayaSet"
ENC_MAIN="psk2"
KEY_MAIN="parol_ot_osnovnoi_seti"
NETWORK_MAIN="wwan_main"

# Профиль 2 (Резервный)
SSID_BACKUP="VashaRezervnayaSet"
ENC_BACKUP="psk2"
KEY_BACKUP="parol_ot_rezervnoi_seti"
NETWORK_BACKUP="wwan_backup"

# Хост для проверки интернета (лучше использовать надежный IP, например Cloudflare DNS)
PING_HOST="1.1.1.1"
PING_COUNT=2
TIMEOUT_SEC=5

# Лог-файл (в tmpfs, чтобы не изнашивать флешку)
LOGFILE="/tmp/failover.log"

# --- ЛОГИКА СКРИПТА ---

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOGFILE"
}

get_active_network() {
    # Проверяем, какой клиентский интерфейс сейчас поднят
    if uci get wireless.@wifi-iface[1].disabled 2>/dev/null | grep -q "0"; then
        # Если первый клиент включен, смотрим его имя
        uci get wireless.@wifi-iface[1].network
    else
        uci get wireless.@wifi-iface[2].network
    fi
}

switch_to() {
    local target_ssid=$1
    local target_enc=$2
    local target_key=$3
    local target_net=$4
   
    log "Switching to $target_ssid"
   
    # Отключаем все STA-интерфейсы на этом радио
    uci set wireless.@wifi-iface[1].disabled=1
    uci set wireless.@wifi-iface[2].disabled=1
   
    # Находим индексы наших интерфейсов динамически, так как порядок может меняться
    MAIN_IDX=$(uci show wireless | grep "${NETWORK_MAIN}" | cut -d. -f2 | cut -d] -f1)
    BACKUP_IDX=$(uci show wireless | grep "${NETWORK_BACKUP}" | cut -d. -f2 | cut -d] -f1)
   
    # Определяем, на какой индекс переключаемся
    if [ "$target_net" = "$NETWORK_MAIN" ]; then
        ACTIVE_IDX=$MAIN_IDX
    else
        ACTIVE_IDX=$BACKUP_IDX
    fi
   
    # Применяем настройки целевого профиля
    uci set wireless.@wifi-iface[$ACTIVE_IDX].ssid="$target_ssid"
    uci set wireless.@wifi-iface[$ACTIVE_IDX].encryption="$target_enc"
    uci set wireless.@wifi-iface[$ACTIVE_IDX].key="$target_key"
    uci set wireless.@wifi-iface[$ACTIVE_IDX].disabled=0
   
    uci commit wireless
    wifi up "$RADIO"
   
    # Даем время на установку соединения
    sleep 10
   
    # Принудительно обновляем маршрут по умолчанию
    network_flush_routes
    /etc/init.d/network restart
}

# Проверка наличия интернета
if ping -c $PING_COUNT -W $TIMEOUT_SEC $PING_HOST >/dev/null 2>&1; then
    CURRENT_NET=$(get_active_network)
    log "Internet is OK via $CURRENT_NET. Nothing to do."
    exit 0
else
    log "Ping failed. No internet connection."
   
    CURRENT_NET=$(get_active_network)
   
    if [ "$CURRENT_NET" = "$NETWORK_MAIN" ]; then
        switch_to "$SSID_BACKUP" "$ENC_BACKUP" "$KEY_BACKUP" "$NETWORK_BACKUP"
        log "Switched to Backup."
    else
        switch_to "$SSID_MAIN" "$ENC_MAIN" "$KEY_MAIN" "$NETWORK_MAIN"
        log "Switched to Main."
    fi
fi
```

### 3. Установка и запуск

1. Сохраните содержимое выше в файл `/etc/wifi_failover.sh` на вашем роутере.
2. Сделайте файл исполняемым:
   ```bash
   chmod +x /etc/wifi_failover.sh
   ```
3. Проверьте работу вручную:
   ```bash
   /etc/wifi_failover.sh
   tail -f /tmp/failover.log
   ```
4. Для автоматизации добавьте задачу в планировщик Cron.
   *В веб-интерфейсе:* System -> Scheduled Tasks.
   *Добавьте строку* (проверка каждые 2 минуты):
   ```
   */2 * * * * /etc/wifi_failover.sh
   ```
   Или через консоль:
   ```bash
   crontab -e
   # Добавить строку:
   */2 * * * * /etc/wifi_failover.sh
   ```

### Важные технические нюансы:
* **Почему нельзя просто выключать интерфейс?** При падении одной точки доступа таблица маршрутизации часто продолжает хранить старый мертвый маршрут. Команды `network_flush_routes` и перезапуск службы `/etc/init.d/network` внутри скрипта принудительно очищают старые маршруты и запрашивают новые через DHCP.
* **Износ памяти:** Использование `/tmp/` для логов обязательно, так как это оперативная память. Постоянная запись на внутреннюю флеш-память (NAND/NOR) быстро выведет роутер из строя.
* **Проблема «мертвой зоны»:** Когда основная точка пропадает, связь обрывается мгновенно, но переподключение к резервной занимает от 5 до 15 секунд. В этот момент интернет будет недоступен.
* **Индексы интерфейсов:** В скрипте используется поиск индекса `[1]` и `[2]` через `uci show`, так как при ручной правке конфигов порядок секций `wifi-iface` может измениться, и жестко прописанные цифры перестанут работать.
* **Режим репитера vs AP+STA:** Режим с пакетом `relayd` создает один плоский мост. В такой конфигурации реализовать программный failover крайне сложно, так как нет разделения на независимые аплинки. Схема AP+STA предпочтительна именно потому, что каждый профиль — это отдельный WAN-интерфейс с точки зрения системы.{{{1|https://github.com/Citizen-2CB8A24A/failover|[]|[]|GitHub - Citizen-2CB8A24A/failover: OpenWRT failover script...}}}{{{2|https://sprut.ai/article/rezhim-repitera-na-openwrt-ustanovka-i-nastroyka|[]|[]|Режим репитера на OpenWRT. Установка и настройка - Sprut.AI}}}{{{3|https://cisoclub.ru/bdu-2023-05699/|[]|[]|BDU:2023-05699 (CVE-2021-32019) — уязвимость интерфейса…}}}{{{4|https://www.securitylab.ru/news/556788.php|[]|[]|Вечный двигатель Wi-Fi: OpenWrt представил первый бессмертный роутер}}}{{{5|https://codeby.net/threads/wi-fi-autopwner-skript.58872/|[]|[]|Wi-Fi-Autopwner. Скрипт. - Форум информационной безопасности - Codeby.net}}}