systemd-resolved가 루프백 이외의 인터페이스를 수신하도록 허용하는 방법은 무엇입니까?

systemd-resolved가 루프백 이외의 인터페이스를 수신하도록 허용하는 방법은 무엇입니까?

systemd-resolved는 무엇보다도 IP 주소 127.0.0.53의 로컬 루프백 인터페이스를 수신하여 DNS 서버 역할을 하는 데몬입니다.

데몬이 다른 인터페이스에서 수신 대기하기를 원합니다. 내 사용 사례는 이를 도커 컨테이너에 노출하여 도커 컨테이너가 systemd-resolved에서 제공하는 DNS 캐시를 공유하도록 하는 것입니다. 호스트를 도커 컨테이너의 DNS 서버로 구성하는 방법을 알고 있지만 적어도 기본적으로 systemd-resolved는 이러한 DNS 쿼리가 루프백 인터페이스가 아니라 도커 브리지 인터페이스에서 오기 때문에 거부합니다.

dnsmasq(systemd-resolved와 유사한 도구)를 사용하여 이 작업을 수행했습니다.listen-address=172.17.0.1구성 파일에 추가. 불행히도 시스템에서 구문 분석된 해당 항목을 찾을 수 없습니다.

적어도 Ubuntu 18.04에서는 systemd-resolved가 기본값이므로 이 구성에 적합한 솔루션을 원했습니다.

systemd-resolved가 수신 대기하는 인터페이스를 구성하는 방법이 있습니까?

답변1

당신은 할 수 없습니다. 위에서 언급한 cristian-rodríguez처럼 루프백만 제공하도록 엄격하게 설계되었습니다.

+ iptables NAT를 사용하는 대체 솔루션조차 없습니다 net.ipv4.conf.all.route_localnet=1(예:https://serverfault.com/questions/211536/iptables-port-redirect-not-working-for-localhost),https://superuser.com/questions/594163/how-do-i-route-a-port-range-in-a-linux-host-to-a-guest-vm), 그리고https://stackoverflow.com/questions/18580637/iptables-redirect-from-external-interface-to-loopbacks-port)은 systemd-resolve가 대상이 루프백 네트워크 외부에 있는지 명시적으로 확인하기 때문에 작동합니다. 아래 코드를 참조하세요static void dns_stub_process_query(Manager *m, DnsStream *s, DnsPacket *p)

    if (in_addr_is_localhost(p->family, &p->sender) <= 0 ||
        in_addr_is_localhost(p->family, &p->destination) <= 0) {
            log_error("Got packet on unexpected IP range, refusing.");
            dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL, false);
            goto fail;
    }

socat해결 방법은 청취 도커 인터페이스를 사용하여 이를 systemd-resolved로 전달하는 것입니다. 다음 줄은 이 문제를 해결합니다. 필요한 경우 TCP에서 수신하도록 변경합니다.

socat UDP-LISTEN:53,fork,reuseaddr,bind=172.17.0.1 UDP:127.0.0.53:53

답변2

Resolved는 귀하의 사용 사례에 맞게 설계되지 않았지만 로컬 루프백에서 제공되므로 수신 주소가 하드코딩됩니다.

답변3

systemd-resolved 덕분에 청취 주소에 필요한 구성을 자유롭게 구현할 수 있습니다.버전 247(범죄1f05101f이후) 설정을 통해 DNSStubListenerExtra.

주소, 포트 및 프로토콜(tcp/udp)은 여러 번 구성할 수 있습니다. DNSStubListener(tcp/udp) 127.0.0.53:53에서 기본 리스너를 false로 설정하여 비활성화하는 것도 가능합니다 .

systemd에 의해 구문 분석된 구성 파일은 /etc/systemd/resolved.conf주석에 이를 표시합니다(예: ubuntu impish(21.10)).

# systemd --version
systemd 248 (248.3-1ubuntu8)
...

# man resolved.conf
...
DNSStubListener=
       Takes a boolean argument or one of "udp" and "tcp". If "udp", a DNS stub resolver will listen for UDP requests on address 127.0.0.53 port 53. If "tcp",
       the stub will listen for TCP requests on the same address and port. If "yes" (the default), the stub listens for both UDP and TCP requests. If "no", the
       stub listener is disabled.

       Note that the DNS stub listener is turned off implicitly when its listening address and port are already in use.

DNSStubListenerExtra=
   Takes an IPv4 or IPv6 address to listen on. The address may be optionally prefixed with a protocol name ("udp" or "tcp") separated with ":". If the
   protocol is not specified, the service will listen on both UDP and TCP. It may be also optionally suffixed by a numeric port number with separator ":".
   When an IPv6 address is specified with a port number, then the address must be in the square brackets. If the port is not specified, then the service
   uses port 53. Note that this is independent of the primary DNS stub configured with DNSStubListener=, and only configures additional sockets to listen
   on. This option can be specified multiple times. If an empty string is assigned, then the all previous assignments are cleared. Defaults to unset.

   Examples:

       DNSStubListenerExtra=192.168.10.10
       DNSStubListenerExtra=2001:db8:0:f102::10
       DNSStubListenerExtra=192.168.10.11:9953
       DNSStubListenerExtra=[2001:db8:0:f102::11]:9953
       DNSStubListenerExtra=tcp:192.168.10.12
       DNSStubListenerExtra=udp:2001:db8:0:f102::12
       DNSStubListenerExtra=tcp:192.168.10.13:9953
       DNSStubListenerExtra=udp:[2001:db8:0:f102::13]:9953
...

이것은 쉽게 참조할 수 있는 명확한 답변입니다.@TCB13이미 댓글로 선언했습니다.

관련 정보