Не удается разрешить DNS при подключении к WireGuard

Вопрос или проблема

Мне нужна помощь, чтобы понять, что я сделал не так с моей настройкой.

Мой основной файл компоновки:

name: homelab

networks:
  main:
    name: main
    external: true
    driver: bridge
  wg_network:
    name: wg_network
    ipam:
      config:
        - subnet: 10.8.1.0/24

secrets:
  cf_dns_api_token:
    file: ${SECRETSDIR}/cf_dns_api_token

include:
  - compose/dns/traefik.yaml
  - compose/dns/pihole.yaml
  - compose/dns/wg-easy.yaml
  - compose/services/uptime-kuma.yaml

Мой файл компоновки PiHole:

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "82:80/tcp"
    hostname: pi.hole
    environment:
      - TZ=${TZ}
      - WEBPASSWORD=${PIHOLE_PASSWORD}
    volumes:
      - ${DOCKERDIR}/data/pihole/etc-pihole:/etc/pihole
      - ${DOCKERDIR}/data/pihole/etc-dnsmasq.d:/etc/dnsmasq.d
    restart: unless-stopped
    networks:
      main: {}
      wg_network:
        ipv4_address: 10.8.1.3
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.pihole.entrypoints=websecure"
      - "traefik.http.routers.pihole.rule=Host(`pihole.${DOMAIN}`) && (PathPrefix(`/admin`) || PathPrefix(`/api`))"
      - "traefik.http.routers.pihole.tls.certresolver=cloudflare"
      - "traefik.http.routers.pihole.middlewares=secure-headers@file"
      - "traefik.http.services.pihole.loadbalancer.server.port=80"

И wg-easy:

services:
  wg-easy:
    container_name: wg-easy
    image: ghcr.io/wg-easy/wg-easy
    restart: unless-stopped
    environment:
      - WG_HOST=${DOMAIN}
      - PASSWORD_HASH=${PASSWORD_HASH}
      - WG_DEFAULT_DNS=10.8.1.3
      - WG_DEFAULT_ADDRESS=10.8.0.x
    volumes:
      - ${DOCKERDIR}/data/wireguard:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    networks:
      main: {}
      wg_network:
        ipv4_address: 10.8.1.2
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wg-easy.entrypoints=websecure"
      - "traefik.http.routers.wg-easy.rule=Host(`wg.${DOMAIN}`)"
      - "traefik.http.routers.wg-easy.tls.certresolver=cloudflare"
      - "traefik.http.routers.wg-easy.middlewares=secure-headers@file"
      - "traefik.http.services.wg-easy.loadbalancer.server.port=51821"

Я могу разрешать адреса из контейнера wg-easy

> docker exec -it wg-easy nslookup google.com 10.8.1.3
Server:     10.8.1.3
Address:    10.8.1.3:53

Non-authoritative answer:
Name:   google.com
Address: 142.250.75.142

Non-authoritative answer:
Name:   google.com
Address: 2a00:1450:4028:805::200e

Я даже вижу трафик в интерфейсе wg-easy, но я все еще не могу разрешить <service>.domain.com, когда я тестирую это на своем телефоне. Или даже google.com.

Тем не менее, я могу пинговать 8.8.8.8, когда подключен, так что это похоже на проблему с DNS.

Некоторые дополнительные вещи, связанные с WG:

wg show

> docker exec -it wg-easy wg show
interface: wg0
  public key: MYOSylsghbaB7SmXuK6ZCX0Zuia6HiW62GEDplX6iW0=
  private key: (hidden)
  listening port: 51820

peer: nAz7erPfcxf0UEUFsBWfDkGbvyE5quPWvC1owztplS4=
  preshared key: (hidden)
  endpoint: 2.53.160.215:33853
  allowed ips: 10.8.0.2/32
  latest handshake: 4 minutes, 36 seconds ago
  transfer: 410.81 KiB received, 7.58 MiB sent

IP маршрут

> docker exec -it wg-easy ip route
default via 172.18.0.1 dev eth0
10.8.0.2 dev wg0 scope link
10.8.1.0/24 dev eth1 proto kernel scope link src 10.8.1.2
10.8.1.0/24 dev wg0 proto kernel scope link src 10.8.1.1
172.18.0.0/16 dev eth0 proto kernel scope link src 172.18.0.4

