Настройка 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 Port | listen_port | General, плейсхолдер random |
| IP Addresses | addresses | General, только с маской |
| MTU, Firewall Mark | mtu, fwmark | Advanced, метка с 0x |
| Persistent Keep Alive | persistent_keepalive | Peers, диапазон 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/24 | 192.168.9.1/24 |
В LuCI то же правило — вкладка Traffic Rules: UDP, источник wan, назначение Device, порт 51820. Серверная роль даёт удалённый доступ к домашней сети, но не даёт предсказуемой точки выхода: для этого роутер оставляют клиентом, а вторую сторону держат на арендованной машине (настройка защищённого канала на своём сервере).
Почему туннель не поднимается?
Начинайте с wg show: нулевые счётчики значат, что пакеты не дошли вовсе.
| Симптом | Причина | Решение |
|---|---|---|
| Рукопожатия нет ни разу | UDP-порт не доходит | Входящее правило, nft list ruleset |
| Рукопожатие есть, сайты не грузятся | Нет подмены адреса у зоны | masq="1", для IPv6 masq6="1" |
| Правка в LuCI не сработала | Нажат только Save & Apply | Restart интерфейса 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. Роутеру нужен доступный извне адрес, иначе клиент не сможет к нему обратиться.