Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save mrkhachaturov/732ed274b35b38cf4cb86037f6035584 to your computer and use it in GitHub Desktop.
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

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

@JoyZzzzz
Copy link

Какой роутер ASUS лучше взять?

Тот который может перепрошиваться на OpenWRT ;)

@AxoRm
Copy link

AxoRm commented Aug 27, 2024

Установил все скрипты из 5 пункта, на данный момент при старте wg11 клиента весь интернет просто пропадает на пк
image
пир
image
jffs скрипты включены
ребут несколько раз делал. Если нужна какая-то дополнительная информация, предоставляю.

@GPSMapper
Copy link

GPSMapper commented Aug 27, 2024

@mrkhachaturov, а в чем преимущества Вашего решения относительно https://gist.github.com/koolvn/993d9c7eb2666dbf15bdccc7d3c4fe33
Там просто стратап скрипт вставить и никаких доп. плясок с бубном (все остальное штатными средствами asuswrt merlin)... Или я что-то упускаю?

@romanlex
Copy link

а это совместимо как-то с VPN Director?

@AxoRm
Copy link

AxoRm commented Aug 27, 2024

а это совместимо как-то с VPN Director?

там свой отдельный gui и свой отдельный director

@GPSMapper
Copy link

а это совместимо как-то с VPN Director?

выше ссылка на альтернативное решение, которое как раз со стоком (от мерлина) работает и с vpn директором.

@romanlex
Copy link

выше ссылка на альтернативное решение, которое как раз со стоком (от мерлина) работает и с vpn директором.

спасибо, но что-то я не понял, там меняется порт интерфейса, а на сервере этот порт для клиента явно задан :(

@GPSMapper
Copy link

GPSMapper commented Aug 27, 2024

Там всё автоматически работает, скрипт рандомно генерит порт КЛИЕНТА и его подменяет на стороне клиента же. На сервере ничего делать не надо. Просто настроить Wireguard клиент в роутерe (если ещё не настроен), добавить strartup скрипт в jfss (ничего не меняя), далее вся магия произойдет без вашего участия.

Решение от этого автора содержит больше наворотов, использует отдельный wg менеджер и кмк, для большинства пользователей на данном этапе будет избыточно сложным.

@romanlex
Copy link

image
да вот что-то не хочет зараза работать(
В логах подключается на порт другой, в консоли все тоже норм
image

но сервер, адрес которого указан в VPN Director, не пингуется
выключаю интерфейс - все ок, пинг пошел

@koolvn
Copy link

koolvn commented Aug 27, 2024

но сервер, адрес которого указан в VPN Director, не пингуется

@romanlex Покажи пожалуйста как VPN Director настроен?

Похоже, что клиент просто не в той сети, поэтому и нет пинга.

Доступ в интернет есть у клиентов, которые под правило VPN Director попадают?

@mrkhachaturov
Copy link
Author

mrkhachaturov commented Aug 28, 2024

@mrkhachaturov, а в чем преимущества Вашего решения относительно https://gist.github.com/koolvn/993d9c7eb2666dbf15bdccc7d3c4fe33 Там просто стратап скрипт вставить и никаких доп. плясок с бубном (все остальное штатными средствами asuswrt merlin)... Или я что-то упускаю?

Функционал wg_manager достаточно обширен, и я поделился лишь той частью, которая касается обхода блокировок. Решение от @koolvn будет вполне удовлетворительным для большинства пользователей.

Я планирую доработать wg_manager для интеграции поддержки amneziawg. Без entware наверное не обойтись.
Через UI не удастся передать значения конфигурации, которые необходимы для amnezia wg. Поэтому выбрал wg_manager

@mrkhachaturov
Copy link
Author

mrkhachaturov commented Aug 28, 2024

@AxoRm я правильно понимаю, что сервер wireguard вы подняли с помощью amnezia vpn?
Адреса клиента и DNS, похоже, такие же, как те, что обычно использует amnezia.

@AxoRm
Copy link

AxoRm commented Aug 28, 2024

@AxoRm я правильно понимаю, что сервер wireguard вы подняли с помощью amnezia vpn? Адреса клиента и DNS, похоже, такие же, как те, что обычно использует amnezia.

Нет, это обычный WireGuard

@mtrskeen
Copy link

mtrskeen commented Sep 6, 2024

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

@mrkhachaturov
Copy link
Author

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

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

@WDmitryW
Copy link

WDmitryW commented Sep 23, 2024

Подскажите, ASUS RT-AX92U эта инструкция работает только с 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 пункт актуален, поставьте реакцию на данное сообщение и я специально для вас еще раз настрою свое оборудование и поделюсь рабочей конфигурацией.

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

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