"Может ли кто-нибудь дать некоторое представление о том, почему это работает так, и помочь с каким-то решением, если таковое имеется?"
Виртуальная машина Azure по умолчанию создана с неработающим DNS:systemd-resolved
требует дополнительной настройки. sudo systemctl status systemd-resolved
быстро подтвердит это. /etc/resolv.conf
указывает на127.0.0.53
-локальный ненастроенный тупиковый преобразователь.
Локальный тупиковый резолвер systemd-resolved
не настроен. У него не было настроено перенаправление, поэтому после нажатия 127.0.0.53
ему больше не у кого было спросить. Фу. Перейдите в конец, чтобы узнать, как настроить его для Ubuntu 18.04.
Если вам небезразлично, как был сделан такой вывод, пожалуйста, прочтите подробный ответ.
TCP [RFC793] is always used for full zone transfers (using AXFR) and is often used for messages whose sizes exceed the DNS protocol's original 512-byte limit.
Источник:https://www.rfc-editor.org/rfc/rfc7766
Это оказалось сложнее, чем я думал. Поэтому я развернул -виртуальную машину Ubuntu 18.04 в Azure, чтобы я мог протестировать ее с точки зрения операционной системы :
.
Я начал с проверки того, что ничто не блокирует -DNS-запросы:
sudo iptables -nvx -L
sudo apparmor_status
Для всех цепочек вiptablesполитика по умолчанию была установлена на ПРИНЯТЬ , и хотяApparmorбыл установлен на « принудительное выполнение », не было ничего связанного с DNS. Таким образом, на данный момент на хосте не наблюдается проблем с подключением или разрешениями.
Затем мне нужно было установить,какDNS-запросы проходят через механизмы.
cat /etc/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "systemd-resolve --status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.
nameserver 127.0.0.53
options edns0
search ns3yb2bs2fketavxxx3qaprsna.zx.internal.cloudapp.net
Таким образом, согласно resolv.conf
, система ожидает локального тупикового преобразователя с именем systemd-resolved
. Проверяя состояниеsystemd -разрешенов соответствии с подсказкой, приведенной в тексте выше, мы видимошибку:
sudo systemctl status systemd-resolved
● systemd-resolved.service - Network Name Resolution
Loaded: loaded (/lib/systemd/system/systemd-resolved.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-10-08 12:41:38 UTC; 1h 5min ago
Docs: man:systemd-resolved.service(8)
https://www.freedesktop.org/wiki/Software/systemd/resolved
https://www.freedesktop.org/wiki/Software/systemd/writing-network-configuration-managers
https://www.freedesktop.org/wiki/Software/systemd/writing-resolver-clients
Main PID: 871 (systemd-resolve)
Status: "Processing requests..."
Tasks: 1 (limit: 441)
CGroup: /system.slice/systemd-resolved.service
└─871 /lib/systemd/systemd-resolved
Oct 08 12:42:14 test systemd-resolved[871]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP.
/etc/nsswitch.conf
установить порядок источников, используемых для разрешения DNS-запросов. Что это говорит нам?:
hosts: files dns
DNS-запросы никогда не попадут в локальный systemd-resolved
преобразователь-заглушку, поскольку он не указан в /etc/nsswitch.conf
.
Настроены ли серверы пересылки для systemd-resolved
резолвера-заглушки?!?!? Давайте рассмотрим эту конфигурацию в /etc/systemd/resolved.conf
.
[Resolve]
#DNS=
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes
Нет:systemd-resolved
не имеет настроенного сервера пересылки, чтобы запрашивать, не найдено ли сопоставление локального имени ip :.
Конечным результатом всего этого является:
/etc/nsswitch.conf отправляет DNS-запросы в DNS, если в/etc/hosts
Запрашиваемый DNS-сервер — 127.0.0.53
, и мы только что увидели, что он не настроен, просмотрев его файл конфигурации /etc/systemd/resolved.conf
. Если здесь не указан сервер пересылки, мы не сможем ничего успешно решить.
Я попытался переопределить преобразователь-заглушку 127.0.0.53
, напрямую указав 168.63.129.16. Это не удалось:
dig aerserv-bc-us-east.bidswitch.net 168.63.129.16
; <<>> DiG 9.11.3-1ubuntu1.9-Ubuntu <<>> aerserv-bc-us-east.bidswitch.net 168.63.129.16
;; global options: +cmd
;; connection timed out; no servers could be reached
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 24224
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;168.63.129.16. IN A
;; Query time: 13 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Tue Oct 08 13:26:07 UTC 2019
;; MSG SIZE rcvd: 42
Нет :появление ;; SERVER: 127.0.0.53#53(127.0.0.53)
в выходных данных говорит нам о том, что мы не переопределили его и локальный ненастроенный преобразователь-заглушка все еще используется.
Однако использование любой из следующих команд отменяло преобразователь-заглушку 127.0.0.53
по умолчанию и, следовательно, успешно возвращало NOERROR
результаты:
sudo dig aerserv-bc-us-east.bidswitch.net @168.63.129.16
или
dig +trace aerserv-bc-us-east.bidswitch.net @168.63.129.16
Таким образом, любые запросы, основанные на использовании systemd-resolved
преобразователь-заглушки, были обречены, пока он не был настроен.
Мое первоначальное-неправильное-убеждение состояло в том, что TCP/53 блокировался :весь "Truncated 512" был немного красным -сельдь. Резольвер-заглушка не настроен. Я сделал предположение -Я знаю, я знаю, "НИКОГДА НЕ ПРЕДПОЛАГАЮ ;-)-что DNS настроен иначе.
systemd-resolved
:Отредактируйте директиву hosts
в /etc/nsswitch.conf
, как показано ниже, добавив resolve
, чтобы установить systemd-resolved
в качестве первого источника разрешения DNS:
hosts: resolve files dns
Отредактируйте директиву DNS
(как минимум )в /etc/systemd/resolved.conf
, чтобы указать нужный сервер пересылки,что в этом примере будет:
[Resolve]
DNS=168.63.129.16
Перезапуститьsystemd-resolved
:
sudo systemctl restart systemd-resolved
Red Hat почти все делает за вас в отношении настройки systemd-resolved
в качестве резолвера-заглушки,за исключением того, что они не сказали системе использовать его!
Отредактируйте директиву hosts
в /etc/nsswitch.conf
, как показано ниже, добавив resolve
, чтобы установить systemd-resolved
в качестве первого источника разрешения DNS:
hosts: resolve files dns
Затем перезапуститеsystemd-resolved
:
sudo systemctl restart systemd-resolved
Источник:https://www.linkedin.com/pulse/config-rhel8-local-dns-caching-terrence-houlahan/
После настройки systemd-resolved
DNS моей тестовой ВМ вел себя ожидаемым образом. Я думаю, что насчет этого....
Учитывая необходимость перезагрузки системы Linux, я бы -использовал многосторонний подход.
Во-первых, отключите будущие входы в систему, создав файл /etc/nologin
. Вы можете оставить это поле пустым или ввести информативный текст, например:
"Logins to this system have been temporarily disabled in preparation for a server reboot, scheduled for (time and date). Please try again after (expected end time)."
Не забудьте удалить /etc/nologin, когда закончите!
Кроме того, поскольку перезагрузка очищает все процессы, интерактивные они или нет, я бы использовал ps
для поиска процессов, принадлежащих пользователям. Это потребует некоторого ручного исследования, чтобы определить, стоит ли сохранять процессы или нет, но это должно немного сузить область. Я жестко -закодировал здесь 1000 как значение UID _MIN из /etc/login.defs в качестве отсечки для «системных» и «пользовательских» UID. Если у кого-либо из ваших пользователей UID ниже 1000, вам нужно будет изменить это число.
ps -eo pid,uid,args | awk '$2 >= 1000'
Конечно, вы можете настроить столбцы ps
по своему вкусу, возможно, добавить переведенное имя пользователя и время начала процесса(ps -eo pid,uid,user,start,args
)или другие --только будьте осторожны, чтобы сохранить поля ps
UID и awk
синхронно друг с другом.
Чтобы получить список уникальных имен пользователей, используйте:
ps -eo user,uid | awk 'NR>1 && $2 >= 1000 && ++seen[$2]==1{print $1}'
Я знаю, вы сказали, что не хотите просматривать вывод ps
, но что, если бы вы могли это автоматизировать?
$ join <(ps -aux | tail -n+2 | cut -d' ' -f1 | sort -u) \
<(getent passwd | grep -f <(grep '^/' /etc/shells) | cut -d: -f1 | sort)
root
terdon
Это может показаться немного сложным, но вот разбивка:
ps -aux | tail -n+2 | cut -d' ' -f1 | sort -u
:это запускает ps
, показывающий процессы всех пользователей, передает вывод через tail -n+2
, который будет печатать все строки после 1-й, поэтому мы отфильтровываем заголовок ps
, затем используем cut
для вывода пользователя имя и список имен пользователей передаются через sort -u
для получения отсортированного, дедуплицированного списка.
getent passwd | grep -f <(grep '^/' /etc/shells) | cut -d: -f1 | sort
:здесь мы выбираем все строки в /etc/shells
, которые начинаются с косой черты (это должно дать нам список действительных оболочек входа в систему )и использовать его в качестве входных данных для grep
, который ищет выходные данныеgetent passwod
(который должен включать пользователей LDAP )для известных пользователей с этой оболочкой. Результатом вышеизложенного должен быть список пользователей с реальными оболочками (, а не /usr/bin/nologin
или /bin/false
и т. д. ).
Наконец, выходные данные обеих команд передаются в качестве входных данных для join
, в результате чего печатаются только те пользователи, которые присутствуют как в выходных данных ps
, так и в списке пользователей с действительными оболочками входа в систему.
Если это работает для вас,вы можете сделать его псевдонимом, добавив его в файл инициализации вашей оболочки (~/.bashrc
, если вы используетеbash
):
alias getUsers="join <(ps -aux | tail -n+2 | cut -d' ' -f1 | sort -u) <(getent passwd | grep -f <(grep '^/' /etc/shells) | cut -d: -f1 | sort)"
Это не идеально, некоторые системные пользователи все же могут найтись. Например, в моей системе у меня есть git
с:
$ getent passwd | grep git
git:x:996:996:git daemon user:/:/bin/bash
Я действительно не знаю, когда этот пользователь будет показан как вошедший в систему. Предположительно при выполнении некоторых команд git
? В любом случае, хотя это и далеко от совершенства, это может послужить хотя бы временным обходным путем.