В Ubuntu 20 или 22 LTS, если я пытаюсь использовать имя хоста, такое как anyname.localhost
, оно всегда разрешается в адрес IPv6 :: 1.
В старом RHEL 6, если я пытаюсь использовать имя хоста, например anyname.localhost
, оно всегда разрешается в адрес IPv4 127.0.0.1.
На компьютере с MS-Windows или MacOS 12.6 этого не происходит. (Это происходит только в том случае, если я вручную редактирую /etc/hosts и вручную добавляю псевдоним хоста в 127.0.0.1.
127.0.0.1 localhost localhost.localdomain somename.localhost
)
Это any.sequence.of.names.localhost
разрешение на ::1
(localhost) всегда гарантировано? По какой причине? В каких дистрибутивах Linux?
У меня есть несколько проектов, в которых кажется полезным иметь много псевдонимов локальных хостов без необходимости редактировать /etc/hosts
, но я искал причуды TCP и DNS и ничего не нашел об этом поведении. (Не очень уверен, что я должен искать). Не уверен, что могу зависеть от такого поведения.
Поведение изначально определяется строкой hosts в /etc/nsswitch.conf
/etc/nsswitch.conf указывает только список провайдеров для разрешения DNS. Не объясняет, кто определил, что один из этих провайдеров (какой провайдер?) должен разрешать любую.последовательность.из.имен.окончание.в.локальном хосте в ::1 ?
Это должно ответить на ваш вопрос (который, кстати, здесь оффтоп, так как не связан с программированием): serverfault.com/a/1065514/396475
Спасибо за подсказку, но я еще больше запутался. В Ubuntu 22 мой nsswitch имеет hosts: files mdns4_minimal [NOTFOUND=return] dns (поэтому он всегда должен останавливаться на NOTFOUND. Но он разрешается в ::1). Конечно, это не вопрос «языка программирования», но я настраиваю обратный прокси-сервер http docker, используя traefik, и я действительно не понимаю, откуда такое поведение. (По крайней мере, Windows и Mac не поддерживают его).
Действительно ли у «старого хоста RHEL 6» есть IPv6-адрес?
Нет. Он должен иметь ::1, но ping ::1 дает ping: unknown host ::1 . Возможно, в RHEL 6 отключен IPv6. $ sysctl -a 2>/dev/null | grep disable_ipv6 net.ipv6.conf.all.disable_ipv6 = 0 net.ipv6.conf.default.disable_ipv6 = 0 net.ipv6.conf.eth0.disable_ipv6 = 0 net.ipv6.conf.lo.disable_ipv6 = 0 net.ipv6. conf.virbr0.disable_ipv6 = 1 net.ipv6.conf.virbr0-nic.disable_ipv6 = 0
Что ж, благодаря ссылке, размещенной Патриком Мевзеком в комментариях выше, я смог получить документированное объяснение.
Для Ubuntu 20/22 LTS, похоже, используется systemd-resolved для разрешения DNS. И, как говорится на https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html
Синтетические записи
...
Имена хостов «localhost» и «localhost.localdomain», а также любое имя хоста, оканчивающееся на «.localhost» или «.localhost.localdomain», преобразуются в IP-адреса 127.0.0.1 и ::1.
Таким образом, это, кажется, объясняет, что операционные системы Linux с разрешением DNS на основе systemd будут иметь такое поведение, а другие (например, Windows и MacOS) — нет.
(Итак, это все-таки казалось системным вопросом :-)
(Этот вопрос на самом деле является дубликатом https://serverfault.com/questions/1065513/how-does-linux-resolve-wildcard-locahost-subdomains-e-g-ping-test-localhost/1065514#1065514 - просто используя systemd-resolved вместо nss-myhostname , и если кто-нибудь знает, как связать их в обоих направлениях, может помочь другим искать другими словами).
PS: я нашел RFC2606, но он тоже ничего не объясняет.