DNS 문제를 해결하기 위해 systemd-resolved를 사용하는 방법은 무엇입니까?

DNS 문제를 해결하기 위해 systemd-resolved를 사용하는 방법은 무엇입니까?

systemd-resolved문제 해결을 위해 사용 중인 DNS 서버를 어떻게 찾을 수 있습니까 ?

dig일반적 으로 에 표시된 DNS 서버를 사용하고 테스트할 수 있습니다 /etc/resolv.conf. (또는 Windows - ipconfig /all+ nslookup). 그러나 resolv.conf가 루프백 주소의 로컬 확인자 데몬만 가리키는 경우에는 이 방법이 작동하지 않습니다. 사용하는 DNS 서버를 표시하기 위해 systemd-resolved에서 어떤 방법이 사용됩니까?


( unbound제가 볼 수 있는 구성 파일이 있습니다. dnsmasq있기는 하지만 구성 파일 없이 동적으로 서버를 추가할 수 있는지는 잘 모르겠습니다. NetworkManager에도 이제 그 파일이 있고 인터페이스에 대한 DNS 구성을 표시하기 위해 nmcli쿼리할 수 있습니다 . nmcli d show wlan0.)

답변1

또한 문제 해결에도 매우 유용합니다.

journalctl -u systemd-resolved -f

systemd-resolved거기에서 실제로 무슨 일이 일어나고 있는지 볼 수 있습니다 . 제 경우에는 systemd-resolve --status보고된 DNS 서버에 전혀 접속하지 않았습니다. 그런 이상한 일을 하고 있다면 때로는 sudo systemctl restart systemd-resolved재부팅하는 것이 좋습니다.

편집하다:

더 많은 정보를 얻으려면 resolved필요한

[Service]
Environment=SYSTEMD_LOG_LEVEL=debug

통해override.conf 입력systemd-resolved

sudo systemctl edit systemd-resolved

재시작이 적용됩니다:

sudo systemctl restart systemd-resolved

편집 2:

@bmaupin과 @Aminovic이 댓글에서 지적했듯이 나중에 이를 되돌리는 것을 잊지 마세요.

sudo systemctl revert systemd-resolved
sudo systemctl restart systemd-resolved

답변2

사용됨 resolvectl status( systemd-resolve --status이보다 먼저 사용된 경우239) 당신의 모습을 보여주기 위해전역 및 링크별 DNS 설정.

답변3

resolv.conf서류

설명서에는 다음과 같이 나와 있습니다.

확인자는 인터넷의 DNS(Domain Name System)에 대한 액세스를 제공하는 C 라이브러리의 루틴 세트입니다. 파서 구성 파일에는 프로세스에서 파서 루틴을 처음 호출할 때 읽는 정보가 포함되어 있습니다.

파일이 없으면 로컬 시스템의 이름 서버만 쿼리되고 검색 목록에는 호스트 이름에서 결정된 로컬 도메인 이름이 포함됩니다.

systemd-resolved

Ubuntu 20.04에는 systemd-resolved로컬 DNS 서버가 포함되어 있습니다.systemd/etc/resolv.conf이는 편집을 위해 자동으로 올바른 구성을 사용해야 하는 스텁 리졸버 역할을 합니다 .

이전 버전에서는 다음을 사용하여 수동으로 심볼릭 링크해야 할 수도 있습니다.

$ sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

기본적으로 systemd-resolved로컬 DNS 서버 수신 127.0.0.53포트가 구성되어 있으며 53이를 실행 lsof -i @127.0.0.53:53하여 확인할 수 있습니다. dnsmasq동일한 주소와 포트에서 수신 대기하는 다른 서비스가 없는지 확인하세요 .

