Бегунов ЕгорСистемный администратор, DevOps
  1. Главная
  2. Блог
  3. Сети

WireGuard site-to-site: OPNsense ↔ Keenetic Sprinter

Содержание

Задача

Нужно было связать офисную сеть за Keenetic Sprinter с удалённой площадкой, где работают виртуальные машины. У обеих сторон белые IP-адреса. В итоге офисные машины ходят в сеть ВМ через WireGuard-туннель, а веб-интерфейс файрвола не торчит в интернет.

На удалённой стороне встал OPNsense на виртуальной машине. Ниже вся настройка по шагам, включая грабли: конфликт подсетей, маршрут, который Keenetic не добавляет сам, и первый вход в веб-интерфейс, когда в LAN нет ни одной машины.

Исходные данные

Две площадки, у каждой свой белый IP. Туннель WireGuard идёт на UDP 51820, внутри него транзитная сеть 10.10.10.0/24.

СторонаУстройствоWANLANАдрес в туннеле
ОфисKeenetic Sprinter198.51.100.20192.168.1.0/2410.10.10.2/24
Площадка с ВМOPNsense 26.7 на ВМ203.0.113.10/28, шлюз 203.0.113.1192.168.10.0/2410.10.10.1/24

Keenetic и OPNsense держат туннель между своими белыми адресами, а машины за ними ходят друг к другу через транзитную сеть 10.10.10.0/24.

Адреса WAN и ключи в статье заменены на примеры, подставьте свои.

Почему OPNsense

Сначала я смотрел на RouterOS CHR, но без платной лицензии он ограничивает скорость 1 Мбит/с на интерфейс. Из бесплатных вариантов остались pfSense CE и OPNsense.

КритерийOPNsensepfSense CE
Цикл релизовМажорные версии в январе и июле, частые патчи (релиз 26.7)Редкие релизы, Netgate предлагает переходить на Plus (анонс 2.9.0)
WireGuardВстроен, настройка в GUIВстроен, настройка в GUI
АвтоматизацияREST API почти на всёОграниченно, API через сторонний пакет
АрхитектураТолько amd64Только amd64

Для туннеля с Keenetic разницы между ними нет. Я выбрал OPNsense за регулярные обновления и API.

Установка OPNsense

Для виртуальной машины нужен образ типа dvd: это ISO с установщиком, который ставит систему на диск.

Тип образаДля чего
dvdISO-установщик, подходит для ВМ
vgaОбраз для записи на USB-флешку, консоль на мониторе
serialОбраз для USB-флешки, консоль через COM-порт
nanoГотовая система для записи на флешку или CF-карту встраиваемых устройств
  1. На opnsense.org/download выберите архитектуру amd64 и тип dvd. Распакуйте архив .bz2.
  2. Создайте ВМ: 2 vCPU, 2–4 ГБ RAM, диск от 20 ГБ и два сетевых адаптера. Один адаптер подключите к внешней сети (WAN), второй к внутренней (LAN).
  3. Загрузитесь с ISO. Система стартует в live-режиме, логин installer, пароль opnsense.
  4. В установщике выберите файловую систему (ZFS или UFS), целевой диск и задайте пароль root. После установки отключите ISO и перезагрузите ВМ.
  5. В консольном меню выберите 1) Assign interfaces:
  6. на вопрос о LAGG ответьте n, о VLAN тоже n;
  7. WAN: em0, LAN: em1.
  8. Чтобы понять, какой адаптер куда подключён, сверьте MAC-адреса из списка с настройками сетевых карт ВМ в гипервизоре.
  9. Выберите 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 доступ закрыт фильтром, поэтому сначала открываем себе вход через консоль.

  1. В консоли выберите 8) Shell и выполните pfctl -d. Эта команда временно отключает пакетный фильтр целиком.
  2. Откройте https://203.0.113.10, примите самоподписанный сертификат и войдите под root.
  3. Firewall → Aliases → Add:
  4. Type: Host(s);
  5. Name: mgmt_admins;
  6. Content: внешние IP-адреса администраторов, по одному на строку.
  7. Firewall → Rules → WAN → Add:
  8. Action: Pass, Direction: In, Version: IPv4, Protocol: TCP;
  9. Source: mgmt_admins;
  10. Destination: WAN address, Destination port: HTTPS (443).
  11. Нажмите 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.

  1. Interfaces → LAN → IPv4 address: 192.168.10.1, маска 24. Save → Apply.
  2. 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.

Правила фаервола:

  1. Firewall → Rules → WAN → Add: Pass, Protocol UDP, Source any, Destination WAN address, Destination port 51820. Без этого правила хендшейк до OPNsense не дойдёт.
  2. 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 → PeerPublic 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 идёт, а до сети ВМ нет.

Проверка и диагностика

Туннель работает, если есть свежий хендшейк и пинг проходит в сеть за противоположной стороной.

  1. Хендшейк. На Keenetic в списке WireGuard-подключений колонка «Последнее рукопожатие» должна показывать секунды. На OPNsense смотрите VPN → WireGuard → Status.
  2. С машины в офисе: ping 10.10.10.1, затем ping 192.168.10.1.
  3. С OPNsense: Interfaces → Diagnostics → Ping, Hostname 192.168.1.1, Source 10.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.

Подводные камни

Всё, на что я наступил по ходу настройки, в одной таблице.

СимптомПричинаРешение
Веб-интерфейс не открывается по WANGUI доступен только из 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 больше не нужно держать открытым в интернет.

  1. С машины в офисе откройте https://192.168.10.1 и убедитесь, что GUI доступен через туннель.
  2. Если фильтр отключали командой pfctl -d, включите его: pfctl -e в Shell или любой Apply в правилах.
  3. Удалите временное правило на WAN для порта 443. Alias mgmt_admins можно оставить на будущее.
  4. Сузьте правило на группе WireGuard: например, источник 10.10.10.2, назначение 192.168.10.0/24. С NAT на Keenetic весь офис приходит с этого адреса.

В итоге офис и площадка с ВМ связаны WireGuard-туннелем, а OPNsense управляется только изнутри.