systemd-resolvedがループバック以外のインターフェイスを受信できるようにする方法は?

systemd-resolvedがループバック以外のインターフェイスを受信できるようにする方法は?

systemd-resolvedは、とりわけIPアドレス127.0.0.53のローカルループバックインターフェイスを受信して​​DNSサーバーとして機能するデーモンです。

デーモンが別のインターフェイスでリッスンしたいと思います。私の使用例は、Dockerコンテナに公開して、Dockerコンテナに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
...

これは簡単に参照できる明確な答えです。おじさんすでにコメントとして宣言しました。

関連情報