이는 127.0.0.53루프백 인터페이스이지만 루프백 인터페이스의 다른 IP 주소에서 포트 53을 수신하는 다른 DNS 서버를 가질 수 있습니다(예 127.0.0.1: 127.0.0.2.

그래도 문제가 해결되지 않으면 다음을 시도해 보세요.

$ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

이 파일에는 DHCP 임대의 DNS 서버가 포함되어 있지만 스텁 확인자 캐싱 기능의 이점은 없습니다.

dnsmasq그리고NetworkManager

이것dnsmasq경량 캐싱 DNS 서버는 DNS 쿼리를 수락하고 소규모 로컬 캐시에서 응답하거나 실제 재귀 DNS 서버로 전달합니다.

웹 개발 기계에는 로컬 웹사이트를 테스트할 수 있는 작은 DNS 서비스가 있는 것이 좋습니다.

먼저 NetworkManager현재 인터페이스의 관리를 확인합니다( wlp0s20f3제 경우에는).

$ nmcli dev
$ nmcli dev set wlp0s20f3 managed yes

이제 NetworkManager내장 dnsmasq파서를 활성화할 수 있습니다:

$ cat /etc/NetworkManager/NetworkManager.conf
[main]
dns=dnsmasq

NetworkManagerdnsmasq이제 다음에서 구성 과 함께 유연성의 이점을 누릴 수 있습니다 /etc/NetworkManager/dnsmasq.d.

$ cat /etc/NetworkManager/dnsmasq.d/custom.conf
# Resolve all domains ending in .dev to 127.0.0.1
address=/.dev/127.0.0.1

dnsmasq시스템 전체 서비스(있는 경우)를 비활성화하고 변경 사항을 적용하는 것을 잊지 마십시오 .

$ sudo systemctl stop dnsmasq.service && sudo systemctl disable dnsmasq.service
$ sudo systemctl restart NetworkManager.service

어떤 이유로든 단독으로 실행하려면 dnsmasq먼저 NetworkManager덮어쓰기를 방지해야 합니다 /etc/resolv.conf.

$ cat /etc/NetworkManager/NetworkManager.conf
[main]
dns=none

dnsmasq이제 업스트림 서버에게 다른 곳에서 가져오도록 지시해야 합니다 /etc/resolv.conf.

$ cat /etc/dnsmasq.conf
listen-address=127.0.0.53
resolv-file=/run/NetworkManager/resolv.conf

이 파일은 DHCP 임대에서 생성되며 NetworkManagerDNS 서버도 포함합니다. 이제 dnsmasq솔루션을 구성합니다.

$ cat /etc/resolv.conf
# Use local dnsmasq resolver
nameserver 127.0.0.53

자신만의 로컬 DNS 설정을 구성하세요.

$ cat /etc/dnsmasq.d/custom.conf
# Resolve all domains ending in .dev to 127.0.0.1
address=/.dev/127.0.0.1

새 구성을 적용합니다.

$ sudo systemctl stop systemd-resolved.service && sudo systemctl disable systemd-resolved.service
$ sudo systemctl restart dnsmasq.service

dnsmasq그리고systemd-networkd

아쉽게도 DHCP 서버에서 관리하기 때문에 DHCP 서버에서 얻은 DNS 네임서버 파일을 노출하지 않아 NetworkManager사용 이 쉽지 않습니다 .systemd-networkdsystemd-resolved

완전히 사용되지 않는 패키지를 사용하는 경우에도 마찬가지입니다 ifupdown.

열려 있는 :mandhclient-script

$ man 8 dhclient-script

이것연결하다부분적으로는 다음과 같이 말합니다.

클라이언트 스크립트가 시작되면 먼저 make_resolv_conf나중에 /etc/resolv.conf파일을 생성하는 데 사용되는 셸 함수를 정의합니다. 기본 동작을 재정의하려면 Enter 후크 스크립트에서 이 함수를 재정의하세요.

dnsmasq따라서 여전히 함께 사용하려면 DHCP 설정에서 업스트림 서버를 가져올 수 있도록 for를 생성하도록 systemd-networkd재정의해야 합니다 .make_resolv_confresolv-filednsmasq

이것resolvconf패키지는 동작을 /etc/resolv.conf구성하는 데 사용할 수 있는 Population과 관련된 다양한 데몬 주위에 래퍼 인터페이스를 제공합니다 .make_resolv_conf


라우터 광고 메시지의 RDNSS에서 IPv6 업스트림 서버를 가져와야 하는 경우에도 동일한 문제가 발생합니다(참조:이웃 검색 프로토콜), 이것도 관리되기 때문입니다 systemd-resolved.

다음 명령을 시도해 보십시오.ndisc6팩:

$ rdisc6 wlp0s20f3

IPv6 주소 접두사 및 DNS 서버를 포함하여 라우터의 다양한 정보가 표시됩니다. 아무것도 표시되지 않으면 라우터가 이를 지원하지 않는 것일 수 있습니다.

rdisc6프로그램은 다음을 사용하여 사용자 공간에서 ICMPv6 라우터 검색을 구현합니다.NETLINK_ROUTERDNSS 소켓 지원은 Linux 커널 2.6.24에 추가되었습니다. 이전 버전을 지원하려면 다음을 사용하여 OSI 계층 2 장치 드라이버와 상호 작용할 수 밖에 없습니다.SOCK_RAW소켓.

답변4

여기에 대한 답변 중 어느 것도 제가 일하는 데 더 가까워지지 않았습니다 systemd-resolved. 모든 문제를 해결하는 한 가지 방법 systemd-resolved은 방정식에서 문제를 제거하는 것입니다.

먼저 이를 비활성화합니다(루트로):

service systemd-resolved stop
systemctl disable systemd-resolved

그러나 이것만으로는 충분하지 않습니다. Systemd는 이를 다시 활성화하고 몇 분 후에 다시 시작합니다. 따라서 systemd-resolved서버에서 완전히 제거하여 이를 방지해야 합니다.

rm -f /lib/systemd/systemd-resolved

나는 이 작업을 수행하는 systemd의 다른 부분에서 문제가 발생한 적이 없지만 YMMV입니다. 삭제하는 대신 이름을 바꿀 수 있습니다.

마지막으로 /etc/resolv.conf일부 네임서버를 편집하고 추가합니다.

nameserver 8.8.8.8
nameserver 8.8.4.4

관련 정보