Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save mrkhachaturov/732ed274b35b38cf4cb86037f6035584 to your computer and use it in GitHub Desktop.

Select an option

Save mrkhachaturov/732ed274b35b38cf4cb86037f6035584 to your computer and use it in GitHub Desktop.
WireGuard DPI обход РКН на роутерах ASUS с прошивкой AsusWRT-Merlin

Обход блокировок WireGuard с помощью скрипта на AsusWRT-Merlin

В связи с блокировками со стороны Роскомнадзора, возникает необходимость обойти такие ограничения для 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)
  1. Процесс установки и настройки должен выполняться через telnet или SSH. Если эта часть кажется вам сложной, то лучше сразу отказаться от использования Entware, поскольку все необходимо устанавливать и настраивать через telnet/SSH.

  2. Для начала, перейдите в веб-интерфейс вашего роутера, чтобы включить доступ по SSH. В данном примере эта настройка находится следующим образом: Администрирование -> Система.

CleanShot 2024-08-25 at 23 52 18@2x

  1. Вам необходимо подключить USB-диск, отформатированный в нативной файловой системе Linux (ext2, ext3 или ext4). Чтобы отформатировать диск, используйте утилиту amtm. Подключите USB-диск к вашему роутеру, затем запустите amtm командой
amtm
CleanShot 2024-08-25

и выберите опцию 'fd' для форматирования диска.

  1. Чтобы начать процесс установки 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
  1. Набирайте i далее wg для устновки Wireguard Manager.

  2. После установки, для доступа к интерфейсу WireGuard Manager в терминале роутера введите:

wg_manager

CleanShot 2024-08-26 at 00 23 39@2x

