- Ошибка sudo unable to resolve host
- Что значит sudo unable to resolve host
- Как исправить ошибку
- 1. Решение проблемы в /etc/hosts
- 2. Решение с помощью systemd
- Выводы
- Исправление ошибки sudo: unable to resolve host
- Исправление sudo: unable to resolve host
- ssh: Could not resolve hostname ip:port: Name or service not known
- ssh: could not resolve hostname localhost
- Resolve IP адресов в Linux: понятное и детальное описание
Ошибка sudo unable to resolve host
Некоторые пользователи сталкиваются с ошибкой «sudo unable to resolve host». Обычно, эта ошибка появляется после смены имени компьютера. Это простая проблема, которую можно быстро решить.
В этой статье мы рассмотрим, почему возникает эта ошибка, что она означает, а также как её решить на примере Ubuntu.
Что значит sudo unable to resolve host
Сообщение «unable to resolve host имя_хоста» означает, что утилита не может определить IP-адрес хоста «имя_хоста«. Казалось бы, sudo — это локальная команда для повышения привилегий в системе, и ей незачем определять IP хостов. Но это не совсем так: sudo может использоваться и удалёнными пользователями, например, подключёнными по SSH, а в самом конфигурационном файле /etc/sudoers уровни доступа различных пользователей настраиваются такой строчкой:
пользователь хост = ( другой_пользователь : группа ) команды
Подробнее про строку настройки читайте в статье настройка sudo в linux. А сейчас нам интересно, что для каждого запроса утилите нужно определить, какой хост используется на данном компьютере.
Если кратко, то основная идея разработчиков состоит в том, что один универсальный файл /etc/sudoers будет использоваться на множестве компьютеров и на каждом из них нужно определить, какие правила предназначены для него. Таким образом, переменная host в sudoers влияет только на локальные правила.
А теперь вернёмся к нашей ошибке. Как я уже сказал, она означает, что утилита не может определить IP-адрес «имени хоста». Для домена сайта это означало бы, что такой записи нет в DNS. Но поскольку это имя нашего локального компьютера, то вполне естественно, что его нет в глобальной сети.
Как исправить ошибку
1. Решение проблемы в /etc/hosts
Чтобы исправить ошибку, мы можем добавить такую DNS-запись локально в файл /etc/hosts. Поскольку sudo у вас не работает, а этот файл можно редактировать только от суперпользователя, то эта простая задача становится сложнее. Сначала смотрим наше текущее имя хоста:
Дальше, если у вас установлен пароль root, вы можете авторизоваться от его имени с помощью su:
А затем добавить такую строчку в /etc/hosts:
Слова «имя_хоста» надо заменить на то имя хоста, которое вы получили с помощью команды hostname. После этого надо перезапустить компьютер или просто перезапустить сеть:
sudo systemctl restart networking
Ещё желательно убедиться, что в системной службе разрешения доменных имён включено использование файла /hosts. Откройте /etc/nsswitch.conf и найдите в строке hosts слово «files». Оно должно быть на первом месте. Если нет, перенесите его на первое место.
Если же у вас пароль для root не установлен, вам нужно загрузиться с LiveCD, примонтировать корневую файловую систему в /mnt/ и исправлять ошибку уже там.
2. Решение с помощью systemd
Есть ещё один путь. В попытках воспроизвести эту проблему в своей Ubuntu 18.04 я обнаружил, что разрешением доменных имён для локальных приложений занимается служба systemd-resolved. Если она запущена, то даже если в файле /etc/hosts нет имени вашего компьютера, всё будет работать. Поэтому, если вы случайно отключили эту службу, верните её на место и всё заработает:
sudo systemctl start systemd-resolved
sudo systemctl enable systemd-resolved
Выводы
В этой статье мы разобрали, как справиться с ошибкой «sudo cannot to resolve host». Как видите, всё достаточно логично и просто. Если у вас остались вопросы, спрашивайте в комментариях!
Источник
Исправление ошибки sudo: unable to resolve host
Главное меню » Операционная система Linux » Исправление ошибки sudo: unable to resolve host
Мы забыли дать ему разумное имя, поэтому через несколько дней мне пришлось изменить имя хоста и дать ему лучшее имя. Теперь он называется test-server, потому что для этого он и используется.
Мы создали пользователя sudo, потому что мы не рекомендуем все время быть пользователем root, особенно когда работаете со своей системой.
Когда мы начали использовать команды с sudo, то увидели странную ошибку в выводе команд:
Команда без проблем запускалась с sudo, но это сообщение об ошибке все равно отображалось.
Исправление sudo: unable to resolve host
Основная причина ошибки была связана с изменением имени хоста. Позвольте нам показать вам, как исправить эту проблему, чтобы устранить ошибку имени хоста.
Сначала проверьте имя хоста вашей системы с помощью команды hostname. В нашем случае имя хоста – тест-сервер.
Имя хоста берется из файла /etc/hostname.
То же имя хоста должно быть указано в файле /etc/hosts. Но в нашем случае (и мы думаем, что и в вашем случае) это имя хоста отсутствовало в файле /etc/hosts, как вы можете видеть в выходных данных ниже:
127.0.0.1 localhost
The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Поскольку он здесь отсутствует, система не может определить имя хоста и, таким образом, выдает ошибку ‘sudo: unable to resolve host’.
Чтобы исправить это, отредактируйте этот файл и добавьте новую строку и установите адрес обратной связи с именем хоста. Вы можете использовать редактор Vim для редактирования файлов в командной строке.
Итак, теперь наш файл /etc/hosts выглядит так:
127.0.0.1 localhost
127.0.0.1 test-server
The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Сразу после добавления вышеупомянутой строки ошибка ‘sudo: unable to resolve host’ исчезла.
Мы надеемся, что этот быстрый маленький совет помог вам исправить эту раздражающую ошибку. Дайте нам знать, работает это у вас или нет в разделе комментариев.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник
ssh: Could not resolve hostname ip:port: Name or service not known
Сабж
Выдает это самое при попытке соединиться по ssh.
От чего это может быть? Сервер по ip пингуется. Могут быть какие-то настройки в sshd_config? Захожу только по VNC по ssh не пускает. Хотя PermitRootLogin поставил yes, AllowUsers закомментировал. Соединяюсь по нужному порту — который в sshd_config. Что еще?
П.С. Что ухудшаю безопасность в курсе — надо чтоб заходило сначала по ssh хотя бы. Программист который все это делал исчез и неделю не появляется. Какие там были у него пароли/настройки — не в курсе. Восстанавливаем доступ. Пароль root сменили через админку впски.
1. Покажи как коннектишься
2. ssh -vvv server
ну а nslookup hostname что говорит?
Вопрос снимается, тупил нещадно)
ssh: could not resolve hostname localhost
Аналогичная проблема. На работе стоит сервак на debian. На нем работает DHCP. По сети к нему доступ есть — на нем файлопомойка организована. SSH на оном, раньше стоял, но его «почему-то» снесли. Я переустановил apt-get install openssh-server. Сервер установился.
Поднастроил /etc/ssh/sshd_config: поменял порт, в частности.
В итоге даже при попітке подключиться локально к самому себе:
ssh user@localhost:4422
выводит вышеприведенное сообщение!
#nslookup localhost
Server: 10.0.0.253
Address: 10.0.0.253#53
Name: localhost
Address: 127.0.0.1
ssh -p 4422 user@localhost
Смена порта ни от чего не спасает. Самый тупой сканер перебирает порты по диапозону. Используй простейшее правило iptables для блокировки перебора пароля, см. гугл ssh bruteforce iptables.
Это все понятно, но проблема не с портом, а с: ssh: could not resolve hostname localhost Я просто кратко перечислил, что делал для настройки. В т.ч. сменил порт. Понятно, что не работает он не от «смены порта». А от чего — не могу понять. По IP-127.0.0.1 то же самое, гад, выдает. Просто бред какой-то.
ssh user@localhost:4422 — это неправильная команда
Да, действительно, неправильно вводил команду. Порт надо указывать через параметр -p NNNN. Локально зашел. Теперь буду пробовать через putty с виндовой машиной подключиться.
Проблема осталась. Локально через ssh зайти могу.
Удаленно, с винды через putty — «Access denied».
Порт на роутере открыли?Перенаправление настроили?
Источник
Resolve IP адресов в Linux: понятное и детальное описание
Настройка сетевого взаимодействия сервисов не самая простая задача и часто осуществляется без глубокого понимания как требуется настраивать систему и какие настройки на что влияют. После миграции сервисов в docker контейнерах с centos 6 на centos 7 я столкнулся со странным поведением вебсервера: он пытался присоединиться к сервису по IPv6, а сервис же слушал только IPv4 адрес. Стандартный совет в такой ситуации — отключить поддержку IPv6. Но это не поможет в ряде случаев. Каких? В этой статье я задался целью собрать и детально объяснить как приложения resolve ‘ят адреса.
Публикация будет полезна начинающим администраторам и разработчикам.
Прочитав эту статью, вы узнаете:
- какой алгоритм в Linux для резолва хостнеймов;
- как переопределить логику определения хостнеймов;
- какие функции и библиотеки использует ОС;
- какие ловушки существуют при конфигурировании и как их не допускать;
У операционной системы Linux есть несколько источников для определения адреса по hostname. Весь необходимый функционал для определения находится в GNU C Library (glibc). glibc является по-сути фреймворком и реализовывает множество полезных функций для разработчика, предоставляя свой API для упрощения разработки. Среди прочего, glibc имплементирует POSIX. Такие функции как open , read , write , malloc , printf , getaddrinfo , dlopen , pthread_create , crypt , login , exit для Linux систем предоставляет именно glibc.
Известные многим утилиты host , dig и nslookup используют glibc, но поставляются отдельно.
А еще я веду телеграм канал Об IT без галстуков и блог. На канале рассказываю о проблемах менеджмента и как их решать, пишу о принципах мышления при решении бизнес задач, о том как стать эффективным и высокоплачиваемым специалистом.
Теперь, когда у разработчика есть возможность вызвать функцию семейства getaddrinfo из glibc для определения адреса, то возникает потребность конфигурировать возвращаемые значения. Например, использовать ли сперва /etc/hosts или запрос к DNS-серверу. В glibc подобное конфигурирование производится с помощью схемы под названием Name Service Switch (NSS).
Если объяснять на пальцах, то NSS позволяет задавать базы данных и очередность поиска в этих базах для предоставления сервиса. В нашем случае, сервис — это поиск по hostname, а базой данных может выступать /etc/hosts или DNS сервер. Это не единственный сервис настраиваемый посредством NSS, предоставляются сервисы mail алиасов, сервис поиска пользователей и групп. Ознакомится со списком можно в руководстве.
Благодаря NSS можно без пересборки приложений, в рантайме, конфигурировать упомянутые базы данных. Производится конфигурирование в файле /etc/nsswitch.conf . Ниже пример конфига из стандартного /etc/nsswitch.conf в Centos 7.
files, dns и myhostname являются алиасами баз данных для поиска. files на большинстве систем подразумевает использование /etc/hosts , dns база — это DNS-сервер к которому будет осуществляться запрос поиска hostname, а myhostname — это самая необычная база, о существовании которой мало кто знает и она не является частью стандартной поставки в glibc. В некоторых дистрибутивах присутствует еще и база mdns4_minimal. Ниже по тексту предоставлен разбор этих баз данных.
Базы используются в том порядке в котором они обьявлены в /etc/nsswitch.conf и если в текущей базе запись найдена, то происходит выход из цепочки и возврат результата. При отсутствии результата происходит переход к следующей базе в списке. Если ни в одной базе не найден результат, то такой ответ и дается на запрос glibc функции getaddrinfo . Поведение перехода к следующей базе и условия такого перехода можно дополнительно конфигурировать, например, при недоступности DNS (не путать с отсутствием записи) завершить цепочку. Понятное и простое объяснение принципа настройки условий для /etc/nsswitch.conf даны в этой статье.
База files, а в частности /etc/hosts , из коробки в Centos 7 выглядит следующим образом:
Можно отметить, что для localhost имеются две записи: IPv4 и IPv6 адрес. Это может сыграть злую шутку и в конце материала я расскажу почему.
База dns при определении адреса использует name server указанный в конфиге /etc/resolv.conf . Вот пример моего /etc/resolv.conf на хост системе:
Name server’а используются тоже по цепочке и в порядке их объявления. В моем случае, первым выступает локальный DNS сервер (я использую dnsmasq) для задания локальных адресов .priv зон. Если находится совпадение, то возвращается адрес из локальной сети. Все остальные запросы отправляются на основной DNS сервер с адресом 192.168.100.1 .
База myhostname присутствует в поставке Centos и Ubuntu, но не является частью glibc . Не зная этого факта я потратил много времени пытаясь выяснить почему мне возвращаются IPv6 адреса для определения хоста. Он работает следующим образом:
- При запросе локального хостнейма (того что возвращает команда hostname ) плагин возвращает все IP адреса публичных интерфейсов (т.е. все кроме loopback), при отсутствии таких интерфейсов возвращается IPv4 адрес 127.0.0.2 и IPv6 адрес ::1 ;
- При запросе хостнейма localhost или localhost.localdomain возвращает IPv4 адрес 127.0.0.1 и IPv6 адрес ::1 ;
- При запросе хостнейма оканчивающегося на .localhost или .localhost.localdomain возвращает IPv4 адрес 127.0.0.1 и IPv6 адрес ::1 ;
В мануале еще пишут про особую логику с обработкой хостнейма _gateway, но видимо это какой-то патч, так как с Centos 7 у меня он не завелся.
База mdns4_minimal или же mdns_minimal требуется для корректной работы Avahi. При необходимости можно обратиться к документации Arch по Avahi, где коротко и понятно дана информация
по использованию.
Теперь, когда дана информация по базам и принципам их работы стоит отметить отличия в определении адресов в разных инструментах, что приводит к проблемам в рантайме.
Обычно администраторы проверяют хостнейм используя команду host. Это некорректно, так host, как и dig, используют только DNS резолвинг, но не используют NSS. Nginx, например, использует функцию getaddrinfo, а она использует NSS. Это приводит к тому, что вбитый в /etc/hosts хостнейм может работать с nginx, но не резолвится иными способами. Куда хуже, когда в /etc/hosts вбиты IPv6 адрес для хостнейма, а в настройках DNS возвращается только IPv4 адрес. В этом случае, администратор может проверить что команда host возвращает только IPv4 адрес и успокоится, а потом приложение использующее getaddrinfo из glibc запустится и найдет для того же хостнейма IPv4 и IPv6 адрес. Источник ошибок…
Для проверки результатов возвращаемой каждой из баз документация рекомендует воспользоваться утилитой getent.
Ниже немного примеров работы с getent с включенным IPv6.
В /etc/nsswitch.conf содержится следующая цепочка баз:
В /etc/hosts содержится следующее инфо
Команда getent ahosts покажет список всех адресов которые удалось найти. С такими настройками она выведет следующее:
Команда позволяет точечно опросить конкретную базу и выяснить что срезолвит база. Рассмотрим для каждой базы возвращаемые значения:
Если убрать из /etc/hosts строки для localhost, то вывод видоизменится:
Теперь база dns и myhostname возвращает ответы, а база files не содержит данных. Для DNS запросов используется неймсервер конфигурируемый в /etc/resolv.conf в моем контейнере, например
На хост машине установлен dnsmasq который проксирует и кэширует ответы DNS серверов. Ответ от DNS будет зависеть от настроек DNS сервера к которому поступил запрос. RFC 1912 рекомендует в пункте 4.1 сконфигурировать DNS сервера таким образом, чтобы localhost указывал на 127.0.0.1.
Certain zones should always be present in nameserver configurations:
These are set up to either provide nameservice for «special»
addresses, or to help eliminate accidental queries for broadcast or
local address to be sent off to the root nameservers. All of these
files will contain NS and SOA records just like the other zone files
you maintain, the exception being that you can probably make the SOA
timers very long, since this data will never change.
The «localhost» address is a «special» address which always refers to
the local host. It should contain the following line:
В моем случае, dnsmasq из коробки содержит записи для localhost, как и рекомендует RFC.
Отключается это либо удалением записей из /etc/hosts на самом DNS сервере, либо же включением опции no-hosts в /etc/dnsmasq.conf .
После включения опции getent для базы myhostname вернет непустой результат, но как и отмечалось выше, с включенным myhostname будет возвращаться IPv4 и IPv6 адрес. На системах со статическими IP адресами можно смело выключить myhostname плагин и конфигурировать локальные хосты с использованием /etc/hosts . Альтернативный вариант — это отключение IPv6.
Статус IPv6 на сервере можно получить из параметров ядра. Значение 0 возвращается при включенном IPv6, а 1 при выключенном.
В выводе ifconfig интерфейсы слушающие IPv6 содержат строчку inet6. Ниже пример вывода с выключенным и включенным IPv6 соответственно:
Выключить IPv6 можно вызовом
Что изменится после выключения? Я откатил все конфиги на стандартные: в /etc/hosts присутствует localhost с адресами IPv4 и IPv6, в dnsmasq выключена опция no-hosts . Отключил IPv6 командами выше и вывод getent стал следующим:
Воу, в первом выводе у нас дублируется адрес 127.0.0.1. Чтобы разобраться почему так происходит стоит обратиться к исходному коду glibc и к коду утилиты getent. Ниже кусок кода утилиты getent.
Флаг AI_V4MAPPED функции getaddrinfo производит маппинг IPv6 адресов на IPv4 если не были найдены IPv6 адреса в результате опроса базы. Флаг AI_ADDRCONFIG вынудит getaddrinfo проверить наличие IPv6/IPv4 адресов сконфигурированных в системе и в случае отсутствия хотя бы одного IPv6/IPv4 адреса не будет возвращаться IPv6/IPv4 независимо от того что ответит конкретная база.
Поскольку у getent включены оба флага, а в /etc/hosts присуствуетя для localhost адреса 127.0.0.1 и ::1 , то getaddrinfo получит из NSS базы hosts (в примере выше мы обсуждали именно эту базу), адреса 127.0.0.1 и ::1 , затем не обнаружив ни одного IPv6 адреса в системе (выключены параметрами ядра) и произведет маппинг ::1 -> 127.0.0.1 .
Чтобы лучше понять эту концепцию, приведу примеры с выводом getaddrinfo на той же системе, с разными настройками ai_flags и ai_family. В /etc/hosts включены для localhost IPv4 и IPv6 адреса.
Исходный код можно найти на моем github.
Из вывода видно, что с _aifamily равным _AIUNSPEC (возвращать и IPv4, и IPv6) и без AI_ADDRCONFIG флага getaddrinfo возвращает два адреса, IPv4 и IPv6, что многие администраторы не ожидают увидеть. Это происходит независимо от того выключен ли IPv6 в параметрах ядра. Если в /etc/hosts убрать адрес ::1 , то из вывода getaddrinfo (с флагом AF_UNSPEC ) вовсе исчезнут IPv6 адреса.
С включенным IPv6 и наличием ::1 в /etc/hosts будет возвращаться IPv4 и IPv6. Для предотвращения возврата адреса IPv6 требуется закомментировать IPv6 адрес в /etc/hosts . Если адреса будут найдены в /etc/hosts , то в dns и myhostname базу glibc не полезет.
Осталось проверить как ведет себя getaddrinfo для dns базы. Для этого оставлю в /etc/nsswitch.conf для hosts только dns базу и порезолвлю google.com. Вывод ниже с включенным IPv6.
А вот вывод с выключенным IPv6:
Как видно, ситуация с AI_ADDRCONFIG очень похожа.
Напоследок приведу пример как не учитывая все вышесказанное вляпаться в проблемы. IPv6 включен, /etc/nsswitch.conf стандартный.
Что вернет host localhost или dig ANY localhost ? Что вернет getaddrinfo , например, с флагами как у nginx?
nginx будет пытаться подключаться к двум адресам: 127.0.0.1 и ::1 , а приложение может и не ожидать такого. Источник для ошибок.
Какой можно сделать вывод из всего написанного?
- Если вы разрабатываете приложение работающее с сетью, то учитывайте, что IPv6 может быть отключен;
- При настройке сервера учитывайте наличие NSS и очередности проверок, используйте getent или мой код для проверки;
- Если неизвестно как работает приложение, то при наличии исходных кодов можно посмотреть с какими флагами резолвятся
адреса и сверить с настройками системы; - Если исходных кодов нет, то можно по поведению в выводе strace сделать предположение об используемых флагах.
Источник