WireGuard сервер на OpenWrt: LAN, локальный DNS и интернет через IP роутера


WireGuard на OpenWrt позволяет поднять легкий и быстрый VPN, через который можно безопасно получать доступ к локальной сети, использовать локальный DNS роутера и выходить в интернет с IP домашнего маршрутизатора. В этом руководстве по шагам разбирается настройка WireGuard-сервера в LuCI и через конфиги, создание отдельной firewall-зоны для VPN, проброс порта с WAN, а также тонкости работы DNS через dnsmasq для корректного резолвинга локальных хостов и внешних доменов из VPN. Отдельный раздел посвящен типичным проблемам (нет доступа к LAN, не работает DNS в туннеле) и их решению, включая проверку того, что dnsmasq слушает интерфейс WireGuard.

Такой вариант настройки WireGuard на OpenWrt удобен прежде всего для безопасного удалённого доступа к своей домашней инфраструктуре. Пользователь получает зашифрованный туннель до роутера, из которого видит всю локальную сеть и использует тот же DNS, что и дома, включая резолвинг внутренних имён устройств (NAS, медиа‑сервер, контроллер умного дома и т.п.). Это полезно для удалённого администрирования, доступа к личным файлам и сервисам без открытия лишних портов наружу, а также для удобной работы с «частным» внутренним доменом и сервисами, которые изначально не предназначены для выхода в интернет.

Второе практическое применение — унификация выхода в интернет для личных устройств, когда важно, чтобы они всегда «выходили» в сеть с IP домашнего роутера. Это помогает, например, при работе с сервисами, которые привязаны к определённому местоположению или IP, для удалённой работы с корпоративными ресурсами через доверенный домашний узел, либо для того, чтобы обеспечить одинаковую политику фильтрации/логирования через свои DNS и файрвол. В результате ноутбук или смартфон за пределами дома логически становится частью домашней сети: использует один и тот же DNS, видит локальные ресурсы и выходит в интернет так, как если бы был подключён к Wi‑Fi дома.

1. Установка пакетов

  1. В LuCI: System → Software → Update lists.
  2. Установи пакеты:
  • kmod-wireguard
  • wireguard-tools
  • luci-proto-wireguard

После установки перезапусти LuCI (или роутер, если хочется «чисто»).

2. Создание WireGuard‑интерфейса

  1. Network → Interfaces → Add new interface.
  2. Name: wgs0 (название произвольное, но дальше пример с wgs0).
  3. Protocol: WireGuard VPN.
  4. В настройках интерфейса wgs0:
  • Generate keypair → сохранить Private Key (остается на роутере) и Public Key (для клиентов).
  • Listen Port: 51820 (или любой UDP, главное потом пробросить на WAN).
  • IP address: например 172.31.27.1/24 — это внутренняя подсеть для VPN‑клиентов.

Сохрани (Save & Apply).

3. Добавление peer (клиента) на роутере

В интерфейсе wgs0 → вкладка Peers → Add peer.

Для каждого клиента (телефон, ноутбук):

  • Description: что‑то вроде phone.
  • Public Key: публичный ключ клиента (сгенерируешь на клиенте).
  • Allowed IPs: например 172.31.27.2/24 (уникальный IP клиента в VPN‑подсети).
  • Route Allowed IPs: включить (галка), чтобы OpenWrt анонсировал маршрут для сети клиента.

Если хочешь, чтобы один клиент имел несколько адресов/подсетей — можно добавить несколько Allowed IPs, но в типичном случае один /32.

4. Firewall: зона для WireGuard

Рекомендуется отдельная зона wg (или vpn), с доступом в LAN и WAN.

  1. Network → Firewall → Zones → Add:
  • Name: wg.
  • Covered networks: поставить галку на wgs0.
  • Input: accept (чтобы клиент мог достучаться до роутера и DNS).
  • Output: accept.
  • Forward: accept.
  • Masquerading: включить (нужно для выхода клиентов в интернет через WAN).
  • MSS clamping: включить (желательно).

Сохрани.

  1. Там же внизу: Forwardings:
  • Allow forward from wg to lan (доступ из VPN в локалку).
  • Allow forward from wg to wan (доступ из VPN в интернет).

Если нужно, чтобы LAN тоже могла ходить в VPN (редко нужно) — добавь lanwg, но обычно это не требуется.

  1. Открытие порта WireGuard с WAN:

Network → Firewall → Traffic Rules → Add.

  • Name: wan-local-wg.
  • Protocol: UDP.
  • Source zone: wan.
  • Destination zone: device (или this device).
  • Destination port: 51820.

Сохранить и применить.

5. Доступ к локальной сети

При указанной выше схеме (зона wg разрешена в lan) клиент будет видеть всю LAN по IP‑адресам.

