Автор: Редакция «VPN не работает»

Настройка WireGuard на OpenWrt

Всё сводится к одному пакету: для командной строки хватает wireguard-tools, для веб-интерфейса — luci-proto-wireguard, который тянет первый как зависимость. Оба пути пишут одну конфигурацию, итог от способа не зависит. Пакета с коротким именем wireguard в репозитории нет.

Коротко. Команда установки зависит от ветки: 24.10 и старше — opkg install, 25.12 и новее — apk -U add. Порт по умолчанию 51820, MTU — 1420 байт. Пир описывается секцией типа wireguard_wg0 — по имени интерфейса. Адрес интерфейса обязан идти с маской — иначе он молча становится /32.

Что нужно до начала?

Понадобятся доступ по SSH или в LuCI и параметры второй стороны: публичный ключ, внешний адрес с портом, адрес внутри туннеля. Ветка прошивки видна на странице Status → Overview. Если второй стороны ещё нет, поднимите её на арендованной машине: порядок — в гайде по WireGuard на VPS.

Чем opkg отличается от apk?

Пакетный менеджер сменился в релизе 25.12, а не в 24.10, как часто пишут: примечания к выпуску 24.10.0 прямо указывают, что эта ветка работает только с opkg. OpenWrt 25.12.0 вышел 5 марта 2026 года; обе ветки живут параллельно.

opkg update && opkg install luci-proto-wireguard   # 24.10 и старше
apk -U add luci-proto-wireguard                    # 25.12 и новее

Ставить wireguard-tools отдельно не нужно: у пакета протокола он в зависимостях вместе с ucode, luci-lib-uqr и resolveip.

Как поднять туннель на маршрутизаторе?

Пять шагов и два файла: пакет, интерфейс wg0, пир, зона брандмауэра и проверка — туннель описан в /etc/config/network, зона в /etc/config/firewall. Команды — по SSH, в LuCI у каждого шага есть зеркало.

Шаг 1. Поставить пакет и перезапустить сеть

В LuCI: System → Software, обновить списки, найти luci-proto-wireguard. Затем перезапустите сеть — System → Startup → Initscripts → network → Restart; этот шаг вики даёт отдельным пунктом.

Шаг 2. Создать интерфейс wg0

uci set network.wg0="interface"
uci set network.wg0.proto="wireguard"
uci set network.wg0.private_key="generate"
uci add_list network.wg0.addresses="192.168.9.2/24"

generate — не заглушка: netifd запускает wg genkey и пишет ключ обратно в конфигурацию. Маска в адресе обязательна — документация выделяет это дважды: адрес без маски описывает подсеть /32, и трафик до второй стороны не маршрутизируется.

Шаг 3. Описать пира секцией wireguard_wg0

uci set network.wgserver="wireguard_wg0"
uci set network.wgserver.public_key="КЛЮЧ_ВТОРОЙ_СТОРОНЫ"
uci set network.wgserver.endpoint_host="203.0.113.10"
uci set network.wgserver.persistent_keepalive="25"
uci set network.wgserver.route_allowed_ips="1"
uci add_list network.wgserver.allowed_ips="0.0.0.0/0"
uci add_list network.wgserver.allowed_ips="::/0"
uci commit network

Тип секции — wireguard_<имя интерфейса>, поэтому блок из чужого гайда с другим именем не подхватится. Порт не указан намеренно: обработчик подставляет 51820, а route_allowed_ips создаёт маршруты под перечисленные диапазоны.

Шаг 4. Отдать интерфейс зоне брандмауэра

Новую зону создавать не нужно, туннель отдают существующей. Но зоны в штатном /etc/config/firewall — анонимные секции, и firewall.wan до переименования вернёт ошибку, поэтому вики сначала даёт им имена:

uci rename firewall.@zone[1]="wan"   # индекс сверьте: uci show firewall
uci del_list firewall.wan.network="wg0"   # при повторном прогоне: снимает дубль
uci add_list firewall.wan.network="wg0"
uci commit firewall
service firewall restart

Зона wan выбрана не для простоты: masq и mtu_fix у неё по умолчанию равны единице. Но masq работает только для IPv4 — у шестой версии своя опция masq6 с нулём.

Своя зона нужна при изоляции туннеля и в серверном режиме: input и forward в REJECT, output в ACCEPT, флаги masq="1" и mtu_fix="1", пересылка из lan. Рабочий предел имени — 11 символов, и WireguardVPN из вики его уже превышает, так что берите короче: wgvpn.

Шаг 5. Проверить канал через wg show

wg show печатает пиров, время рукопожатия и счётчики трафика: пустое рукопожатие означает сетевую причину, а не ошибку в ключах. Правила смотрят через nft list ruleset — в fw4 работает nftables, а iptables -L покажет пустоту.

Чем LuCI отличается от файла UCI?

Ничем по результату: веб-интерфейс — редактор того же /etc/config/network.