Шаг 4: Добавление [клиента](https://github.com/ZebMcKayhan/WireguardManager?tab=readme-ov-file#import-client)
  1. Разместите файл конфигурации клиента в:
/opt/etc/wireguard.d/
  1. Назовите файл, как вам удобно, но завершите его .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  
  1. Импортируйте конфигурацию в WireGuard Manager, используя:
E:Option ==> import wireguard.conf
  1. Проверьте успешность импорта командой peer в WireGuard Manager.

CleanShot 2024-08-26 at 00 41 51@2x

  1. Интерфейс можно активирвовать командой start wg11, где wg11 - это имя вашего клиента. Пока автивировать не нужно. Дополнительные команды можно найти здесь
Шаг 5: Установка скрипта для автоматической отправки пакетов UDP 1. Установите socat:
opkg update
opkg install socat
  1. Перейдите в /jffs/scripts и создайте новый скрипт wireguard.sh:
nano /jffs/scripts/wireguard.sh

Примечание: Если nano не установлен, выполните:

opkg update
opkg install nano
  1. Вставьте в редактор следующий скрипт и измените название интерфейсов, если необходимо. Обратите внимание на строку, где указан список интерфейсов 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.

  1. Откройте файл /jffs/scripts/post-mount в текстовом редакторе, например, nano:
nano /jffs/scripts/post-mount
  1. Убедитесь, что ваш скрипт 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
  1. Сохраните изменения и выйдите из редактора.

  2. Убедитесь, что файл post-mount и wireguard.sh имеет право на исполнение:

chmod +x /jffs/scripts/post-mount
chmod +x /jffs/scripts/wireguard.sh

Чтобы ваш скрипт wireguard.sh запускался каждые 5 минут для проверки соединения, вы можете использовать встроенную в роутер систему планирования задач, которая называется cron. AsusWRT-Merlin прошивка поддерживает эту систему через утилиту cru. Вот как можно добавить эту задачу:

  1. Откройте или создайте файл /jffs/scripts/init-start, который используется для конфигурации задач, выполняющихся при запуске роутера:
nano /jffs/scripts/init-start
  1. Добавление задачи в планировщик cron: Вставьте следующее содержимое в файл, чтобы конфигурировать автоматический запуск скрипта:
#!/bin/sh
# /jffs/scripts/init-start

# Добавляем задачу в cron с помощью cru
# Задача будет запускать скрипт каждую 5 минут
cru a wireguard_script "*/5 * * * * /jffs/scripts/wireguard.sh"
Шаг 6: Динамическое получение списка заблокированных доменов из внешнего источника и маршрутизация по VPN

Раздел в разработке.

@Evgenych-sse
Copy link

Добрый вечер. По 6-му пункту подвижки есть ?

@ageev
Copy link

ageev commented Sep 23, 2024

У меня ac68u и не могу установить Wireguard описанным методом, есть ли другие варианты? OpenVPN перестал работать, к сожалению.

У вас прошивка Asuswrt-Merlin установлена?

RT-AC68U с последней для этой модели прошивкой от Мерлина (386.14) не поддерживает Wireguard (нет модулей ядра, только из юзерспейс, а это сложно, медленно и глючно).

Не знаете, случайно, есть ли что-то подобное для OpenVPN?

@JoyZzzzz
Copy link

JoyZzzzz commented Sep 25, 2024

@ageev

Не знаете, случайно, есть ли что-то подобное для OpenVPN?

Можно попробовать поднять antizapret на своем vps и дополнительно добавить нужные сайты для проксирования.

@MeTAL666666
Copy link

MeTAL666666 commented Oct 9, 2024

У меня Asus AX-88U с прошивкой от Merlin версии 388_8. Поднят Wireguard-клиент штатными средствами прошивки, имеется свой VPS-сервер. Подскажите, как можно заставить роутер автоматически отправлять «мусорный» udp-пакет на случай, если провайдером будет блокироваться handshake?

UPD:
Дам ответ на свой вопрос, может кому тоже пригодится.
Воспользовался инструкцией из этого поста:
https://gist.github.com/koolvn/993d9c7eb2666dbf15bdccc7d3c4fe33
Всё сработало легко и без каких-либо проблем.

@AlexeyAM
Copy link

По поводу п. 6 (динамическое получение списка заблокированных доменов). Бог с ним с динамическим. Можно ли как-то вручную их прописывать? Типа в виде файла подгружать. А то в VPN-директоре маловато адресов, да и прописывать через мерлиновский GUI неудобно. Хотелось бы чтобы руками в какой-нибудь файл.

@kerudg83
Copy link

Возможно ли использование данного метода на ASUS RT N66U? Уж очень хочется Амнезию на нём поднять.
На стоковой прошивке только l2tp работает за дорого.

@JoyZzzzz
Copy link

@kerudg83 Невозможно. Слишком устаревшая модель.

@ageev
Copy link

ageev commented Nov 18, 2024

По поводу п. 6 (динамическое получение списка заблокированных доменов). Бог с ним с динамическим. Можно ли как-то вручную их прописывать? Типа в виде файла подгружать. А то в VPN-директоре маловато адресов, да и прописывать через мерлиновский GUI неудобно. Хотелось бы чтобы руками в какой-нибудь файл.

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

@kimfrosty
Copy link

И все-таки, нам стоит ждать 6 пунктик? Очень уж хочется на АСУСе точечную маршпутизацию VPN

@mrkhachaturov
Copy link
Author

Коллеги, добрый день!
Извиняюсь, что так долго не отвечал, я перешел на другое оборудование, асус оставил чисто как точка доступа wifi.
Если 6 пункт актуален, поставьте реакцию на данное сообщение и я специально для вас еще раз настрою свое оборудование и поделюсь рабочей конфигурацией.

@JoyZzzzz
Copy link

@mrkhachaturov я думаю, что многим еще актуально.

@koolvn
Copy link

koolvn commented Dec 26, 2024

поставьте реакцию на данное сообщение

К сожалению реакции тут нельзя ставить  ☹️☹️☹️

@acekm
Copy link

acekm commented Dec 30, 2024

Коллеги, добрый день! Извиняюсь, что так долго не отвечал, я перешел на другое оборудование, асус оставил чисто как точка доступа wifi. Если 6 пункт актуален, поставьте реакцию на данное сообщение и я специально для вас еще раз настрою свое оборудование и поделюсь рабочей конфигурацией.

супер актуально!

@kimfrosty
Copy link

Коллеги, добрый день! Извиняюсь, что так долго не отвечал, я перешел на другое оборудование, асус оставил чисто как точка доступа wifi. Если 6 пункт актуален, поставьте реакцию на данное сообщение и я специально для вас еще раз настрою свое оборудование и поделюсь рабочей конфигурацией.

Да, конечно актуально!

@PaulPoloziouk
Copy link

@kimfrosty @acekm @koolvn
Способ ещё работает? Есть смысл корячиться и ставить всё это?

@ageev
Copy link

ageev commented Apr 13, 2025

@kimfrosty @acekm @koolvn Способ ещё работает? Есть смысл корячиться и ставить всё это?

да, всё работает. По крайней мере на Ростелекоме.

@timaschuk
Copy link

На билайне к сожалению не работает способ уже.
@mrkhachaturov Подскажите проект AmneziaWG для Merlin вы уже не делаете как я понял?

@evg58
Copy link

evg58 commented Jun 5, 2025

+1 на падаване амнезию ито запилили на старые роутеры

@JoyZzzzz
Copy link

JoyZzzzz commented Jun 6, 2025

Тут похоже все умерло.
Для WG cмотрите более простой скрипт UDP Trash Hack for WireGuard on [AsusWRT Merlin]
Или еще есть реализации ASUSWRT Merlin XrayUI и Sing-Box script for Asus routers

@koolvn
Copy link

koolvn commented Jun 6, 2025

Тут похоже все умерло. Для WG cмотрите более простой скрипт UDP Trash Hack for WireGuard on [AsusWRT Merlin] Или еще есть реализации ASUSWRT Merlin XrayUI и Sing-Box script for Asus routers

Правильная ссылка на UDP Trash Hack for WireGuard on [AsusWRT Merlin]

https://gist.github.com/koolvn/993d9c7eb2666dbf15bdccc7d3c4fe33

@timaborovikov-jpg
Copy link

Данный способ ещё актуален?

@ageev
Copy link

ageev commented Jan 5, 2026

Данный способ ещё актуален?

возможно, зависит от провайдера и региона, но на Ростелекоме работает.

@realmadskillz
Copy link

автор что то писал про амнезию. не получилось?

@JoyZzzzz
Copy link

JoyZzzzz commented Feb 8, 2026

@realmadskillz используйте Xray и DPI обход, на сегодняшний день это более актуально.

@realmadskillz
Copy link

@realmadskillz используйте Xray и DPI обход, на сегодняшний день это более актуально.

Да я бы с удовольствием, но для роутера Асус xray что есть тут какойто кривой, автор не отвечает на сообщения. хз как решить вопрос. думал тут работает

@JoyZzzzz
Copy link

Да я бы с удовольствием, но для роутера Асус xray что есть тут какойто кривой, автор не отвечает на сообщения. хз как решить вопрос. думал тут работает

Это все хорошо работает на Asus

B4 (DPI обход по типу Zapret)
https://github.com/DanielLavrushin/b4

ASUSWRT Merlin XrayUI
https://github.com/DanielLavrushin/asuswrt-merlin-xrayui

Sing-box for Asus routers
https://github.com/Dr4tez/sing-box4asus/

AntiZapret VPN
https://github.com/GubernievS/AntiZapret-VPN

@timaborovikov-jpg
Copy link

Да я бы с удовольствием, но для роутера Асус xray что есть тут какойто кривой, автор не отвечает на сообщения. хз как решить вопрос. думал тут работает

Это все хорошо работает на Asus

B4 (DPI обход по типу Zapret) https://github.com/DanielLavrushin/b4

ASUSWRT Merlin XrayUI https://github.com/DanielLavrushin/asuswrt-merlin-xrayui

Sing-box for Asus routers https://github.com/Dr4tez/sing-box4asus/

AntiZapret VPN https://github.com/GubernievS/AntiZapret-VPN

а у вас случаем нет инструкции по установку b4 на роутер асус мерлин?

@JoyZzzzz
Copy link

а у вас случаем нет инструкции по установку b4 на роутер асус мерлин?

Так в гите очень подробная инструкция на русском языке.

@timaborovikov-jpg
Copy link

Так в гите очень подробная инструкция на русском языке.

то есть правильно я понимаю, что эти способы подходят для роутера asus на merlin?

@JoyZzzzz
Copy link

то есть правильно я понимаю, что эти способы подходят для роутера asus на merlin?

Да

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment