- Вопрос или проблема
- Ответ или решение
- Проблемы с разрешением DNS при использовании WireGuard: Подробное руководство по диагностике и устранению неисправностей
- 1. Анализ конфигурации Docker Compose
- Проверка настройки DNS в wg-easy
- 2. Проверка конфигурации Pi-hole
- Доступ к веб-интерфейсу
- Логи и статистика
- 3. Диагностика на клиенте WireGuard
- 4. Маршрутизация и фаервол
- Проверка маршрутов
- Фаервол
- 5. Дополнительные рекомендации
- Заключение
Вопрос или проблема
Мне нужна помощь, чтобы понять, что я сделал не так с моей настройкой.
Мой основной файл компоновки:
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 на вашем мобильном устройстве:
-
Конфигурация клиента: Убедитесь, что в .conf файле клиента правильно указаны адреса DNS. Это должно выглядеть примерно так:
DNS = 10.8.1.3
-
Соединение с VPN: Убедитесь, что ваше устройство действительно подключается к WireGuard. Вы можете использовать команду
ping
на известный IP, чтобы проверить соединение. -
Изменение всех 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 могут возникать из-за различных факторов, включая неправильные настройки, конфликты маршрутизации и настройки фаервола. Следуя предложенным шагам, вы сможете изолировать и решить вашу проблему. Если вы все еще испытываете трудности, рассмотрите возможность предоставления более подробной информации о вашей конфигурации и логах для дальнейшей помощи.