В связи с блокировками со стороны Роскомнадзора, возникает необходимость обойти такие ограничения для 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
Раздел в разработке.
Тот который может перепрошиваться на OpenWRT ;)