Содержание
Задача
Нужно было связать офисную сеть за Keenetic Sprinter с удалённой площадкой, где работают виртуальные машины. У обеих сторон белые IP-адреса. В итоге офисные машины ходят в сеть ВМ через WireGuard-туннель, а веб-интерфейс файрвола не торчит в интернет.
На удалённой стороне встал OPNsense на виртуальной машине. Ниже вся настройка по шагам, включая грабли: конфликт подсетей, маршрут, который Keenetic не добавляет сам, и первый вход в веб-интерфейс, когда в LAN нет ни одной машины.
Исходные данные
Две площадки, у каждой свой белый IP. Туннель WireGuard идёт на UDP 51820, внутри него транзитная сеть 10.10.10.0/24.
| Сторона | Устройство | WAN | LAN | Адрес в туннеле |
|---|---|---|---|---|
| Офис | Keenetic Sprinter | 198.51.100.20 | 192.168.1.0/24 | 10.10.10.2/24 |
| Площадка с ВМ | OPNsense 26.7 на ВМ | 203.0.113.10/28, шлюз 203.0.113.1 | 192.168.10.0/24 | 10.10.10.1/24 |
Keenetic и OPNsense держат туннель между своими белыми адресами, а машины за ними ходят друг к другу через транзитную сеть 10.10.10.0/24.
Адреса WAN и ключи в статье заменены на примеры, подставьте свои.
Почему OPNsense
Сначала я смотрел на RouterOS CHR, но без платной лицензии он ограничивает скорость 1 Мбит/с на интерфейс. Из бесплатных вариантов остались pfSense CE и OPNsense.
| Критерий | OPNsense | pfSense CE |
|---|---|---|
| Цикл релизов | Мажорные версии в январе и июле, частые патчи (релиз 26.7) | Редкие релизы, Netgate предлагает переходить на Plus (анонс 2.9.0) |
| WireGuard | Встроен, настройка в GUI | Встроен, настройка в GUI |
| Автоматизация | REST API почти на всё | Ограниченно, API через сторонний пакет |
| Архитектура | Только amd64 | Только amd64 |
Для туннеля с Keenetic разницы между ними нет. Я выбрал OPNsense за регулярные обновления и API.
Установка OPNsense
Для виртуальной машины нужен образ типа dvd: это ISO с установщиком, который ставит систему на диск.
| Тип образа | Для чего |
|---|---|
| dvd | ISO-установщик, подходит для ВМ |
| vga | Образ для записи на USB-флешку, консоль на мониторе |
| serial | Образ для USB-флешки, консоль через COM-порт |
| nano | Готовая система для записи на флешку или CF-карту встраиваемых устройств |
- На opnsense.org/download выберите архитектуру amd64 и тип dvd. Распакуйте архив .bz2.
- Создайте ВМ: 2 vCPU, 2–4 ГБ RAM, диск от 20 ГБ и два сетевых адаптера. Один адаптер подключите к внешней сети (WAN), второй к внутренней (LAN).
- Загрузитесь с ISO. Система стартует в live-режиме, логин
installer, парольopnsense. - В установщике выберите файловую систему (ZFS или UFS), целевой диск и задайте пароль root. После установки отключите ISO и перезагрузите ВМ.
- В консольном меню выберите 1) Assign interfaces:
- на вопрос о LAGG ответьте
n, о VLAN тожеn; - WAN:
em0, LAN:em1. - Чтобы понять, какой адаптер куда подключён, сверьте MAC-адреса из списка с настройками сетевых карт ВМ в гипервизоре.
- Выберите 2) Set interface IP address → WAN и задайте статический адрес
203.0.113.10/28со шлюзом203.0.113.1.
После этого в шапке консоли у WAN появится адрес, а LAN по умолчанию получит 192.168.1.1/24.
Первый вход в веб-интерфейс через WAN
По умолчанию веб-интерфейс OPNsense доступен только из LAN, а в LAN у меня не было ни одной машины, гипервизор далеко. Со стороны WAN доступ закрыт фильтром, поэтому сначала открываем себе вход через консоль.
- В консоли выберите 8) Shell и выполните
pfctl -d. Эта команда временно отключает пакетный фильтр целиком. - Откройте
https://203.0.113.10, примите самоподписанный сертификат и войдите подroot. - Firewall → Aliases → Add:
- Type: Host(s);
- Name:
mgmt_admins; - Content: внешние IP-адреса администраторов, по одному на строку.
- Firewall → Rules → WAN → Add:
- Action: Pass, Direction: In, Version: IPv4, Protocol: TCP;
- Source:
mgmt_admins; - Destination: WAN address, Destination port: HTTPS (443).
- Нажмите Save, затем Apply. Применение правил снова включает фильтр (вручную это делает
pfctl -e).
Если правило есть, а доступа нет, проверьте, с какого адреса вы на самом деле приходите. Сервисы «мой IP» в браузере могут показать адрес выхода прокси или VPN-клиента, а не тот, с которого идёт трафик на файрвол. Реальный адрес видно в Shell командой tcpdump -ni em0 tcp port 443 во время попытки входа.
Это временная мера: после запуска туннеля правило на 443 удаляем.
Смена LAN-подсети OPNsense
LAN OPNsense по умолчанию 192.168.1.0/24, то есть совпадает с офисной сетью за Keenetic. Две одинаковые подсети по разные стороны туннель не свяжет: маршрутизатор считает обе сети своими. Меняем сторону, где ещё нет машин, то есть OPNsense.
- Interfaces → LAN → IPv4 address:
192.168.10.1, маска24. Save → Apply. - Services → DHCPv4 (ISC, Kea или Dnsmasq, смотря что включено) → LAN: диапазон
192.168.10.100–192.168.10.200.
Доступ к веб-интерфейсу через WAN смена LAN не затрагивает.
WireGuard на OPNsense
Порядок важен: сначала создаётся Instance (локальный конец туннеля), потом Peer. Без инстанса пир не к чему привязать, а без ключа Keenetic его нельзя сохранить.
Instance: VPN → WireGuard → Instances → Add.
- Name:
wg_keenetic - Listen port:
51820 - Tunnel address:
10.10.10.1/24 - Public key и Private key: сгенерируйте кнопкой с шестерёнкой. Публичный ключ понадобится на Keenetic.
Peer: VPN → WireGuard → Peers → Add. Заполняется после настройки Keenetic, когда у вас есть его публичный ключ.
- Name:
Keenetic-office - Public key: публичный ключ Keenetic
- Allowed IPs:
10.10.10.2/32и192.168.1.0/24 - Endpoint address:
198.51.100.20, Endpoint port:51820 - Instances:
wg_keenetic - Keepalive interval:
25
Если поле Allowed IPs подсвечено красным, нажмите Clear All и введите адреса заново, нажимая Enter после каждого. Затем на вкладке Instances отметьте Enable WireGuard и нажмите Apply.
Маршрут 192.168.1.0/24 → wg0 OPNsense создаёт сам из Allowed IPs, проверить его можно в System → Routes → Status.
Правила фаервола:
- Firewall → Rules → WAN → Add: Pass, Protocol UDP, Source any, Destination WAN address, Destination port
51820. Без этого правила хендшейк до OPNsense не дойдёт. - Firewall → Rules → WireGuard (Group) → Add: Pass, IPv4, Protocol any, Source any, Destination any. Без него хендшейк проходит, но трафик в LAN за OPNsense не идёт. После запуска правило стоит сузить.
WireGuard на Keenetic Sprinter
На Keenetic нужны три вещи: само подключение с пиром, разрешающее правило на WG-интерфейсе и статический маршрут в сеть за OPNsense.
Подключение: Интернет → Другие подключения → WireGuard → Добавить подключение.
- Имя:
wg_opnsense - Нажмите «Генерация пары ключей». Публичный ключ скопируйте в Peer на OPNsense.
- IPv4-адрес:
10.10.10.2/24 - Порт прослушивания:
51820 - «Использовать для выхода в интернет»: у меня туннель поднялся только с этой галкой. Заодно Keenetic начинает делать NAT в туннель, поэтому OPNsense видит все офисные машины как
10.10.10.2. В «Приоритетах подключений» проверьте, что основным остаётся подключение к провайдеру.
Пир: кнопка «Добавить пир».
- Публичный ключ: публичный ключ OPNsense из Instance
- Адрес и порт пира:
203.0.113.10:51820 - Разрешённые подсети:
10.10.10.1/32и192.168.10.0/24 - Проверка активности:
25
Ключи вставляются крест-накрест, приватные ключи не покидают своё устройство:
| Где | Поле | Что вставить |
|---|---|---|
| OPNsense → Peer | Public key | Публичный ключ Keenetic |
| Keenetic → Пир | Публичный ключ | Публичный ключ OPNsense (из Instance) |
Межсетевой экран: Сетевые правила → Межсетевой экран → вкладка wg_opnsense → Добавить правило. Действие «Разрешить», источник и назначение «Любой», протокол IP. Варианта «Любой» в списке протоколов нет, IP означает любой IP-протокол.
Маршрут: Сетевые правила → Маршрутизация → Добавить маршрут.
- Тип: маршрут до сети
- Сеть назначения:
192.168.10.0, маска255.255.255.0 - Адрес шлюза: пусто
- Интерфейс:
wg_opnsense - «Добавлять автоматически»: включить, чтобы маршрут восстанавливался после переподключения туннеля
Keenetic не создаёт маршрут из разрешённых подсетей пира. Без этого шага пинг до 10.10.10.1 идёт, а до сети ВМ нет.
Проверка и диагностика
Туннель работает, если есть свежий хендшейк и пинг проходит в сеть за противоположной стороной.
- Хендшейк. На Keenetic в списке WireGuard-подключений колонка «Последнее рукопожатие» должна показывать секунды. На OPNsense смотрите VPN → WireGuard → Status.
- С машины в офисе:
ping 10.10.10.1, затемping 192.168.10.1. - С OPNsense: Interfaces → Diagnostics → Ping, Hostname
192.168.1.1, Source10.10.10.1. Пингуйте сам Keenetic, а не Windows-машину: встроенный фаервол Windows по умолчанию отвечает на ping только из своей подсети.
Если трафик не идёт, посмотрите на OPNsense, доходят ли пакеты до туннеля. В Shell выполните:
tcpdump -ni wg0 icmp
| Что видно в tcpdump | Где искать проблему |
|---|---|
| Пакетов нет | Keenetic не отправляет трафик в туннель: маршрут или правило на Keenetic |
| Запросы есть, ответов нет | OPNsense: правило на группе WireGuard или обратный маршрут |
| Запросы и ответы есть | Ответ теряется на обратном пути: Keenetic или клиент |
По адресу источника заодно видно, делает ли Keenetic NAT: у меня все пакеты приходили с 10.10.10.2.
Подводные камни
Всё, на что я наступил по ходу настройки, в одной таблице.
| Симптом | Причина | Решение |
|---|---|---|
| Веб-интерфейс не открывается по WAN | GUI доступен только из LAN, WAN закрыт фильтром | pfctl -d в Shell, alias администраторов и правило на 443 |
| Правило на WAN есть, но не пускает | Трафик приходит с другого IP, чем показал сервис «мой IP» (прокси, VPN-клиент) | Узнать реальный адрес через tcpdump -ni em0 tcp port 443 |
| Туннель не может связать сети | LAN обеих сторон 192.168.1.0/24 | Сменить LAN OPNsense на 192.168.10.0/24 |
| Peer не сохраняется, «A value is required» | Нет Instance и ключа Keenetic | Сначала Instance, потом Keenetic, потом Peer |
Хендшейк есть, 10.10.10.1 пингуется, 192.168.10.1 нет | Keenetic не создаёт маршрут из разрешённых подсетей | Статический маршрут 192.168.10.0/24 через wg_opnsense |
| С OPNsense не пингуется Windows-машина в офисе | Фаервол Windows отвечает на ping только из своей подсети | Пинговать Keenetic 192.168.1.1 или разрешить ICMP в Windows |
| В правиле Keenetic нет протокола «Любой» | Так устроен интерфейс | Выбрать протокол IP |
| Клиенты SSTP-сервера Keenetic не попадают в туннель | Пакеты доходят до Keenetic, но в туннель он их не отправляет | Не решено; обход: отдельный WireGuard-пир на OPNsense для ноутбука |
После запуска: закрываем доступ
Когда туннель работает, веб-интерфейс OPNsense больше не нужно держать открытым в интернет.
- С машины в офисе откройте
https://192.168.10.1и убедитесь, что GUI доступен через туннель. - Если фильтр отключали командой
pfctl -d, включите его:pfctl -eв Shell или любой Apply в правилах. - Удалите временное правило на WAN для порта 443. Alias
mgmt_adminsможно оставить на будущее. - Сузьте правило на группе WireGuard: например, источник
10.10.10.2, назначение192.168.10.0/24. С NAT на Keenetic весь офис приходит с этого адреса.
В итоге офис и площадка с ВМ связаны WireGuard-туннелем, а OPNsense управляется только изнутри.