Любая помощь в отладке этого будет оценена.

Попробовал удалить все с нуля, очистить сети Docker.

Ответ или решение

Проблемы с разрешением DNS при использовании WireGuard: Подробное руководство по диагностике и устранению неисправностей

При подключении к WireGuard у вас возникли проблемы с разрешением DNS, несмотря на то, что вы видите, что пакеты проходят в приложении wg-easy и можете использовать Heuristic ping (например, 8.8.8.8). Давайте детально разберем вашу конфигурацию и решим эту проблему шаг за шагом.

1. Анализ конфигурации Docker Compose

Ваша конфигурация, представленная в docker-compose.yaml, выглядит достаточно хорошо на первый взгляд. Вы создали две сети (main и wg_network), включили свои сервисы Pi-hole и wg-easy, и правильно настроили маршрутизацию IP. Однако блокировка разрешения DNS может быть связана с неправильными настройками в сети или в самих контейнерах.

Проверка настройки DNS в wg-easy

Вы указали WG_DEFAULT_DNS=10.8.1.3 в настройках среды для контейнера wg-easy. Это правильный подход, поскольку это IP-адрес вашего контейнера Pi-hole. Убедитесь, что ваша запись DNS в конфигурации WireGuard клиентов также указывает на настройку DNS. Она должна указывать на адрес Pi-hole (например, 10.8.1.3) для правильного разрешения DNS.

2. Проверка конфигурации Pi-hole

Доступ к веб-интерфейсу

Попробуйте зайти в веб-интерфейс Pi-hole, используя адрес http://pi.hole/admin. Убедитесь, что он работает, и проверьте настройки DNS на веб-интерфейсе Pi-hole. Убедитесь, что он использует надежные upstream DNS-серверы (например, Google DNS 8.8.8.8 или Cloudflare 1.1.1.1).

Логи и статистика

Также проверьте системные логи и статистику из Pi-hole, чтобы убедиться, что DNS-запросы из вашего клиента WireGuard принимаются и обрабатываются. Если запрашиваемые домены появляются в журнале запросов, это означает, что Pi-hole работает нормально.

3. Диагностика на клиенте WireGuard

Теперь следует проверить настройки клиента WireGuard на вашем мобильном устройстве:

  1. Конфигурация клиента: Убедитесь, что в .conf файле клиента правильно указаны адреса DNS. Это должно выглядеть примерно так:

    DNS = 10.8.1.3
  2. Соединение с VPN: Убедитесь, что ваше устройство действительно подключается к WireGuard. Вы можете использовать команду ping на известный IP, чтобы проверить соединение.

  3. Изменение всех DNS-запросов: На время диагностики попробуйте временно изменить (или удалить) другие DNS-серверы, если они указаны на устройстве, и оставьте только ваше локальное DNS (10.8.1.3).

4. Маршрутизация и фаервол

Проверка маршрутов

Вы можете проверить маршрутизацию на клиенте WireGuard с помощью команды ip route show. Убедитесь, что маршрут для 10.8.1.0/24 (ваша виртуальная сеть WireGuard) присутствует и отправляется через интерфейс WireGuard.

Фаервол

Если у вас настроен фаервол, убедитесь, что правила не блокируют порты 53 (DNS) и 51820 (WireGuard). Вы можете временно отключить фаервол для устранения неисправностей.

5. Дополнительные рекомендации

  • Перезапуск сервисов: Иногда простое перезапуск всех контейнеров (с помощью docker-compose down и docker-compose up) может помочь решить проблему.
  • Обновление образов: Проверьте, что ваши Docker образы актуальны. Иногда проблемы в предыдущих версиях контейнеров могут быть устранены в новых обновлениях.

Заключение

Проблемы с разрешением DNS в WireGuard могут возникать из-за различных факторов, включая неправильные настройки, конфликты маршрутизации и настройки фаервола. Следуя предложенным шагам, вы сможете изолировать и решить вашу проблему. Если вы все еще испытываете трудности, рассмотрите возможность предоставления более подробной информации о вашей конфигурации и логах для дальнейшей помощи.

Оцените материал
Добавить комментарий

Капча загружается...