# Обход блокировок 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](https://gist.github.com/user-attachments/assets/726317e8-7455-4b72-a443-384e120a5653) 3. Вам необходимо подключить USB-диск, отформатированный в нативной файловой системе Linux (ext2, ext3 или ext4). Чтобы отформатировать диск, используйте утилиту amtm. Подключите USB-диск к вашему роутеру, затем запустите amtm командой ``` amtm ``` CleanShot 2024-08-25 и выберите опцию 'fd' для форматирования диска. 4. Чтобы начать процесс установки 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 ``` 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)
Шаг 4: Добавление [клиента](https://github.com/ZebMcKayhan/WireguardManager?tab=readme-ov-file#import-client) 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)
Шаг 5: Установка скрипта для автоматической отправки пакетов UDP 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" ```
Шаг 6: Динамическое получение списка заблокированных доменов из внешнего источника и маршрутизация по VPN Раздел в разработке.