web-dev-qa-db-ja.com

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

systemd-resolvedは、特にローカルループバックインターフェースでIPアドレス127.0.0.53をリッスンすることによりDNSサーバーとして機能するデーモンです。

デーモンに別のインターフェースをリッスンさせたい。私のユースケースは、それをdockerコンテナーに公開して、dockerコンテナーがsystemd-resolvedによって提供されるDNSキャッシングを共有するようにすることです。ホストをdockerコンテナーのDNSサーバーとして構成する方法を知っていますが、少なくともデフォルトでは、systemd-resolvedはこれらのDNSクエリを拒否します。これらのDNSクエリはループバックインターフェイスではなく、dockerブリッジインターフェイスからのものだからです。

Dnsmasq(systemd-resolvedに似たツール)で、これを adding listen-address=172.17.0.1 to the configuration file 。残念ながら、私はsystemdで解決された同等のものを見つけることができませんでした。

Systemd-resolvedは少なくともUbuntu 18.04のデフォルトなので、この構成で機能する解決策が欲しいです。

Systemd-resolvedがリッスンするインターフェイスを構成する方法はありますか?

9
Matthieu Moy

Resolvedは、ユースケース向けではなく、ローカルループバックでサービスを提供するためのものではないため、リスンアドレスはハードコーディングされています。

9

できません。上記のcristian-rodríguezと同様に、ループバックのみにサービスを提供するように設計されています。

_net.ipv4.conf.all.route_localnet=1_ + iptables NAT( 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を使用してdockerインターフェイスをリッスンし、それをsystemd-resolvedに転送することです。以下の行がトリックを行います。必要に応じて、TCPをリッスンするように変更します。

_socat UDP-LISTEN:53,fork,reuseaddr,bind=172.17.0.1 UDP:127.0.0.53:53
_
5
Pcgomes