Форк WireGuard с защитой от определения протокола DPI-системами. Оригинальный WireGuard легко детектируется и блокируется (уникальные заголовки UDP-пакетов). AmneziaWG добавляет: динамические заголовки из случайных диапазонов, рандомизированные размеры пакетов, маскировку под QUIC / DNS / SIP / другие UDP-протоколы. Параметры Jc, Jmin, Jmax, S1, S2, H1-H4 настраиваются в конфиге, полностью совместим с обычным WireGuard-клиентом если включить режим совместимости. Используется в AmneziaVPN (open-source VPN-клиент для всех платформ). Особенно эффективен против российских провайдеров и DPI Ростелекома.
# Ядро (Linux kernel module) apt install amneziawg-dkms # Go-реализация (userspace) go install github.com/amnezia-vpn/amneziawg-go@latest # Установщик сервера (Debian/Ubuntu) bash <(curl -fsSL https://raw.githubusercontent.com/bivlked/amneziawg-installer/main/install.sh) # Конфиг — пример с обфускацией # [Interface] # Jc = 4 # Jmin = 40 # Jmax = 70 # S1 = 0 # S2 = 0
AmneziaWG — это современная версия протокола WireGuard. Являясь форком WireGuard-Go, он обеспечивает защиту от обнаружения системами глубокой инспекции пакетов (DPI). В то же время он сохраняет упрощённую архитектуру и высокую производительность оригинала.
Предшественник, WireGuard, известен своей эффективностью, но имел проблемы с обнаружением из-за характерных подписей пакетов. AmneziaWG решает эту проблему, используя продвинутые методы маскировки, позволяя его трафику беспрепятственно смешиваться с обычным интернет-трафиком. В результате AmneziaWG поддерживает высокую производительность, добавляя дополнительный уровень скрытности, что делает его отличным выбором для тех, кто ищет быстрое и незаметное VPN-соединение.
Просто запустите:
$ amneziawg-go wg0
Это создаст интерфейс и перейдёт в фоновый режим. Чтобы удалить интерфейс, используйте обычную команду ip link del wg0, или если ваша система не поддерживает прямое удаление интерфейсов, вы можете удалить управляющий сокет через rm -f /var/run/amneziawg/wg0.sock, что приведёт к завершению работы amneziawg-go.
Чтобы запустить amneziawg-go без перехода в фоновый режим, передайте -f или --foreground:
$ amneziawg-go -f wg0
Когда интерфейс запущен, вы можете использовать amneziawg-tools для его настройки, а также обычные команды ip(8) и ifconfig(8).
Для запуска с более подробным логированием можно установить переменную окружения LOG_LEVEL=debug.
Будет работать на Linux; рекомендуется использовать amnezia-wg вместо стандартного модуля ядра Linux.
Это работает на macOS с использованием драйвера utun. В настоящее время не поддерживает привязку к сокетам (sticky sockets) и не будет поддерживать fwmarks из-за ограничений Darwin. Поскольку драйвер utun не позволяет задавать произвольные имена интерфейсов, вы должны либо использовать utun[0-9]+ для явного указания имени интерфейса, либо utun, чтобы ядро выбрало имя автоматически. Если вы выбрали utun в качестве имени интерфейса и переменная окружения WG_TUN_NAME_FILE определена, то фактическое имя интерфейса, выбранного ядром, будет записано в файл, указанный этой переменной.
Это работает в MacOS, его следует использовать из amneziawg-apple
Это работает в Windows, его следует использовать из amneziawg-windows, который использует его как модуль.
Требуется установка последней версии Go.
$ git clone https://github.com/amnezia-vpn/amneziawg-go
$ cd amneziawg-go
$ make
[!NOTE] Если значение не указано (для любого параметра), AWG считает его равным 0
Указанное параметром Jc количество пакетов-мусора со случайным размером от Jmin до Jmax генерируется и отправляется перед каждым рукопожатием
Jc: int, рекомендуемый диапазон — 4-12Jmin: int <= Jmax:int[!TIP] Пакеты-мусор не несут никаких реальных данных, поэтому нет необходимости указывать их на обеих сторонах. Общая рекомендация — использовать их только на стороне клиента
[!IMPORTANT] Если Jmax >= системный MTU (не указанный в AWG), то система может разбить этот пакет на фрагменты, что выглядит подозрительно со стороны цензора
S1: int — заполнение начального сообщения рукопожатияS2: int — заполнение ответного сообщения рукопожатияS3: int — заполнение сообщения с.cookie рукопожатияS4: int — заполнение транспортных сообщенийКаждое сообщение в WireGuard имеет тип uint32 в начале пакета. Этим полем можно управлять, указав следующие параметры:
H1: string — диапазон заголовка начального сообщения рукопожатияH2: string — диапазон заголовка ответного сообщения рукопожатияH3: string — диапазон заголовка сообщения с.cookie рукопожатияH4: string — диапазон заголовка транспортного сообщенияЗначения могут быть указаны как:
- диапазон: x-y, x <= y; например 123-456
- одно значение 1234
Эти пакеты отправляются перед каждым рукопожатием, так же, как пакеты-мусор. Порядок отправки: I1, I2, I3, I4, I5. Если значение не указано, пакет пропускается.
I1: stringI2: stringI3: stringI4: stringI5: stringЗначение — это последовательность тегов, указанных ниже:
- <b 0x[seq]> — тег статических байтов. Записывает [seq] как есть в пакет. [seq] — это кодированная в шестнадцатеричном формате последовательность, представляющая набор байтов (2 шестнадцатеричные цифры на байт) и всегда чётного размера
- <r [size]> — тег случайных байтов. Записывает [size] количество случайно сгенерированных байтов в пакет
- <rd [size]> — тег случайных цифр. Записывает [size] количество случайно сгенерированных байтов из набора [0-9] в пакет
- <rc [size]> — тег случайных символов. Записывает [size] количество случайно сгенерированных байтов из набора [a-zA-Z] в пакет
- <t> — тег временной метки. Записывает 4-байтовое текущее системное время в формате UNIX
[!TIP] Пакеты с пользовательской подписью не несут никаких реальных данных, поэтому нет необходимости указывать их на обеих сторонах. Общая рекомендация — использовать их только на стороне клиента
[!IMPORTANT] Если итоговый размер любого пакета превышает системный MTU, он будет разбит на фрагменты, что выглядит подозрительно