Важно:

  • На клиенте в AllowedIPs указываем не только 10.10.10.0/24, но и подсеть LAN, например 192.168.1.0/24, если нужен доступ к локалке через VPN.
  • Про DNS и имена см. следующий раздел.

Если LAN не пингуется:

  • Проверь, что интерфейс wgs0 добавлен в зону wg, а не в wan/lan по ошибке.
  • Убедись, что нет других правил, блокирующих forward wglan.

6. Настройка локального DNS для клиентов

Задача: чтобы клиент через VPN использовал DNS роутера и мог резолвить локальные hostnames.

Вариант через WireGuard (per peer)

В конфигурации клиента (на стороне телефона/ноута):

  • DNS (если клиент поддерживает, напр. Android/Windows): 172.31.27.1 (IP роутера в LAN) или IP wgs0 (172.31.27.1).

На роутере:

  • DNS rebind protection: если используешь свой локальный домен (типа home.lan, local), добавь его в whitelist в DHCP → DNS and DHCP → Domain whitelist или отключи rebind protection (менее безопасно).

Таким образом:

  • Весь DNS‑трафик клиента пойдет на роутер.
  • Роутер разруливает локальные имена (через dnsmasq/odhcpd) и внешние (через провайдера или твой апстрим‑DNS).

Вариант через DHCP на OpenWrt (если клиенты — за другим роутером)

Если WireGuard‑клиент — это отдельный роутер (travel‑router, второй OpenWrt и т.п.), то на нем в DHCP надо прописать DNS как IP главного роутера.

7. Полный туннель (интернет через IP роутера)

Чтобы весь трафик клиента шел через WireGuard и уходил в интернет с IP твоего OpenWrt:

  1. На клиенте в конфигурации:
  • AllowedIPs = 0.0.0.0/0, ::/0 (full tunnel).
  • DNS = IP роутера (как в предыдущем разделе).
  1. На роутере:
  • В зоне wg включено Masquerading (уже сделали выше).
  • Есть forward wgwan (тоже сделали).

Этого достаточно, чтобы:

  • VPN‑клиент выходил в интернет с IP роутера.
  • Клиент имел доступ в LAN и к самому роутеру.

Если интернет не ходит:

  • Проверь, что у интерфейса wgs0 включен Route Allowed IPs (при конфигурации peer на стороне OpenWrt).
  • Убедись, что основной маршрут клиента действительно через WireGuard (на Linux ip route, на Windows route print, на Android — через GUI).

8. Пример конфигов (схематично)

/etc/config/network (фрагмент)

config interface 'wgs0'
    option proto 'wireguard'
    option private_key 'ROUTER_PRIVATE_KEY'
    option listen_port '51820'
    list addresses '172.31.27.1/24'

config wireguard_wgs0 'client1'
    option public_key 'CLIENT1_PUBLIC_KEY'
    list allowed_ips '172.31.27.2/32'
    option route_allowed_ips '1'

/etc/config/firewall (фрагмент)

config zone
    option name 'wg'
    list network 'wgs0'
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'ACCEPT'
    option masq '1'
    option mtu_fix '1'

config forwarding
    option src 'wg'
    option dest 'lan'

config forwarding
    option src 'wg'
    option dest 'wan'

config rule
    option name 'Allow-WireGuard-Inbound'
    option src 'wan'
    option dest_port '51820'
    option proto 'udp'
    option target 'ACCEPT'

9. Что прописать на клиенте (пример)

Например, мобильный клиент:

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 172.31.27.2/32
DNS = 172.31.27.1

[Peer]
PublicKey = ROUTER_PUBLIC_KEY
Endpoint = YOUR_WAN_IP_OR_DDNS:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
  • DNS = 192.168.1.1 — локальный DNS роутера (можно 172.31.27.1).
  • AllowedIPs = 0.0.0.0/0 — весь трафик через VPN.

Если хочешь split‑tunnel (только доступ к LAN, интернет — мимо VPN) — меняешь AllowedIPs на 172.31.27.0/24, 192.168.1.0/24 и убираешь 0.0.0.0/0.

Решение проблем

  • Если VPN поднимается, LAN пингуется, но не работает DNS‑резолвинг (домены и имена хостов), нужно проверить настройки dnsmasq на OpenWrt. В Network → DHCP and DNS (или в /etc/config/dhcp) убедись, что dnsmasq слушает все интерфейсы по умолчанию, либо явно перечислены интерфейсы, включая wgs0 (например, через list interface 'lan' и list interface 'wgs0'). Если раньше ограничивал прослушивание только br-lan или другими интерфейсами (interface=br-lan в dnsmasq.conf или option interface 'lan' без wgs0), добавь туда WireGuard‑интерфейс или убери ограничение, и перезапусти dnsmasq (/etc/init.d/dnsmasq restart)