В связи с блокировками со стороны Роскомнадзора, возникает необходимость обойти такие ограничения для WireGuard на вашем роутере. Это можно сделать путем отправки одного произвольного UDP-пакета, который нарушает первоначальное распознавание протокола WireGuard. Следуйте этим шагам, чтобы настроить решение на базе прошивки AsusWRT-Merlin.
Сейчас я разрабатываю установку AmneziaWG для роутеров ASUS с прошивкой AsusWRT-Merlin, что обеспечит более устойчивое и автоматизированное решение этих проблем. Отправка UDP-пакета является временным решением для обхода текущих ограничений, пока не будет завершена интеграция AmneziaWG
Шаг 1: Установка прошивки [AsusWRT-Merlin](https://www.asuswrt-merlin.net/)
Начнем с того, что роутер должен быть прошит прошивкой AsusWRT-Merlin. Проверьте, поддерживается ли ваш роутер, перейдя на сайт AsusWRT-Merlin. Следуйте инструкциям на сайте для установки прошивки.Шаг 2: Подключение USB флешки и установка [Entware](https://github.com/RMerl/asuswrt-merlin.ng/wiki/Entware)
- 
Процесс установки и настройки должен выполняться через telnet или SSH. Если эта часть кажется вам сложной, то лучше сразу отказаться от использования Entware, поскольку все необходимо устанавливать и настраивать через telnet/SSH. 
- 
Для начала, перейдите в веб-интерфейс вашего роутера, чтобы включить доступ по SSH. В данном примере эта настройка находится следующим образом: Администрирование -> Система. 
- Вам необходимо подключить USB-диск, отформатированный в нативной файловой системе Linux (ext2, ext3 или ext4). Чтобы отформатировать диск, используйте утилиту amtm. Подключите USB-диск к вашему роутеру, затем запустите amtm командой
amtm
 
и выберите опцию 'fd' для форматирования диска.
- Чтобы начать процесс установки Entware запустите приложение amtm в терминале, выполнив команду
amtm
Меню предложит вам опцию 'ep' для начала установки Entware.
Если у вас используется версия прошивки старше 384.15 (или 384.13_4 для моделей RT-AC87U и RT-AC3200), тогда начните установку, запустив скрипт "entware-setup.sh".
Шаг 3: Установка [WireGuard Manager](https://github.com/MartineauUK/wireguard)
1. Для установки WireGuard Manager, выполните:amtm
- 
Набирайте iдалееwgдля устновки Wireguard Manager.
- 
После установки, для доступа к интерфейсу WireGuard Manager в терминале роутера введите: 
wg_manager
Шаг 4: Добавление [клиента](https://github.com/ZebMcKayhan/WireguardManager?tab=readme-ov-file#import-client)
- Разместите файл конфигурации клиента в:
/opt/etc/wireguard.d/
- Назовите файл, как вам удобно, но завершите его .conf (например, wireguard.conf). Включите ListenPort в конфигурацию.
[Interface]
## wireguard.conf
Address = 10.2.100.2/32
PrivateKey = 2D8Y..../Uo=
DNS = 10.100.0.1. # DNS указан ip адреса роутера для использования dnsmasq с ipset
ListenPort=56012
[Peer]
PublicKey = nK8eL....HE=
PreSharedKey = L....=
AllowedIPs =  0.0.0.0/0, ::/0
Endpoint = 11.22.33.44:443 # Адрес сервера 
PersistentKeepalive = 10  
- Импортируйте конфигурацию в WireGuard Manager, используя:
E:Option ==> import wireguard.conf
- Проверьте успешность импорта командой peer в WireGuard Manager.
- Интерфейс можно активирвовать командой start wg11, где wg11 - это имя вашего клиента. Пока автивировать не нужно. Дополнительные команды можно найти здесь
Шаг 5: Установка скрипта для автоматической отправки пакетов UDP
1. Установите socat:opkg update
opkg install socat
- Перейдите в /jffs/scriptsи создайте новый скриптwireguard.sh:
nano /jffs/scripts/wireguard.sh
Примечание: Если nano не установлен, выполните:
opkg update
opkg install nano
- Вставьте в редактор следующий скрипт и измените название интерфейсов, если необходимо. Обратите внимание на строку, где указан список интерфейсов WireGuard. Измените значение WG_INTERFACES на название интерфейса, который вы используете.
#!/bin/bash
# Определяем файл журнала на USB-устройстве
LOG_FILE="/tmp/mnt/usb/logs/wireguard_unblock.log"
# Убедимся, что каталог для лога существует
mkdir -p "$(dirname "$LOG_FILE")"
# Перенаправляем stdout и stderr в файл журнала
exec 1>>"$LOG_FILE" 2>&1
# Функция для записи сообщений в лог с отметкой времени
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}
# Список интерфейсов WireGuard, которые нужно обработать, в виде строки
WG_INTERFACES="wg11"
# Начало выполнения скрипта
log "Script execution started"
# Обрабатываем каждый интерфейс из списка строк
for WG_INTERFACE in $WG_INTERFACES; do
    WG_CONFIG="/opt/etc/wireguard.d/$WG_INTERFACE.conf"
    # Убедимся, что файл конфигурации существует
    if [ ! -f "$WG_CONFIG" ]; then
        log "Файл конфигурации для $WG_INTERFACE не существует: $WG_CONFIG"
        continue
    fi
    log "Обработка интерфейса $WG_INTERFACE"
    # Определяем необходимые функции и логику здесь
    get_wireguard_endpoint() {
        grep "Endpoint" "$WG_CONFIG" | cut -d'=' -f2 | tr -d ' '
    }
    get_wireguard_ip() {
        local ip_with_mask
        ip_with_mask=$(grep "Address" "$WG_CONFIG" | cut -d'=' -f2 | tr -d ' ')
        echo "${ip_with_mask%/*}"
    }
    get_listen_port() {
        grep "ListenPort" "$WG_CONFIG" | cut -d'=' -f2 | tr -d ' '
    }
    get_peer_public_key() {
        grep "PublicKey" "$WG_CONFIG" | cut -d'=' -f2 | tr -d ' '
    }
    update_listen_port() {
        local new_port="$1"
        log "Изменение ListenPort в конфигурации WireGuard на $new_port"
        sed -i "s/^ListenPort=.*/ListenPort=$new_port/" "$WG_CONFIG"
    }
    is_wireguard_running() {
        ip link show "$WG_INTERFACE" > /dev/null 2>&1
        return $?  # Возвращает 0, если интерфейс найден, и ненулевое значение, если нет
    }
    send_socat_packet() {
        local source_port="$1"
        local endpoint="$2"
        log "Отправка UDP-пакета с использованием socat с исходного порта $source_port на конечную точку $endpoint"
        echo ":)" | socat - UDP:"$endpoint",sourceport="$source_port"
    }
    check_data_transfer_status() {
        local peer_public_key="$1"
        local data_received
        data_received=$(wg show "$WG_INTERFACE" transfer | grep "$peer_public_key" | awk '{print $3}')
        log "Получено данных: $data_received байт"
        if [ "$data_received" -eq 92 ] || [ "$data_received" -eq 148 ]; then
            log "Полученные данные остаются постоянными на уровне $data_received байт, что может указывать на блокировку рукопожатия"
            return 1
        else
            log "Передача данных выглядит нормально"
            return 0
        fi
    }
    attempt_wireguard_connection() {
        local port="$1"
        local endpoint="$2"
        local peer_public_key="$3"
        log "Попытка подключения WireGuard с портом $port и конечной точкой $endpoint для интерфейса $WG_INTERFACE"
        send_socat_packet "$port" "$endpoint"
        sleep 2
        log "Запуск интерфейса WireGuard $WG_INTERFACE"
        wgmExpo "start $WG_INTERFACE"
        sleep 10
        if check_data_transfer_status "$peer_public_key"; then
            log "Подключение успешно"
            return 0
        else
            log "Ошибка из-за возможной блокировки рукопожатия"
            return 1
        fi
    }
    if is_wireguard_running; then
        log "Интерфейс WireGuard $WG_INTERFACE выполняется"
        peer_public_key=$(get_peer_public_key)
        log "Использование Peer PublicKey $peer_public_key из конфигурации WireGuard"
        if check_data_transfer_status "$peer_public_key"; then
            log "Рукопожатие действительно, пропуск интерфейса $WG_INTERFACE."
            continue
        fi
    fi
    endpoint=$(get_wireguard_endpoint)
    log "Использование Endpoint $endpoint из конфигурации WireGuard"
    initial_port=$(get_listen_port)
    log "Использование первоначального ListenPort $initial_port из конфигурации WireGuard"
    if attempt_wireguard_connection "$initial_port" "$endpoint" "$peer_public_key"; then
        log "Подключение WireGuard успешно установлено с портом $initial_port"
        continue
    fi
    while true; do
        log "Остановка интерфейса WireGuard $WG_INTERFACE"
        wgmExpo "stop $WG_INTERFACE"
        sleep 10
        new_port=$((RANDOM % (65535 - 49152 + 1) + 49152))
        log "Попытка нового случайного ListenPort: $new_port"
        update_listen_port "$new_port"
        if attempt_wireguard_connection "$new_port" "$endpoint" "$peer_public_key"; then
            log "Подключение WireGuard успешно установлено с портом $new_port"
            break
        fi
        log "Ожидание перед повторной попыткой с новым портом..."
        sleep 5
    done
done
log "Выполнение скрипта завершено"
Этот скрипт предназначен для управления подключениями WireGuard на вашем роутере и включает следующие основные функции:
Логирование:
Создает файл журнала на подключенном USB-устройстве, чтобы записывать всю активность скрипта, включая ошибки и статус операций.
Обработка интерфейсов WireGuard:
Пробегает по списку заданных интерфейсов WireGuard (например, "wg11"), указанных в переменной WG_INTERFACES. Для каждого интерфейса скрипт извлекает конфигурационные параметры, такие как направление сервера (Endpoint), IP-адрес и порт для прослушивания.
Проверка Handshake:
Проверяет, успешно ли установлен handshake (рукопожатие) с сервером WireGuard. Это необходимо для проверки работоспособности соединения.
Изменение порта и повторная попытка подключения:
Если handshake не был успешным, скрипт изменяет порт прослушивания и отправляет произвольный UDP-пакет для сброса первоначального состояния. После изменения порта и отправки пакета скрипт снова пробует подключиться к серверу WireGuard для установления соединения.
Чтобы скрипт wireguard.sh запускался автоматически при старте роутера, нужно добавить его в инит-скрипт /jffs/scripts/post-mount. Ниже приведены инструкции, как это сделать, а также пример содержания файла post-mount.
- Откройте файл /jffs/scripts/post-mountв текстовом редакторе, например,nano:
nano /jffs/scripts/post-mount
- Убедитесь, что ваш скрипт wireguard.sh включен в этот файл. Если строка отсутствует, добавьте её:
#!/bin/sh
. /jffs/addons/amtm/mount-entware.mod # Added by amtm
/jffs/addons/wireguard/wg_manager.sh init "" & # WireGuard Manager
/jffs/scripts/wireguard.sh &  # Автоматический запуск скрипта WireGuard
- 
Сохраните изменения и выйдите из редактора. 
- 
Убедитесь, что файл post-mount и wireguard.sh имеет право на исполнение: 
chmod +x /jffs/scripts/post-mount
chmod +x /jffs/scripts/wireguard.sh
Чтобы ваш скрипт wireguard.sh запускался каждые 5 минут для проверки соединения, вы можете использовать встроенную в роутер систему планирования задач, которая называется cron. AsusWRT-Merlin прошивка поддерживает эту систему через утилиту cru. Вот как можно добавить эту задачу:
- Откройте или создайте файл /jffs/scripts/init-start, который используется для конфигурации задач, выполняющихся при запуске роутера:
nano /jffs/scripts/init-start
- Добавление задачи в планировщик cron: Вставьте следующее содержимое в файл, чтобы конфигурировать автоматический запуск скрипта:
#!/bin/sh
# /jffs/scripts/init-start
# Добавляем задачу в cron с помощью cru
# Задача будет запускать скрипт каждую 5 минут
cru a wireguard_script "*/5 * * * * /jffs/scripts/wireguard.sh"
Шаг 6: Динамическое получение списка заблокированных доменов из внешнего источника и маршрутизация по VPN
Раздел в разработке.



можно простеньким скриптиком (макс 200 адресов). Только правильный интерфейс поставте.