Почему DNS антизапрета не функционирует при использовании Docker?

Существует следующая схема: Proxmox VE → виртуальная машина с Ubuntu Server 22.04 → Docker. При попытке выполнить команду `docker run --rm -it --name network-test alpine ping gitlab.com` возникает ошибка "ping: bad address 'gitlab.com'". Аналогично, команда `docker run --rm -it --name network-test alpine nslookup gitlab.com` приводит к ответу "server can't find gitlab.com: REFUSED", несмотря на то что выполнение `nslookup gitlab.com` на хосте возвращает адрес `10.30.0.13` и успешно пингует его. 

По умолчанию Docker использует DNS-сервер с хоста, но было добавлено изменение в конфигурации `/etc/docker/daemon.json` для определения собственного DNS-сервера: 

```json
{
    "dns": ["10.29.4.1"]
}
```

Тем не менее, при использовании публичного DNS, все работает корректно, но требуется именно этот DNS-сервер. В чем может заключаться проблема?
  • 5 ноября 2024 г. 18:33
Ответы на вопрос 2
Проблема, с которой вы столкнулись при использовании DNS-сервера `10.29.4.1` в Docker-контейнерах, может быть связана с несколькими факторами. Вот несколько шагов по диагностике и возможные решения:

1. **Проверьте доступность DNS-сервера**:
    Убедитесь, что контейнер может достучаться до DNS-сервера `10.29.4.1`. Попробуйте запустить контейнер с использованием другого образа, чтобы иметь доступ к утилитам для диагностики. Например, запустите:
    ```bash
    docker run --rm -it --network host alpine sh
    ```
    Затем внутри этого контейнера выполните `ping 10.29.4.1` и `nslookup <ваш_домен> 10.29.4.1`. Это поможет определить, доступен ли DNS-сервер.

2. **Проверьте настройки вашего DNS-сервера**:
    Убедитесь, что DNS-сервер `10.29.4.1` правильно настроен и отвечает на запросы. Это может включать проверку конфигурации серверов DNS, наличие записей для запрашиваемых доменов и отсутствие каких-либо блокировок или фильтров, которые могут препятствовать запросам от Docker-контейнеров.

3. **Проверьте настройки Docker**:
    Убедитесь, что файл конфигурации `/etc/docker/daemon.json` был правильно загружен. После внесения изменений вам нужно перезапустить Docker:
    ```bash
    sudo systemctl restart docker
    ```

4. **Опция network_mode**:
    Попросите контейнер использовать сетевой режим "host", что может помочь в некоторых ситуациях:
    ```bash
    docker run --rm -it --network host alpine ping gitlab.com
    ```

5. **Проверьте сетевые настройки Docker**:
    Docker использует свой собственный сетевой стек, и иногда это может вызывать проблемы с DNS. Убедитесь, что ваша сеть Docker настроена правильно. Используйте команду `docker network ls` для проверки существующих сетей. Попробуйте запустить тест еще раз, убедившись, что вы используете правильную сеть.

6. **Firewall и правила IPTables**:
    Убедитесь, что настройки брандмауэра (например, UFW или iptables) на вашей Ubuntu не блокируют Docker или DNS-пакеты. Это может вызвать проблемы с сетевым подключением.

7. **Логи Docker**:
    Проверьте логи Docker для получения дополнительной информации о возможных ошибках:
    ```bash
    journalctl -u docker.service
    ```

Если ни одно из этих решений не помогает, попробуйте провести дополнительную отладку, запустив другие контейнеры и проверив, могут ли они достигать других сервисов или выполнять другие DNS-запросы.
Видим факты : 
1. Вы хотели, что бы докер использовал dns 10.29.4.1, он его пытается использовать.

2. С публичными dns—докер рабоет нормально.

Соответственно проблема с DNS 10.29.4.1.
По каким-то причинам он не хочет обслуживать Ваш докер.

Смотрим tcpdump какие пакеты идут от Вас к 10.29.4.1 напрямую с системы и из docker.
Похожие вопросы