5.8 KiB
English · Русский
wireguard-go (lx-форк) — sagernet + AmneziaWG 2.0
Рантайм WireGuard-Go для sing-box-lx: sagernet/wireguard-go (форк, на котором собирается sing-box) + обфускация AmneziaWG 2.0, слитые вместе.
Это не универсальный проект. Он существует ради одной задачи (см. ниже) и живёт на ветке lx.
Зачем этот форк
WireGuard-endpoint sing-box нуждается в добавках sagernet/wireguard-go (контракт conn.Bind.Send(…, offset), device.InputPacket, reserved/control). Обфускация против DPI у AmneziaWG живёт в amnezia-vpn/amneziawg-go, который форкнут от upstream wireguard-go и потому этих sagernet-добавок не имеет.
Значит для sing-box-lx ни один форк по отдельности не подходит:
| API под sing-box | обфускация AmneziaWG | |
|---|---|---|
sagernet/wireguard-go |
✅ | ❌ |
amnezia-vpn/amneziawg-go |
❌ | ✅ |
| этот форк | ✅ | ✅ |
Подход (A): берём sagernet-базу и граффтим обфускацию на неё. sing-box компилируется с этим форком без изменений, а конфиг без AWG-полей ведёт себя как обычный WireGuard.
Как устроен merge
И sagernet/wireguard-go, и amneziawg-go происходят от одного upstream git.zx2c4.com/wireguard-go, поэтому делят git-историю — а значит возможен настоящий 3-way merge (а не ручной перенос).
- База:
sagernet/wireguard-go(тот коммит, что пинит sing-box — сейчас506b7631853c). - Вливаем:
amnezia-vpn/amneziawg-go(тип с AWG2 / I1–I5 + фикс S4-keepalive). - Ключевой трюк:
MessageEncapsulatingTransportSizeвыставлен в0вdevice/noise-protocol.go. sing-box-lx не использует 8-байтный headroom sagernet дляBind.Send, и обнуление позволяет обфускации AmneziaWG встать чисто, без конфликтов в send-пути. - Изоляция: обфускация замкнута в
device/— новые файлыdevice/obf*.go,device/magic-header.go+ графты вdevice/{send,receive,device,uapi}.go.conn/,tun/,ipc/остаются чистым sagernet. - Module-path не меняется (
module github.com/sagernet/wireguard-go), поэтому потребитель подключает форк черезreplaceбез правки импортов.
Кто потребляет
sing-box-lx подключает это как git submodule + replace:
# sing-box-lx/.gitmodules
[submodule "submodules/wireguard-go"]
url = https://github.com/Leadaxe/wireguard-go-awg2-lx
branch = lx
# sing-box-lx/go.mod (// lx)
replace github.com/sagernet/wireguard-go => ./submodules/wireguard-go
Собранный с тегом with_awg, он проверен живым сервером AmneziaWG 2.0 (handshake + keepalive + трафик наружу) и кросс-компилируется на linux/darwin/windows × amd64/arm64.
Сопровождение (ребейз на новый sagernet-тег)
Когда sing-box бампит sagernet/wireguard-go, повторяем merge:
git remote add origin https://github.com/sagernet/wireguard-go # база
git remote add amnezia https://github.com/amnezia-vpn/amneziawg-go # источник обфускации
git fetch --all
git checkout -b lx <новый-sagernet-коммит>
git merge amnezia/master # настоящий 3-way merge через общего upstream-предка
Рецепт разрешения конфликтов:
- Новые
device/obf*.go+device/magic-header.goприходят чисто. - Механические конфликты (import-path amnezia → sagernet,
queueconstants*,sticky*,tun.go) → берём наши (sagernet). - Удаляем amnezia-инфра-дубликаты:
conn/gso_*.go,outline/*,tun/*_test.go. device/device.go→ union (sagernetpauseManager+ obf-поля amnezia).device/send.go/receive.go→ берём обфускацию amnezia, ставимMessageEncapsulatingTransportSize = 0, сохраняем 3-аргbind.Send(…, 0).conn/,tun/,ipc/, module-path вgo.mod→ наши (sagernet).
Затем в sing-box-lx: бампим submodule, make -f Makefile.lx lx-build и пере-тест против AWG2-сервера.
Ссылки
| Потребитель | Leadaxe/sing-box-lx |
| База | sagernet/wireguard-go |
| Источник обфускации | amnezia-vpn/amneziawg-go · docs.amnezia.org |
| Оригинал | WireGuard/wireguard-go |
Лицензия
MIT, унаследована от WireGuard-Go (см. LICENSE). Обфускация AmneziaWG — тоже MIT (из amneziawg-go). Это неофициальный форк, не аффилирован с WireGuard, SagerNet или Amnezia.