Поле в LuCIОпция в конфигурацииВкладка
Listen Portlisten_portGeneral, плейсхолдер random
IP AddressesaddressesGeneral, только с маской
MTU, Firewall Markmtu, fwmarkAdvanced, метка с 0x
Persistent Keep Alivepersistent_keepalivePeers, диапазон 0–65535

Ловушка выделена в документации: после добавления пира «Save & Apply» мало — нужен Restart интерфейса wg0 на странице Interfaces.

Как настроить роутер сервером?

Отличий четыре, и главное — зона: интерфейс кладут в lan, а входящее правило открывает UDP-порт 51820.

ПараметрРоутер как клиентРоутер как сервер
Зона брандмауэраинтерфейс в зону wanинтерфейс в зону lan
Входящее правилоне требуетсяsrc wan, UDP 51820, ACCEPT
allowed_ips у пира0.0.0.0/0 и ::/0/32 и /128 клиента
Адрес в туннеле192.168.9.2/24192.168.9.1/24

В LuCI то же правило — вкладка Traffic Rules: UDP, источник wan, назначение Device, порт 51820. Серверная роль даёт удалённый доступ к домашней сети, но не даёт предсказуемой точки выхода: для этого роутер оставляют клиентом, а вторую сторону держат на арендованной машине (настройка защищённого канала на своём сервере).

Почему туннель не поднимается?

Начинайте с wg show: нулевые счётчики значат, что пакеты не дошли вовсе.

СимптомПричинаРешение
Рукопожатия нет ни разуUDP-порт не доходитВходящее правило, nft list ruleset
Рукопожатие есть, сайты не грузятсяНет подмены адреса у зоныmasq="1", для IPv6 masq6="1"
Правка в LuCI не сработалаНажат только Save & ApplyRestart интерфейса wg0
Маршрутов нетАдрес записан без маскиУказать 192.168.9.2/24
После перезагрузки рукопожатий нетЧасы ушли назад, метка TAI64N не растётДождаться sysntpd, сверить date

MTU здесь не подбирается сам: в отличие от wg-quick netifd трогает его только при явно заданной опции, иначе действует дефолт драйвера ядра — 1420 байт. Прочие причины сбоев — в материале о том, почему VPN не работает на роутере.

Правовая рамка

Материал носит образовательный, научно-технический характер и описывает шифрование трафика и удалённый доступ к собственной сети. Прямой ответственности за использование VPN физическим лицом законодательство РФ не устанавливает: статья 15.8 ФЗ-149 и статья 13.52 КоАП адресованы владельцам средств доступа.

Частые вопросы

Ниже — то, что спрашивают чаще всего при первой настройке.

Какой пакет нужен для WireGuard на OpenWrt?

Для командной строки достаточно wireguard-tools, для веб-интерфейса ставится luci-proto-wireguard, у которого wireguard-tools прописан в зависимостях вместе с ucode, luci-lib-uqr и resolveip. Пакета с коротким именем wireguard в репозитории нет, отдельного приложения luci-app-wireguard в репозитории LuCI тоже не существует — страницу Status → WireGuard даёт тот же пакет протокола.

Когда в OpenWrt появился apk вместо opkg?

Переход состоялся в релизе 25.12.0 от 5 марта 2026 года. Примечания к выпуску 24.10.0 прямо указывают, что та ветка использует только opkg и пакеты apk не поддерживает, поэтому распространённое утверждение о смене менеджера в 24.10 неверно. На 24.10 и старше работает opkg update && opkg install, на 25.12 и новее — apk -U add.

Почему после добавления пира в LuCI ничего не изменилось?

Скорее всего, нажата только кнопка «Save & Apply». Документация выделяет это отдельно: чтобы новый список пиров вступил в силу, нужно вернуться на страницу Interfaces и нажать Restart у интерфейса wg0. Результат проверяется командой wg show — у применённого пира появляется время последнего рукопожатия.

Обязательно ли создавать отдельную зону брандмауэра?

Нет. Официальный клиентский сценарий добавляет туннель в существующую зону wan, у которой masq и mtu_fix по умолчанию равны единице. Отдельная зона нужна для изоляции туннеля от остальной сети и для серверного режима: в ней задают input и forward в REJECT, output в ACCEPT, masq=1 и mtu_fix=1. Имя зоны не должно превышать 11 символов.

Какой MTU выставить на интерфейсе wg0?

По умолчанию действует значение драйвера ядра — 1420 байт, то есть 1500 минус 80 байт служебных данных. В отличие от wg-quick обработчик netifd MTU не подбирает: он меняет значение только при явно заданной опции mtu. Рекомендаций под PPPoE или мобильного оператора документация OpenWrt не приводит, поэтому величину подбирают опытным путём.

Может ли роутер на OpenWrt принимать подключения сам?

Да, это серверный сценарий: интерфейс кладут не в зону wan, а в lan, и открывают входящее правило Allow-WireGuard с источником wan, протоколом UDP и портом 51820. У пиров при этом указывают узкие allowed_ips вида /32 и /128, а не 0.0.0.0/0. Роутеру нужен доступный извне адрес, иначе клиент не сможет к нему обратиться.

Поделиться: Telegram ВКонтакте