Вопрос или проблема
Как сбросить кэш DNS в Ubuntu 24.10?
Следующие команды не работают:
systemd-resolve --flush-caches
resolvectl flush-caches
Когда я пингую определённое доменное имя, оно всё ещё разрешается в старый IP-адрес. Я точно знаю, что изменения DNS были распространены, потому что на другой машине отображается новый IP-адрес.
Чтобы очистить кэш DNS локального резольвера, вам просто нужно выполнить следующую команду:
resolvectl flush-caches
Например, сначала проверьте текущий размер кэша вашего DNS-кэша с помощью команды resolvectl statistics
. Обратите внимание, что размер кэша составляет 14.
$ resolvectl statistics
DNSSEC поддерживается текущими серверами: нет
Транзакции
Текущие транзакции: 0
Всего транзакций: 101
Кэш
Текущий размер кэша: 14
Попадания в кэш: 29
Промахи кэша: 104
Вердикты DNSSEC
Защищено: 0
Незащищено: 0
Ошибочно: 0
Неопределено: 0
Затем очистите свой кэш и проверьте статистику снова. Вы заметите, что текущий размер кэша теперь 0.
$ resolvectl flush-caches
$ resolvectl statistics
DNSSEC поддерживается текущими серверами: нет
Транзакции
Текущие транзакции: 0
Всего транзакций: 103
Кэш
Текущий размер кэша: 0
Попадания в кэш: 29
Промахи кэша: 106
Вердикты DNSSEC
Защищено: 0
Незащищено: 0
Ошибочно: 0
Неопределено: 0
После этого, если результаты разрешения доменного имени из вашей команды ping
не такие, как вы ожидаете, вам нужно исследовать конфигурацию сервера.
Правильно ли настроен файл /etc/resolv.conf
? Он должен быть символьной ссылкой на /run/systemd/resolve/stub-resolv.conf
, что является конфигурацией по умолчанию. Проверьте с помощью следующей команды:
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Dec 31 2021 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
Если это не символическая ссылка, а статический файл с каким-то ошибочным сервером имён, исправьте с помощью следующих команд:
sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
Далее, проверьте, какие ваши текущие uplink серверы имён. Используйте resolvectl status
, чтобы выяснить. В моём примере ниже серверами имен являются 8.8.8.8
и 1.1.1.1
,
$ resolvectl status
Global
Протоколы: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
режим resolv.conf: stub
Link 2 (enp11s0)
Текущие области: none
Протоколы: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Link 3 (wlp9s0)
Текущие области: DNS
Протоколы: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Текущий DNS-сервер: 8.8.8.8
DNS-серверы: 8.8.8.8 1.1.1.1
Link 4 (virbr0)
Текущие области: none
Протоколы: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Теперь попробуйте разрешить доменное имя с этим конкретным сервером имен и обойти локальный резольвер с помощью команды dig
и указания сервера имен:
$ dig @8.8.8.8 askubuntu.com
; <<>> DiG 9.18.30-0ubuntu0.22.04.1-Ubuntu <<>> @8.8.8.8 askubuntu.com
; (1 сервер найден)
;; глобальные параметры: +cmd
;; Получен ответ:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60706
;; флаги: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: версия: 0, флаги:; udp: 512
;; ВОПРОСНАЯ СЕКЦИЯ:
;askubuntu.com. IN A
;; ОТВЕТНАЯ СЕКЦИЯ:
askubuntu.com. 300 IN A 104.18.37.100
askubuntu.com. 300 IN A 172.64.150.156
;; Время запроса: 187 мс
;; СЕРВЕР: 8.8.8.8#53(8.8.8.8) (UDP)
;; КОГДА: Tue Jan 14 17:59:05 PST 2025
;; MSG SIZE rcvd: 74
Проанализируйте результаты, чтобы увидеть, является ли IP-адрес ожидаемым. Если нет, и если это локальный сервер имен в вашей сети, проверьте сам сервер имен.
Если результаты соответствуют вашим ожиданиям, но всё равно неправильны с ping
после очистки вашего DNS-кэша, тогда проверьте содержимое файла /etc/hosts
, чтобы убедиться, что у вас нет записей, переопределяющих это доменное имя.
Проверьте, какие DNS-серверы использует ваша машина:
resolvectl status | grep 'Current DNS Server'
Вы получите что-то вроде этого:
Current DNS Server: 192.168.100.1
Затем попробуйте эту команду, используя IP-адрес вашего DNS.
dig @192.168.100.1 DOMAIN
Проверьте с внешним DNS
dig @8.8.8.8 DOMAIN
Если у вас продолжаются проблемы, перезапустите вашу систему разрешения.
sudo systemctl restart systemd-resolved
Если в /etc/hosts
есть запись, которая переопределяет разрешение DNS, вы можете проверить её с помощью:
cat /etc/hosts
Если вы найдёте запись для <DOMAIN>
, пожалуйста, удалите её или закомментируйте.
.
Ответ или решение
Чтобы очистить DNS-кеш в Ubuntu 24.10, необходимо выполнить несколько проверок и действий, поскольку стандартные команды, такие как systemd-resolve --flush-caches
и resolvectl flush-caches
, могут не всегда работать, как ожидалось. Рассмотрим, как можно справиться с этой ситуацией, и что стоит проверить, чтобы убедиться в правильности настроек DNS.
Теория
DNS (Domain Name System) отвечает за преобразование человеческих имен доменов в IP-адреса, которые понятны компьютерным системам. Иногда происходит обновление DNS-записей, например, когда меняется IP-адрес сервера, обслуживающего сайт. Однако, ваш локальный компьютер может все еще иметь старые записи в своем кеш-памяти, что приводит к неправильному разрешению адресов. Это может создать проблемы, как в вашем случае, где команда ping
возвращает старый IP-адрес, несмотря на успешное обновление DNS на других машинах.
Пример
Начнем с команды resolvectl statistics
, чтобы проверить текущий размер кеша и другие статистические данные:
$ resolvectl statistics
Эта команда позволит вам увидеть текущий размер кеша и количество успешных и неуспешных разрешений. После этого используйте команду:
$ resolvectl flush-caches
Если эта команда очистила кеш, вы увидите, что размер кеша станет равен нулю, если снова проверите статистику:
$ resolvectl statistics
Применение
Если проблема не решена, следует исследовать конфигурацию серверов имен. Проверим, правильно ли настроен файл /etc/resolv.conf
. Это должен быть символическая ссылка на /run/systemd/resolve/stub-resolv.conf
. Выполните команду:
$ ls -l /etc/resolv.conf
Если это не символическая ссылка, исправьте это:
sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
После этого проверьте, какие сервера DNS используются вашим компьютером:
$ resolvectl status | grep 'Current DNS Server'
Этим вы получите IP-адрес текущего DNS-сервера. Затем попробуйте использовать команду dig
для проверки разрешения доменного имени:
dig @<IP вашего DNS-сервера> ваш-домен
Если проблема все еще существует, попробуйте проверить с использованием внешнего DNS-сервера, например Google:
dig @8.8.8.8 ваш-домен
Эти команды помогут вам определить, является ли проблема локальной на вашей машине или связана с вашими DNS-серверами.
Если все еще наблюдаются проблемы, перезапустите сервис разрешения имен:
sudo systemctl restart systemd-resolved
И, наконец, проверьте файл /etc/hosts
на предмет переопределений DNS:
cat /etc/hosts
Если найдёте записи для вашего домена, которые не соответствуют обновлениям в DNS, удалите или закомментируйте их.
Заключение
Следуя данным рекомендациям, вы сможете эффективно очистить DNS-кеш на Ubuntu 24.10 и решить проблему с некорректным разрешением доменных имен. Эта многоэтапная проверка конфигурации и действий должна выявить и исправить наиболее распространенные проблемы, связанные с кешированием DNS в Ubuntu. Если же проблема не решена, возможно, вы столкнулись с уникальным случаем, требующим более глубокого анализа конфигурации сети или связанного программного обеспечения.