Быстрый способ (на ~10 минут) для разблокировки Discord вместе с голосовыми каналами. Этот способ также разблокирует YouTube и X/Twitter, а также любые другие заблокированные сайты.
Спасибо ImMAILWARE за скрипт для генерации конфигов.
Я рекомендую сразу перейти к способу с браузером, так как его относительно проще провернуть.
-
Для начала вам потребуется доступ к Debian-like дистрибутиву Linux, если точнее - то к терминалу. При этом IP, с которого вы будете работать, должен быть не российским.
- Варианты, где достать такой:
- Google Cloud Editor -- нужен только аккаунт гугла, НО не у всех заработает
- GitHub Codespaces -- нужен аккаунт гитхаба, сложнее в настройке (см. ниже)
- Debian VPS -- по ссылке один из вариантов, нужен только доступ к впске :)
- Прямо на Android (нужен любой VPN) -- см. ниже
У себя на кухнеWindows (лучше с WSL на Ubuntu/Debian, также требует VPN) -- кто знает - тот знает
- Варианты, где достать такой:
-
После того, как у вас откроется терминал, заходим как
root
(для удобства):sudo su
-
Запускаем скрипт (о том, как оно работает, см. ниже):
curl -sSL https://raw.githubusercontent.com/ImMALWARE/bash-warp-generator/main/warp_generator.sh | bash
-
Если скрипт корректно отработал, то в терминале появится содержимое конфига WARP, а так же ссылка на его скачивание.
-
Перед переходом по ссылке, проверьте, чтобы:
Address
был заполнен, а не выглядел как запятая с пробелом илиnull, null
❌ -
Address = ,
❌ -Address = null, null
✔️ -Address = xxx.yyy.zzz.www, aaaa:bbbb:cccc:dddd:eeee:ffff:0000:1111
Endpoint
был заполнен, а не выглядел как двоеточие с пробелами илиnull:null
❌ -
Endpoint = :
✔️ -Endpoint = xxx.yyy.zzz.www:00000
PrivateKey
был заполнен, а не пустовал/был равенnull
❌ -
PrivateKey =
✔️ -PrivateKey = YWxvbmdsb25ncGhyYXNlc29pY2FucHV0aXRhc2tleQ==
- Сам файл в целом выглядел как что-то аккуратное -- должен быть один параметр на одну строку (
Name = значение
)
-
Если что-то из шага 5. не указано в конфиге -- значит, что запрос конфига не удался, пробуйте другой метод
-
Если же всё ок, переходим по ссылке (надо будет нажать по ней Ctrl+ЛКМ). Конфиг должен автоматически скачаться.
-
Теперь важное:
- Дело в том, что подобный софт будет вмешиваться в работу Amnezia, а мы же не хотим этого, так ведь?
-
Теперь скачиваем
- Amnezia VPN файл
AmneziaVPN_X.X.X.X_x64.exe
(для Android -AmneziaVPN_X.X.X.X_arm64-v8a.apk
) - Или Amnezia WG (только Windows, только подключение к WG)
- Или другой клиент WireGuard (не проверено)
- Amnezia VPN файл
-
После установки, жмём на "Файл с настройками подключения" посередине (в Amnezia WG на "Добавить туннель" слева снизу или на "Импорт туннелей из файла")
-
Выбираем скачанный файл с конфигом (WARP.conf)
-
Жмём на "Подключить" в середине
-
Ждём пару секунд
-
Смотрим значение "Передача": если нулей нет, значит могу поздравить!
-
Для чистоты перезапускаем дискорд. Вуаля, голосовые работают, сообщения пишутся. Временами может проседать пинг, но это не критично.
- Amnezia пишет про "две запятые подряд"
- Возможно, в конфиге не указано значение
Address
, и там находится просто запятая - Решение: повторить запуск скрипты на другой машине
- Возможно, в конфиге не указано значение
wg: command not found
/jq: command not found
- Не удалось установить пакеты
wireguard-tools
и/илиjq
- Решение: вручную установить пакеты (
sudo apt-get update -y --fix-missing && sudo apt-get install wireguard-tools jq -y --fix-missing
)
- Не удалось установить пакеты
- Конфиг скачался, но в "Передаче" нули / Не удаётся подключиться
- Возможно, проблема в провайдере
- Решение: поиграться с конфигом, поменяв параметры
J*
(junk) иH*
(header) -- подробнее тут
- Ошибка при импорте: "Строка должна быть в секции"
- Это наверняка означает, что в конфиге "уехали" строчки параметров
- Решение: руками отредактировать конфиг ИЛИ перегенерировать его
- Можно ли как-то ограничить работу Amnezia конкретным приложением?
- Да, в "обычной" версии клиента Amnezia VPN (не Amnezia WG для Windows), есть настройка "Раздельное туннелирование". К сожалению, доступно ограничение только для приложений, и то в виде чёрного списка.
- Не знаю, почему, но в конфиге WireGuard, который закидывается в Amnezia, не работают параметры
AllowedApps
иDisallowedApps
.
- Для начала скачайте расширение Tampermonkey и любой бесплатный VPN.
- Создайте новый скрипт в Tampermonkey
- Вставьте код из спойлера ниже
- Сохраните скрипт (Файл - Сохранить)
- В настройках Tampermonkey меняем "Режим конфигурации" с "Новичок" на "Опытный"
- В тех же настройках прокручиваем вниз до "Загрузки BETA", где меняем "Режим скачивания" на "API браузера"
- Включаем VPN-расширение
- Заходим на любой сайт
- Вуаля! Конфиг скачивается. Переходим к шагу 8 основного гайда.
- Если чуда не случилось, открываем инструменты разработчика (или, как их называют некоторые - код элемента), вкладку "Консоль" (Console), перезагружаем страницу и копируем текст конфига между
########## НАЧАЛО КОНФИГА ##########
и########## КОНЕЦ КОНФИГА ##########
и сохраняем его в текстовый файл - После получения конфига отключите расширение в меню Tampermonkey (тыкнув на переключатель)
// ==UserScript==
// @name Cloudflare WARP Config Generator
// @namespace http://github.com/
// @version 1.0
// @description Генерация конфигурации WARP с помощью Tampermonkey
// @author Egor Bron (ориг. автор - ImMALWARE https://github.com/ImMALWARE/)
// @match *://*/*
// @grant GM_xmlhttpRequest
// @grant GM_download
// @connect api.cloudflareclient.com
// ==/UserScript==
(function() {
'use strict';
// TweetNaCl.js для генерации ключей Curve25519
const script = document.createElement('script');
script.src = "https://cdn.jsdelivr.net/npm/[email protected]/nacl.min.js";
document.head.appendChild(script);
script.onload = () => {
// Функция для конвертации массива байт в Base64
function arrayBufferToBase64(buffer) {
let binary = '';
const bytes = new Uint8Array(buffer);
const len = bytes.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
// Генерация приватного и публичного ключей в формате Base64 (32 байта)
function generateKeyPair() {
const keyPair = nacl.box.keyPair();
const priv = arrayBufferToBase64(keyPair.secretKey);
const pub = arrayBufferToBase64(keyPair.publicKey);
return { priv, pub };
}
// Функция для отправки HTTP-запросов через Tampermonkey API
function apiRequest(method, endpoint, data, token = null) {
return new Promise((resolve, reject) => {
const headers = {
'User-Agent': '',
'Content-Type': 'application/json'
};
if (token) {
headers['Authorization'] = `Bearer ${token}`;
}
GM_xmlhttpRequest({
method: method,
url: `https://api.cloudflareclient.com/v0i1909051800/${endpoint}`,
headers: headers,
data: JSON.stringify(data),
onload: function(response) {
try {
const jsonResponse = JSON.parse(response.responseText);
resolve(jsonResponse);
} catch (e) {
reject(e);
}
},
onerror: reject
});
});
}
(async function() {
const { priv, pub } = generateKeyPair();
// Шаг 1: Регистрация
const regResponse = await apiRequest('POST', 'reg', {
install_id: '',
tos: new Date().toISOString(),
key: pub,
fcm_token: '',
type: 'ios',
locale: 'en_US'
});
const id = regResponse.result.id;
const token = regResponse.result.token;
// Шаг 2: Обновление настроек
const secResponse = await apiRequest('PATCH', `reg/${id}`, {
warp_enabled: true
}, token);
const peer_pub = secResponse.result.config.peers[0].public_key;
const peer_endpoint = secResponse.result.config.peers[0].endpoint.host;
const client_ipv4 = secResponse.result.config.interface.addresses.v4;
const client_ipv6 = secResponse.result.config.interface.addresses.v6;
const port = peer_endpoint.split(':').pop();
const final_peer_endpoint = '162.159.193.5';
// Формируем конфиг
const conf = `
[Interface]
PrivateKey = ${priv}
S1 = 0
S2 = 0
Jc = 120
Jmin = 23
Jmax = 911
H1 = 1
H2 = 2
H3 = 3
H4 = 4
Address = ${client_ipv4}, ${client_ipv6}
DNS = 1.1.1.1, 2606:4700:4700::1111, 1.0.0.1, 2606:4700:4700::1001
[Peer]
PublicKey = ${peer_pub}
AllowedIPs = 0.0.0.0/1, 128.0.0.0/1, ::/1, 8000::/1
Endpoint = ${final_peer_endpoint}:${port}
`.trim();
// Скачивание конфигурации с помощью Tampermonkey API
GM_download({
url: 'data:text/plain;base64,' + btoa(conf),
name: 'WARP.conf',
saveAs: true
});
console.log("\n\n\n########## НАЧАЛО КОНФИГА ##########");
console.log(conf);
console.log("########### КОНЕЦ КОНФИГА ###########");
})();
};
})();
- Регистрируемся на GitHub, если вы ещё этого не сделали
- На главной странице жмём на
+
>New Repository
- Даём репозиторию любое название (можно нажать на зелёный текст рядом с
Need inspiration? How about ... ?
) - ОБЯЗАТЕЛЬНО нажмите на
Add a README file
- На странице репозитория жмём на
Code
,Codespaces
,Create codespace on main
- Ждём, пока оно загрузится
- Откроется VS Code, но придётся ещё немного подождать
- Снизу появится окно терминала
- Теперь начинаем с 3 шага основоного гайда
-
Скачиваем Termux (
termux-app_vX.X.X+github-debug_arm64-v8a.apk
) -
В настройках приложения выдаём право на работу с файлами (опционально)
-
Открываем Termux, в консоли устанавливаем необходимые пакеты:
pkg install wireguard-tools jq nano -y
-
Теперь создаём в Nano файл:
nano warpgen.sh
-
Вставляем в редактор код из спойлера ниже
-
Жмём Ctrl+X, затем Y, затем Enter
-
Добавляем файлу возможность запускаться:
chmod +x ./warpgen.sh
-
Запускаем любой впн
-
Возвращаемся в Termux и запускаем:
./warpgen.sh
-
Переходим по ссылке для скачивания ИЛИ Копируем содержимое между
########## НАЧАЛО КОНФИГА ##########
и########## КОНЕЦ КОНФИГА ##########
и сохраняем в файл (можно прямо в Termux:nano WARP.conf
,cp WARP.conf /storage/emulated/0/Download
) -
Теперь можно перейти к основному гайду и начать с шага 8
priv="${1:-$(wg genkey)}"
pub="${2:-$(echo "${priv}" | wg pubkey)}"
api="https://api.cloudflareclient.com/v0i1909051800"
ins() { curl -s -H 'user-agent:' -H 'content-type: application/json' -X "$1" "${api}/$2" "${@:3}"; }
sec() { ins "$1" "$2" -H "authorization: Bearer $3" "${@:4}"; }
response=$(ins POST "reg" -d "{\"install_id\":\"\",\"tos\":\"$(date -u +%FT%T.000Z)\",\"key\":\"${pub}\",\"fcm_token\":\"\",\"type\":\"ios\",\"locale\":\"en_US\"}")
id=$(echo "$response" | jq -r '.result.id')
token=$(echo "$response" | jq -r '.result.token')
response=$(sec PATCH "reg/${id}" "$token" -d '{"warp_enabled":true}')
peer_pub=$(echo "$response" | jq -r '.result.config.peers[0].public_key')
peer_endpoint=$(echo "$response" | jq -r '.result.config.peers[0].endpoint.host')
client_ipv4=$(echo "$response" | jq -r '.result.config.interface.addresses.v4')
client_ipv6=$(echo "$response" | jq -r '.result.config.interface.addresses.v6')
port=$(echo "$peer_endpoint" | sed 's/.*:\([0-9]*\)$/\1/')
peer_endpoint=$(echo "$peer_endpoint" | sed 's/\(.*\):[0-9]*/162.159.193.5/')
conf=$(cat <<-EOM
[Interface]
PrivateKey = ${priv}
S1 = 0
S2 = 0
Jc = 120
Jmin = 23
Jmax = 911
H1 = 1
H2 = 2
H3 = 3
H4 = 4
Address = ${client_ipv4}, ${client_ipv6}
DNS = 1.1.1.1, 2606:4700:4700::1111, 1.0.0.1, 2606:4700:4700::1001
[Peer]
PublicKey = ${peer_pub}
AllowedIPs = 0.0.0.0/1, 128.0.0.0/1, ::/1, 8000::/1
Endpoint = ${peer_endpoint}:${port}
EOM
)
clear
echo -e "\n\n\n"
[ -t 1 ] && echo "########## НАЧАЛО КОНФИГА ##########"
echo "${conf}"
[ -t 1 ] && echo "########### КОНЕЦ КОНФИГА ###########"
conf_base64=$(echo -n "${conf}" | base64 -w 0)
echo "Скачать конфиг файлом: https://immalware.github.io/downloader.html?filename=WARP.conf&content=${conf_base64}"
Вообще, танец с бубном вокруг bash-скрипта нужен лишь для одной-единственной цели: сделать запрос к Cloudflare WARP и получить заветные адреса для подключения.
То есть всё можно провернуть и без участия Linux, достаточно иметь wireguard-tools
(или доступ к алгоритму Curve25519) и возможность сделать POST-запрос к адресу CF.
На основе этого родилась браузерная версия генератора конфига, которая:
- генерирует пару ключей (публичный+приватный) с помощью библиотеки
TweetNaCl.js
- делает запрос к CF для получения адресов (а так как у нас запущен VPN, то запрос спокойно выполняется)
- подставляет полученные значения в конфиг, который я любезно
стырилпозаимствовал у ImMALWARE.
Держите ссылку на его варп генератор, сам только что проверил, дс заупстился без проблем
https://llimonix-warp-generator.vercel.app
llimonix, если ты это читаешь, реально спасибо за все апдейты