OPNsense как VPN-шлюз: настройка WireGuard
Если у вас уже стоит OPNsense как основной файрвол — заводить отдельный VPN-сервер рядом бессмысленно: WireGuard встроен в дистрибутив и поднимается прямо в веб-интерфейсе, без консоли и правки конфигов вручную. Но интерфейс OPNsense устроен иначе, чем у pfSense, и если вы переходите с одного на другой по памяти — легко потеряться в терминологии. Ниже — рабочая настройка WireGuard-шлюза на OPNsense с объяснением, где и почему GUI ведёт себя не так, как в pfSense.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Local и Endpoint вместо Tunnel и Peer — разная терминология, похожая суть
В OPNsense вся настройка WireGuard живёt в разделе VPN → WireGuard и делится на две сущности:
- Local — это локальный интерфейс WireGuard на самом OPNsense: свой приватный ключ, порт, адрес в тоннельной подсети. Условно это аналог
[Interface]из обычногоwg0.conf. - Endpoint — удалённый пир: его публичный ключ, разрешённые адреса (AllowedIPs), опционально — адрес и порт, если он сам инициирует соединение. Это аналог блока
[Peer].
В pfSense (пакет pfSense-pkg-WireGuard) те же сущности называются Tunnels и Peers, и логика похожая: тоннель — это локальный интерфейс, пир — удалённая сторона. Разница не в смысле, а в деталях реализации, и первая заметная — это то, как оба продукта группируют интерфейсы для файрвола.
В OPNsense все Local-инстансы автоматически становятся членами одного виртуального интерфейса WireGuard (Group) — на него можно повесить один общий набор правил файрвола сразу для всех WireGuard-тоннелей. В pfSense такого группового интерфейса нет: каждый Tunnel нужно вручную assign'ить как отдельный интерфейс (Interfaces → Assignments) и заводить правила для каждого отдельно. Если у вас несколько WireGuard-шлюзов (например, для сотрудников и отдельно для site-to-site с другим офисом), в OPNsense управлять общими правилами проще — либо один groupinterface на всё, либо всё равно assign'ите Local отдельно, если нужны разные политики.
Установка и выбор бэкенда: ядро или wireguard-go
Плагин os-wireguard в современных версиях OPNsense идёт в комплекте с системой — отдельно ставить пакет обычно не нужно, но включить сам модуль VPN нужно вручную:
- VPN → WireGuard → Settings → включите Enable WireGuard.
- Там же выберите бэкенд: kernel (модуль
if_wgв ядре FreeBSD) или wireguard-go (userspace-реализация на Go).
Это стоит объяснить отдельно, потому что решение здесь не всегда очевидное. Родная реализация WireGuard в ядре FreeBSD — это не код оригинального проекта WireGuard, а отдельная переработка под FreeBSD, и в своё время независимые исследователи указывали на проблемы в её качестве. Команда OPNsense в ответ добавила поддержку wireguard-go — эталонной userspace-реализации на Go от самого проекта WireGuard — как более консервативный по безопасности вариант. Практическое следствие: kernel-бэкенд обычно быстрее (меньше накладных расходов на переключение контекста), wireguard-go — медленнее, но ближе к оригинальному коду. Точных цифр по разнице производительности не привожу — она сильно зависит от процессора сервера и профиля трафика; если для вас критична пропускная способность, стоит просто прогнать оба варианта на своём железе и сравнить самостоятельно. Для большинства сценариев (доступ сотрудников, site-to-site между офисами) разница на практике не ощущается.
В pfSense такого выбора бэкенда в интерфейсе нет — там используется одна реализация, без переключателя kernel/userspace.
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверСоздаём сервер: Local-инстанс
Идём в VPN → WireGuard → Local, нажимаем +:
- Name — произвольное имя, например
wg-office. - Public Key / Private Key — оставьте пустыми, OPNsense сгенерирует пару автоматически при сохранении (публичный ключ появится в списке — его нужно будет передать клиентам).
- Listen Port — порт UDP, по умолчанию предлагается 51820, если ставите несколько инстансов — разносите порты.
- Tunnel Address — адрес интерфейса в тоннельной подсети, например
10.10.20.1/24. - DNS Servers — если хотите раздавать клиентам конкретный DNS через тоннель.
Сохраняете — интерфейс wg0 (или следующий свободный) появляется в системе. Дальше идите в Interfaces → Assignments, найдите WireGuard-инстанс в списке, назначьте ему имя (например WG_OFFICE) и включите — без этого шага правила файрвола на конкретный тоннель вешать не получится, а именно этот момент чаще всего забывают при первой настройке. Общую логику установки самого WireGuard как протокола — независимо от платформы — разбирали в статье про установку WireGuard на VPS, если нужен более низкоуровневый разбор ключей и wg-quick.
Добавляем пиров: клиенты и site-to-site
Раздел VPN → WireGuard → Endpoints, кнопка + — здесь два разных сценария заводятся одинаковым способом, разница только в полях.
Клиент (remote access) — сотрудник с телефоном или ноутбуком:
- Name — например
laptop-ivan. - Public Key — публичный ключ, сгенерированный на стороне клиента.
- Allowed IPs —
10.10.20.2/32: клиенту разрешён только его собственный адрес в тоннеле. - Endpoint Address/Port — оставляем пустым, клиент подключается сам, инициатор — он.
Site-to-site с другим офисом или сервером:
- Allowed IPs — не /32, а вся сеть на той стороне, например
10.20.0.0/24. - Endpoint Address/Port — публичный адрес и порт удалённого шлюза, если инициатором должен выступать этот OPNsense.
- Keepalive Interval — 25 секунд, если удалённая сторона может быть за NAT.
После создания Endpoint возвращаетесь в Local-инстанс и добавляете этот Endpoint в список Peers — в OPNsense привязка делается именно так, через редактирование Local, а не автоматически при создании Endpoint. Общий разбор разницы между схемой с одним клиентом на /32-адрес и схемой с целой подсетью — в статье про site-to-site VPN между офисами на WireGuard.
Firewall-правила и NAT
WireGuard в OPNsense не открывает порт сам по себе — нужны явные правила, и здесь два места, где их обычно не хватает новичкам:
- WAN — правило, разрешающее входящий UDP на порт, указанный в Local (например 51820). Без этого пир снаружи вообще не достучится до сервера.
- Группа WireGuard (или конкретный assigned-интерфейс) — правило, разрешающее трафик из тоннеля дальше в локальную сеть. По умолчанию OPNsense, как и pfSense, блокирует всё, что не разрешено явно.
Пример: правило на WAN — IPv4 UDP, source any, destination WAN address, destination port 51820, allow. Правило на WG_OFFICE (или на группе WireGuard) — IPv4, source WG_OFFICE net, destination any, allow, если клиентам нужен полный доступ в локалку и в интернет через шлюз.
Если клиентам нужен доступ в интернет через тоннель (полный туннелинг), включите NAT-маскарадинг для тоннельной подсети — Firewall → NAT → Outbound, режим Hybrid или Manual, добавьте правило с source 10.10.20.0/24 и interface WAN. В pfSense этот шаг идентичен по смыслу, но название вкладок NAT местами отличается — логика outbound NAT в обоих продуктах унаследована от общего предка (m0n0wall/pfSense), так что при переходе с pfSense эта часть покажется знакомой почти один в один.
Отдельно проверьте флажок Disable Route Configuration в настройках Local — если он снят, OPNsense сам добавит системные маршруты по Allowed IPs пиров. Обычно это удобно и его стоит оставить включённым (маршруты создаются автоматически), но если вы вручную управляете таблицей маршрутизации через отдельные статические маршруты — галку стоит взвести, чтобы не было конфликтов.
Мониторинг, диагностика и типичные грабли
Несмотря на GUI, под капотом это обычный WireGuard, поэтому диагностика через консоль работает так же, как на Linux-сервере:
wg show
В выводе смотрите на latest handshake — если время растёт (соединение "протухло") или строки нет вообще, тоннель не поднимается на уровне UDP: чаще всего это закрытый порт на WAN-правиле, неверный публичный ключ у пира или NAT провайдера, который блокирует нестандартный UDP-порт.
Перезапустить сервис из консоли без пересборки конфига через GUI:
configctl wireguard restart
Частые грабли именно на OPNsense:
- Забыли assign интерфейс. Local создан, ключи сгенерированы, но правила файрвола на вкладке для этого интерфейса просто не существует в списке — потому что интерфейс не назначен в Interfaces → Assignments.
- Endpoint не привязан к Local. Создали пира, но забыли добавить его в список Peers внутри Local-инстанса — тоннель молчит, хотя обе стороны настроены вроде бы верно.
- NAT/Outbound не тронут после смены режима. Если раньше стоял Automatic outbound NAT, а вы переключились на Hybrid ради других задач — правило для WireGuard-подсети нужно добавить руками, иначе клиенты потеряют выход в интернет через тоннель.
- DNS не резолвится у клиентов, хотя пинг по IP работает — не указан DNS Server в Local или клиентское приложение не применяет DNS из конфига (актуально для некоторых мобильных клиентов).
Если хендшейк есть, а трафик всё равно не ходит — это почти всегда про Allowed IPs или файрвол, а не про сам WireGuard; разбор похожей логики (применимой и к OPNsense, раз протокол один и тот же) — в статье про случай, когда хендшейк есть, а трафика нет. Для постоянного контроля состояния портов и хендшейков полезно вынести отдельный внешний мониторинг, а не полагаться только на дашборд самого OPNsense — если сервер целиком станет недоступен, его собственный интерфейс мониторинга тоже отвалится вместе с ним.
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли использовать OPNsense одновременно и как WireGuard-сервер, и как OpenVPN-сервер?
Да, оба стека независимы и работают параллельно на разных портах, ограничение только в ресурсах сервера и в том, что вы будете поддерживать два разных набора конфигов и клиентов.
Нужно ли ставить отдельный плагin os-wireguard-go?
В более старых версиях OPNsense — да, бэкенд wireguard-go шёл отдельным пакетом. В актуальных версиях выбор бэкенда встроен прямо в VPN → WireGuard → Settings как выпадающий список, отдельно ничего доустанавливать не требуется — но стоит свериться с версией именно вашей системы, если апгрейдитесь с более старого релиза.
Что произойдёт с тоннелями при перезагрузке OPNsense или обновлении прошивки?
WireGuard-инстансы поднимаются автоматически при старте системы, как и остальные сервисы файрвола — конфигурация хранится в общем config.xml, отдельного шага для автозапуска делать не нужно.
Можно ли мигрировать готовый конфиг с обычного Linux-сервера (wg0.conf) на OPNsense?
Технически можно вручную перенести приватный ключ, адрес и порт в поля Local, а пиров — в Endpoints, но автоматического импорта .conf-файла в GUI нет. Проще пересобрать конфигурацию заново через интерфейс, благо полей немного.
Чем принципиально отличается WireGuard на OPNsense от готовых решений вроде wg-easy?
OPNsense — это полноценный шлюз-файрвол, где WireGuard интегрирован с остальной маршрутизацией и NAT одной системы; wg-easy — лёгкая веб-панель поверх голого WireGuard без файрвола вокруг. Если вам нужен именно шлюз для сети (site-to-site, разные VLAN, единая точка фильтрации трафика) — OPNsense подходит больше; если нужен только быстрый клиентский VPN без остальной инфраструктуры — wg-easy проще и быстрее в развёртывании.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →