로컬 DNS 서버를 사용하여 로컬 도메인을 확인하고 원격 DNS 서버를 사용하여 원격 도메인을 확인하도록 systemd-resolved 및 systemd-networkd를 구성하려면 어떻게 해야 합니까?

로컬 DNS 서버를 사용하여 로컬 도메인을 확인하고 원격 DNS 서버를 사용하여 원격 도메인을 확인하도록 systemd-resolved 및 systemd-networkd를 구성하려면 어떻게 해야 합니까?

LAN에 연결되어 있고 게이트웨이를 통해 인터넷에 접속합니다. 로컬 네트워크에는 로컬 네트워크에 있는 컴퓨터의 호스트 이름을 확인할 수 있는 DNS 서버가 있습니다.

구성하고 싶습니다체계적 분석그리고시스템 네트워크이런 방식으로 로컬 호스트 이름에 대한 조회 요청은 로컬 DNS 서버로만 전달(라우팅)되고, 다른 모든 호스트 이름에 대한 조회 요청은 다른 원격 DNS 서버에만 전달됩니다.

구성 파일이 어디에 있는지 모르고 더 많은 파일을 추가해야 하는지 그리고 답변에 해당 경로를 지정하도록 요청해야 한다고 가정해 보겠습니다.

답변1

로컬 네트워크 인터페이스의 구성 파일(이름 패턴과 일치하는 파일 /etc/systemd/network/*.network)에서 DHCP 서버를 사용하여 로컬 DNS 서버 주소를 얻도록 지정해야 합니다.DHCP=옵션:

[Network]
DHCP=yes

또는 다음을 사용하여 주소를 명시적으로 지정하세요.DNS=옵션:

[Network]
DNS=10.0.0.1

또한 (동일한 섹션에서) 다음을 사용하여 로컬 도메인을 지정해야 합니다.Domains=옵션

Domains=domainA.example domainB.example ~example

domainA.example domainB.example다음 동작을 얻기 위해 로컬 도메인을 지정합니다 .systemd-resolved.service, systemd-resolved매뉴얼 페이지):

각 인터페이스 도메인 중 하나로 끝나는 호스트 이름에 대한 조회는 일치하는 인터페이스로만 라우팅됩니다.

이 문제는 hostX.domainA.example해결될 수 있습니다.오직로컬 DNS 서버를 통해.

~example다음 동작을 얻기 위해 다음으로 끝나는 모든 도메인이 라우팅 전용 도메인으로 처리되도록 지정합니다 example(설명에서).이것범죄):

경로 전용 도메인이 있는 DNS 서버는 지정된 도메인에만 사용할 수 있습니다.

이 문제는 hostY.on.the.internet해결될 수 있습니다.오직당사의 글로벌 원격 DNS 서버에서 제공됩니다.

노트

이상적으로는 DHCP 프로토콜을 사용할 때 위의 네트워크 인터페이스 구성 파일에 명시적으로 지정하지 않고 DHCP 서버에서 로컬 도메인 이름을 가져와야 합니다. 바라보다UseDomains=옵션. 그러나 이 기능에는 아직 해결되지 않은 문제가 있습니다.systemd-networkd DHCP 검색 도메인 옵션질문.

원격 DNS 서버를 글로벌 시스템 전체 DNS 서버로 지정해야 합니다. /etc/systemd/resolved.conf파일에서 이 작업을 수행 할 수 있습니다 .

[Resolve]
DNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

구성을 다시 로드하고 서비스를 다시 시작하는 것을 잊지 마세요.

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-networkd
$ sudo systemctl restart systemd-resolved

경고하다!

위의 보장은 이름 확인 중에만 적용됩니다.체계적 분석- 바라보다매뉴얼 페이지nss-resolve,libnss_resolve.so.2그리고systemd-resolved.service, systemd-resolved에 대한 매뉴얼 페이지.

또한보십시오:

인용하다:

답변2

@piotrDobrogost의 훌륭한 답변을 확장하려면 DNS 확인 소스 /etc/nsswitch.conf로 사용되도록 구성하는 것을 잊지 마십시오. systemd-resolved특정 사용 사례의 경우 지시문은 hosts다음과 같아야 합니다.

/etc/nsswitch.conf

hosts:  files resolve dns

따라서 위 Piotr 세부 정보 Domains의 지시어에 지정된 도메인 으로만 확인을 제한하는 경우 /etc/systemd/resolved.conf도메인이 확인될 때 지정된 이름 확인 소스 순서대로 다음으로 DNS를 쿼리해야 합니다./etc/nsswitch.conf아니요지시문에서 찾을 수 있습니다 Domains.

다음 링크는 지정된 요구 사항을 참조합니다.해결하다이름 확인 중에도 참조됩니다 /etc/nsswitch.conf.systemd-resolved

https://github.com/systemd/systemd/issues/940

SystemD 문서가 끔찍하다는 것을 알았습니다. 위의 Piotr의 답변을 포함하여 여러 링크에서 이해를 모아야했습니다 ;-)

답변3

OpenVPN 연결을 구성했기 때문에 이 작업을 수행하는 경우 다음을 사용해야 합니다.https://github.com/jonathanio/update-systemd-resolved~에 따르면https://wiki.archlinux.org/index.php/OpenVPN#The_update-systemd-resolved_custom_script

특히 OpenVPN 클라이언트 구성에서 스크립트를 설치하고 활성화하면 동일한 클라이언트 구성에도 update-systemd-resolved추가됩니다 .dhcp-option DOMAIN-ROUTE yourdomain.com

OpenVPN에서 다음 출력이 표시됩니다.

<14>Apr 22 16:10:31 update-systemd-resolved: Link 'tun0' coming up
<14>Apr 22 16:10:31 update-systemd-resolved: Adding DNS Routed Domain yourdomain.com
<14>Apr 22 16:10:31 update-systemd-resolved: Adding DNS Domain yourdomain.com
<14>Apr 22 16:10:31 update-systemd-resolved: Adding IPv4 DNS Server 192.168.XYZ.XYZ
<14>Apr 22 16:10:31 update-systemd-resolved: SetLinkDNS(640 1 2 4 192 168 XYZ XYZ)
<14>Apr 22 16:10:31 update-systemd-resolved: SetLinkDomains(640 2 yourdomain.com false yourdomain.com true)

다음 명령을 사용하여 DNS 구성을 확인할 수 있습니다 resolvectl status.

Link 3 (wlp0s....)
      Current Scopes: DNS
DefaultRoute setting: yes
       LLMNR setting: yes
MulticastDNS setting: no
  DNSOverTLS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
  Current DNS Server: 192.168.XYZ.XYZ
         DNS Servers: 192.168.XYZ.XYZ
          DNS Domain: ~.
                      lan
Link 640 (tun0)
      Current Scopes: DNS
DefaultRoute setting: no
       LLMNR setting: yes
MulticastDNS setting: no
  DNSOverTLS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
  Current DNS Server: 192.168.XYZ.XYZ
         DNS Servers: 192.168.XYZ.XYZ
          DNS Domain: ~yourdomain.com

관련 정보