WireGuard/AmneziaWG¶
Серверы WireGuard и AmneziaWG работают как любые другие: стоят в одном списке рядом с VLESS/Trojan/Shadowsocks, пользователь выбирает их так же. Отдельного режима нет, дополнительной настройки нет. Работает на штатном ядре Xray (outbound wireguard) — со стороны провайдера ничего нового не требуется, кроме самого конфига.
Способ А — в JSON-подписке¶
Обычный конфиг Xray, где у outbound "protocol": "wireguard":
{
"remarks": "🇳🇱 Нидерланды — WG",
"outbounds": [{
"tag": "proxy",
"protocol": "wireguard",
"settings": {
"secretKey": "<приватный ключ клиента>",
"address": ["10.0.0.2/32"],
"mtu": 1420,
"peers": [{
"publicKey": "<публичный ключ сервера>",
"preSharedKey": "<необязательно>",
"endpoint": "example.com:51820",
"allowedIPs": ["0.0.0.0/0", "::/0"],
"keepAlive": 25
}]
}
}]
}
Адрес сервера, который показывается в приложении, берётся из peers[0].endpoint. У WireGuard нет блоков vnext или servers — строка endpoint единственное место, где живёт хост.
Поля AmneziaWG. Тот же outbound принимает параметры обфускации — добавьте их рядом с обычными. Они нужны только для AmneziaWG; для обычного WireGuard их просто не указывают (нулевые значения игнорируются, соединение ведёт себя ровно как раньше).
{
"protocol": "wireguard",
"settings": {
"secretKey": "…",
"address": ["10.66.66.17/32"],
"mtu": 1420,
"jc": 4, "jmin": 40, "jmax": 70,
"s1": 15, "s2": 25, "s3": 0, "s4": 0,
"h1": 1111111, "h2": 2222222, "h3": 3333333, "h4": 4444444,
"peers": [
{ "publicKey": "…", "endpoint": "1.2.3.4:51820", "allowedIPs": ["0.0.0.0/0"] }
]
}
}
| Поле | Что задаёт |
|---|---|
jc |
Сколько мусорных пакетов слать перед рукопожатием (4–12) |
jmin / jmax |
Границы размера мусорного пакета, байты (примерно 8–80) |
s1 / s2 |
Размер префикса у init- и response-пакета (15–150) |
s3 / s4 |
Размер префикса у cookie- и транспортных пакетов; необязательны — не указывайте, если сервер их не задаёт |
h1–h4 |
Переписанные типы заголовков: без них пакеты опознаются по сигнатуре. Одно число или, для серверов AmneziaWG 3.1, диапазон "a-b" строкой ("h1": "1000-2000"); диапазоны применяются начиная с Android 428, iOS/macOS/tvOS 2.0.10 (315) и desktop 203 — старые сборки принимают только числа |
⚠
s1–s4 и h1–h4 обязаны совпадать на сервере и в конфиге клиента, иначе соединение молча не работает: туннель поднимается, а трафик не идёт. jc, jmin и jmax совпадать не обязаны — каждая сторона шлёт свой мусор.
Версия сервера — 3.1 и ниже. Приложение собрано на ветке AmneziaWG 3.1 и совместимо со всеми предыдущими, обновлять на своей стороне ничего не нужно. Присылайте только те параметры, которые сервер действительно использует: всё, что не указано, остаётся по умолчанию и игнорируется.
| Появилось в | Параметры |
|---|---|
| 0.2.11 и ранее | jc, jmin, jmax, s1, s2, h1–h4 |
| 0.2.13 | s3, s4 |
| 0.2.16 | i1–i5 |
| 3.0 | header_protection_key, content_padding_addition, rekey_after_time, rekey_timeout, reject_after_time, keepalive_timeout, max_handshake_attempts |
| 3.1 | random_trailers, disable_cookies, диапазоны a-b для h1–h4 и PersistentKeepalive |
Параметр из 3.1, отправленный старому серверу, тот просто не поймёт — держите стороны в согласии: настраивайте клиент ровно тем, что работает на сервере.
Способ Б — ссылкой wireguard://¶
wireguard://<base64 стандартного .conf> — в base64 лежит обычный конфигурационный файл WireGuard, ровно тот текст, который выдают официальному клиенту. Необязательный якорь #Имя задаёт отображаемое название:
Раскодированный payload — просто:
[Interface]
PrivateKey = <приватный ключ клиента>
Address = 10.0.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = <публичный ключ сервера>
PresharedKey = <необязательно>
Endpoint = example.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
Эта форма работает везде, где и остальные share-ссылки: вставка в форму добавления, внутри зашифрованной crypt1-ссылки, отдельной строкой в теле подписки.
Сборка ссылки без кода
Вставьте .conf на служебной странице — она соберёт wireguard:// и QR прямо в браузере, без запросов наружу.
Открыть сборщик ссылок →
Ключи уходят в ядро как есть — приложение их не перекодирует.
Импорт на стороне клиента¶
Начиная с Android 379, iOS/macOS 2.0.3 (277+) и десктопа 169 экран добавления принимает конфиг WireGuard/AmneziaWG четырьмя способами — раздавать пользователям можно любым из них:
- Файл
.conf— кнопка «Выбрать файл конфигурации» (Android, iOS, macOS, Windows, Linux; на Apple TV кнопки нет — там добавление «с телефона»). - Голый текст конфига — содержимое
[Interface]…[Peer]вставляется прямо в поле ввода, на всех платформах. - Ссылка, отдающая конфиг — https-адрес, по которому лежит сам текст
.conf. Многие панели раздают конфиги именно так. - Ссылка-схема и QR —
wireguard:///amneziawg:///awg:///wg://с base64 конфига, как описано выше.
Параметры маскировки AmneziaWG (Jc, Jmin, Jmax, S1, S2, H1–H4) подхватываются из [Interface] во всех четырёх способах. В более старых сборках работают только схема-ссылка и QR.
C. AmneziaWG — WireGuard с обфускацией¶
AmneziaWG — это тот же WireGuard плюс обфускация: мусорные пакеты и переписанные типы заголовков, из-за которых DPI не распознаёт хендшейк WireGuard.
Схемы ссылок. wireguard://, amneziawg://, awg:// и wg:// принимаются и разбираются одинаково — полезная нагрузка это base64 обычного .conf, с необязательным фрагментом #Name.
Параметры обфускации живут в секции [Interface] этого .conf, рядом с обычными ключами:
[Interface]
PrivateKey = …
Address = 10.66.66.17/32
MTU = 1420
Jc = 4 ; сколько мусорных пакетов отправить до хендшейка
Jmin = 40 ; размер мусорного пакета, нижняя граница
Jmax = 70 ; размер мусорного пакета, верхняя граница
S1 = 15 ; размер префикса init-пакета
S2 = 25 ; размер префикса response-пакета
S3 = 0 ; префикс cookie-пакета — необязательно, если сервер не задаёт
S4 = 0 ; префикс транспортного пакета — то же
H1 = 1111111 ; переписанные типы заголовков — иначе узнаются по сигнатуре (серверы 3.1 могут задавать диапазон: H1 = 1000-2000)
H2 = 2222222
H3 = 3333333
H4 = 4444444
[Peer]
PublicKey = …
Endpoint = 194.61.120.25:57932
AllowedIPs = 0.0.0.0/0,::/0
Не указывайте их — получите обычный WireGuard: приложение и ядро ведут себя точно как раньше. То же поле за полем: присылайте только то, что работает на вашем сервере. Подходит любая версия AmneziaWG, 3.1 и старше — см. таблицу версий в разделе A. 🛠️ — Соберите ссылку из .conf — Генератор принимает и конфиги AmneziaWG — параметры обфускации переносятся как есть. Всё считается в браузере. — Генератор ссылок →
Несколько локаций в одном файле. URL подписки может вернуть JSON-контейнер вместо ссылок:
{
"type": "amneziawg",
"version": 1,
"servers": [
{ "name": "Germany", "config": "<base64url файла .conf>" },
{ "name": "Netherlands", "config": "<base64url файла .conf>" }
]
}
type принимается как amneziawg, awg, wireguard или wg. Некорректная запись пропускается, не ломая остальной список.
Заметки для операторов¶
-
IPv6-endpoint поддерживается, пишется стандартно:
[2606:4700:d0::a29f:c001]:2408. -
keepAlive(секунды) — persistent keepalive. Ставьте, если клиенты за NAT: без него трансляция истекает и туннель замолкает в одну сторону. -
MTU в конфиге управляет тем, что шлёт клиент. Что шлёт сервер, задаётся MTU интерфейса
wg0на ноде — настраивайте оба, иначе путь, не несущий полноразмерные пакеты, пропустит хэндшейк и встанет. -
Маршрутизация на ноде важна:
ip route get <ip клиента>должен резолвиться черезwg0. Если указывает на дефолтный шлюз — хэндшейк всё равно пройдёт (демон отвечает на него напрямую), но данные до клиента не дойдут никогда. Выглядит как блокировка, но это не она.