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.

Revisions

  1. mrkhachaturov revised this gist Aug 25, 2024. 1 changed file with 3 additions and 2 deletions.
    5 changes: 3 additions & 2 deletions Wireguard DPI обход РКН - AsusWRT-Merlin.md
    Original file line number Diff line number Diff line change
    @@ -342,6 +342,7 @@
    </details>

    <details>
    <summary> Шаг 6: Динамическое получение списка заблокированных доменов из внешнего источника и маршрутизация по VPN:</summary>
    В разработке.
    <summary> Шаг 6: Динамическое получение списка заблокированных доменов из внешнего источника и маршрутизация по VPN</summary>

    Раздел в разработке.
    </details>
  2. mrkhachaturov revised this gist Aug 25, 2024. 1 changed file with 3 additions and 1 deletion.
    4 changes: 3 additions & 1 deletion Wireguard DPI обход РКН - AsusWRT-Merlin.md
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,7 @@
    # Обход блокировок WireGuard с помощью скрипта на AsusWRT-Merlin
    В связи с блокировками со стороны РНК, возникает необходимость обойти такие ограничения для WireGuard на вашем роутере. Это можно сделать путем отправки одного произвольного UDP-пакета, который нарушает первоначальное распознавание протокола WireGuard. Следуйте этим шагам, чтобы настроить решение на базе прошивки AsusWRT-Merlin.
    В связи с блокировками со стороны Роскомнадзора, возникает необходимость обойти такие ограничения для WireGuard на вашем роутере. Это можно сделать путем отправки одного произвольного UDP-пакета, который нарушает первоначальное распознавание протокола WireGuard. Следуйте этим шагам, чтобы настроить решение на базе прошивки AsusWRT-Merlin.

    Сейчас я разрабатываю установку AmneziaWG для роутеров ASUS с прошивкой AsusWRT-Merlin, что обеспечит более устойчивое и автоматизированное решение этих проблем. Отправка UDP-пакета является временным решением для обхода текущих ограничений, пока не будет завершена интеграция AmneziaWG

    <details>
    <summary> Шаг 1: Установка прошивки [AsusWRT-Merlin](https://www.asuswrt-merlin.net/)</summary>
  3. mrkhachaturov revised this gist Aug 25, 2024. 1 changed file with 4 additions and 1 deletion.
    5 changes: 4 additions & 1 deletion Wireguard DPI обход РКН - AsusWRT-Merlin.md
    Original file line number Diff line number Diff line change
    @@ -337,6 +337,9 @@
    # Задача будет запускать скрипт каждую 5 минут
    cru a wireguard_script "*/5 * * * * /jffs/scripts/wireguard.sh"
    ```
    </details>


    <details>
    <summary> Шаг 6: Динамическое получение списка заблокированных доменов из внешнего источника и маршрутизация по VPN:</summary>
    В разработке.
    </details>
  4. mrkhachaturov revised this gist Aug 25, 2024. 2 changed files with 342 additions and 1 deletion.
    1 change: 0 additions & 1 deletion Wireguard DPI обход РКН - AsusWRT-Merlin
    Original file line number Diff line number Diff line change
    @@ -1 +0,0 @@
    Тест
    342 changes: 342 additions & 0 deletions Wireguard DPI обход РКН - AsusWRT-Merlin.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,342 @@
    # Обход блокировок WireGuard с помощью скрипта на AsusWRT-Merlin
    В связи с блокировками со стороны РНК, возникает необходимость обойти такие ограничения для WireGuard на вашем роутере. Это можно сделать путем отправки одного произвольного UDP-пакета, который нарушает первоначальное распознавание протокола WireGuard. Следуйте этим шагам, чтобы настроить решение на базе прошивки AsusWRT-Merlin.

    <details>
    <summary> Шаг 1: Установка прошивки [AsusWRT-Merlin](https://www.asuswrt-merlin.net/)</summary>
    Начнем с того, что роутер должен быть прошит прошивкой AsusWRT-Merlin. Проверьте, поддерживается ли ваш роутер, перейдя на сайт AsusWRT-Merlin. Следуйте инструкциям на сайте для установки прошивки.
    </details>

    <details>
    <summary>Шаг 2: Подключение USB флешки и установка [Entware](https://github.com/RMerl/asuswrt-merlin.ng/wiki/Entware)</summary>

    1. Процесс установки и настройки должен выполняться через telnet или SSH. Если эта часть кажется вам сложной, то лучше сразу отказаться от использования Entware, поскольку все необходимо устанавливать и настраивать через telnet/SSH.

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

    ![CleanShot 2024-08-25 at 23 52 18@2x](https://gist.github.com/user-attachments/assets/726317e8-7455-4b72-a443-384e120a5653)

    3. Вам необходимо подключить USB-диск, отформатированный в нативной файловой системе Linux (ext2, ext3 или ext4). Чтобы отформатировать диск, используйте утилиту amtm. Подключите USB-диск к вашему роутеру, затем запустите amtm командой
    ```
    amtm
    ```
    <img src="https://gist.github.com/user-attachments/assets/e2a9b262-84a8-4c9d-ab98-1e5f96f8c0ba" alt="CleanShot 2024-08-25" width="500"/>

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


    4. Чтобы начать процесс установки Entware запустите приложение amtm в терминале, выполнив команду
    ```
    amtm
    ```
    Меню предложит вам опцию 'ep' для начала установки Entware.

    Если у вас используется версия прошивки старше 384.15 (или 384.13_4 для моделей RT-AC87U и RT-AC3200), тогда начните установку, запустив скрипт "entware-setup.sh".
    </details>

    <details>
    <summary> Шаг 3: Установка [WireGuard Manager](https://github.com/MartineauUK/wireguard)</summary>
    1. Для установки WireGuard Manager, выполните:

    ```
    amtm
    ```
    2. Набирайте `i` далее `wg` для устновки Wireguard Manager.

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

    ```
    wg_manager
    ```
    ![CleanShot 2024-08-26 at 00 23 39@2x](https://gist.github.com/user-attachments/assets/42fc53e8-c068-4340-8f5d-372e78e3235f)
    </details>

    <details>
    <summary> Шаг 4: Добавление [клиента](https://github.com/ZebMcKayhan/WireguardManager?tab=readme-ov-file#import-client)</summary>


    1. Разместите файл конфигурации клиента в:

    ```
    /opt/etc/wireguard.d/
    ```
    2. Назовите файл, как вам удобно, но завершите его .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
    ```

    3. Импортируйте конфигурацию в WireGuard Manager, используя:

    ```
    E:Option ==> import wireguard.conf
    ```

    4. Проверьте успешность импорта командой peer в WireGuard Manager.

    ![CleanShot 2024-08-26 at 00 41 51@2x](https://gist.github.com/user-attachments/assets/f7491b10-ec35-453d-ba90-6a9c915f595c)

    5. Интерфейс можно активирвовать командой `start wg11`, где wg11 - это имя вашего клиента. Пока автивировать не нужно. Дополнительные команды можно найти [здесь](https://github.com/ZebMcKayhan/WireguardManager?tab=readme-ov-file#import-client)
    </details>

    <details>
    <summary> Шаг 5: Установка скрипта для автоматической отправки пакетов UDP</summary>
    1. Установите socat:

    ```
    opkg update
    opkg install socat
    ```

    2. Перейдите в `/jffs/scripts` и создайте новый скрипт `wireguard.sh`:

    ```
    nano /jffs/scripts/wireguard.sh
    ```

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

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

    2. Убедитесь, что ваш скрипт 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
    ```
    3. Сохраните изменения и выйдите из редактора.

    4. Убедитесь, что файл 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
    ```

    2. Добавление задачи в планировщик cron: Вставьте следующее содержимое в файл, чтобы конфигурировать автоматический запуск скрипта:

    ```
    #!/bin/sh
    # /jffs/scripts/init-start
    # Добавляем задачу в cron с помощью cru
    # Задача будет запускать скрипт каждую 5 минут
    cru a wireguard_script "*/5 * * * * /jffs/scripts/wireguard.sh"
    ```


    </details>
  5. mrkhachaturov created this gist Aug 25, 2024.
    1 change: 1 addition & 0 deletions Wireguard DPI обход РКН - AsusWRT-Merlin
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    Тест