dnsmasqとsystemd-resolvedの競合を回避する方法は?


57

最近、ローカルネットワークのDNSサーバーとして機能するdnsmasqをインストールしました。dnsmasqは、systemd-resolvedのローカルDNSスタブリスナーによって既に使用されているポート53でリッスンします。

systemd-resolvedを停止し、dnsmasqの実行後に再起動するだけでこの問題は解決します。ただし、再起動後に戻ります。systemd-resolvedは優先して起動され、ポート53はすでに使用されているためdnsmasqは起動しません。

最初の明白な質問は、ローカルDNSスタブリスナーを開始してdnsmasqで使用するためにポート53を保持してはならないことをsystemd-resolvedに理解させるにはどうすればよいでしょうか?

しかし、より興味深い質問は、2つのサービスが一般にどのように連携するかということです。dnsmasqを使用している場合、それらは並行して動作することさえ意図されているのですか、それともちょうどその方法でsystemd解決されますか?


4
経由で無効化しようとしましたsudo systemctl disable systemd-resolvedか?dnsmasqは、適切に構成されていれば、ドメイン解決を処理するはずです。
pbhj

1
また、sudo systemctl stop systemd-resolved実行されている場合は発行する必要があります。sudo systemctl status systemd-resolvedチェックに使用
ブルースバーネット

回答:


42

以下のようにsystemd 232編集することができます(2017年発売)/etc/systemd/resolved.confと、この行を追加します。

DNSStubListener=no

これにより、ポート53へのバインドがオフになります。

オプションの詳細は、resolved.confのマンページに記載されています。

システムを実行しているsystemdバージョンを見つけることができます:

systemctl --version

2
インターネット接続のこのターンを行う
ラビンダー

2
@Ravinder:systemd DNSサーバーを無効にします、はい。このサーバーを使用するようにシステムが構成されている場合、インターネット接続が機能しなくなったように見えます(電源を切ったため)。代わりに別のDNSサーバーを使用するようにシステムを構成する必要があります。通常、ユーザーは代わりに独自のDNSサーバーを実行するため、ポート53のバインドをオフにします。したがって、問題はありません。
悪意のある

18

を使用systemd-resolvedしてブート時のロードを無効にできますsudo systemctl disable systemd-resolved

2つを一緒に実行する場合はsystemd-resolved、プライマリネームサーバーとしてlocalhostを使用するようにリダイレクトできます。これにより、外部DNSサーバーにアクセスする前に、すべてのクエリが解決のためにdnsmasqに送信されるようになります。これを行うにnameserver 127.0.0.1は、/etc/resolv.confファイルの先頭に行を追加します。これにより、systemdのローカルキャッシュも無効になります。

Arch Linux wikiで詳細を読むことができます。私はそこからこれをコピーし、それを非常によくカバーしています。

ただし、これはブート時のエラーを確実に回避しません。つまり、systemd-resolvedが最初に起動した場合、dnsmasqは引き続き失敗します。のバージョンがsystemd十分に新しい場合は、Malvineousの回答を使用してください。のバージョンがsystemd古すぎる場合は、dnsmasqユニットを変更することでこの問題を回避[Unit]できBefore=systemd-resolvedます。セクションでを追加します。

その後、必要に応じ/etc/dnsmasq-resolv.confて、アップストリームネームサーバー用に別のファイルを作成し、-ror --resolv-fileオプションを使用して渡すか、アップストリームネームサーバーをdnsmasq構成ファイルに追加して-Ror --no-resolvオプションを使用できます。この方法では、ローカルホストのみを持ち、/etc/resolv.confすべてがdnsmasqを通過します。


2
これで問題が解決したことを確認できなくなったため、以前のコメントを削除する必要がありました。ここで質問する前にwikiを読みましたが、すでにlocalhostネームサーバーが上部にあるresolv.confファイルがありました。これは役に立ちませんでした。次に、外部のネームサーバーをdnsmasqの2番目のファイルに移動するよう指示に従いました。最初の再起動後、dnsmasqが最初にロードされたため、問題は発生しませんでした。2回目の再起動で、最初にロードが解決されたため、dnsmasqは説明されたエラーで終了しました。私は以前までです。
vic

6
dnsmasqユニットBefore=systemd-resolvedで、[Unit]セクションにa を入れます。これにより、dnsmasqは常に最初に起動します。
ムニール

7

systemdのマンページから判断すると、スタブDNSサーバーを手動で無効にすることはできません。興味深いことに、systemdを230から231にアップグレードした後、説明した問題にのみ気付きました。

systemd-resolvedを無効にすることは、DHCPを介して受信したアップストリームDNSサーバーを処理するために必要なので、オプションではありませんでした。

私の解決策は、dnsmasqを開始する前にsystemd-resolvedを停止させ、その後再び開始することでした。

でドロップイン構成を作成しました/etc/systemd/system/dnsmasq.service.d/resolved-fix.conf

[Unit]
After=systemd-resolved.service

[Service]
ExecStartPre=/usr/bin/systemctl stop systemd-resolved.service
ExecStartPost=/usr/bin/systemctl start systemd-resolved.service

これはかなりハック的なソリューションのように見えますが、機能します。


2
ちょっと実際にこの解決策はかなり滑らかです。元のユニットファイルを保持するため、パッケージの更新後も永続的です。よくできました。DNSStubListenerresolve.confマニュアルには、以下が記載されています。「リスニングアドレスとポートが既に使用されている場合、DNSスタブリスナーは暗黙的にオフになります。」それが、この方法がうまくいく理由です。
ジョナサンコマー

A ++ソリューション!!!
sjas

/ usr / bin / systemctlを/ bin / systemctlに変更する必要がありました
Bruce Barnett

5

/etc/dnsmasq.confの行の先頭にある「#」を削除して、オプション「bind-interfaces」を有効にしました。

私は再びdnsmasqを開始することができました:

  • dnsmasqは、すべてのインターフェース(127.0.0.1を含む)ポート53のDNSポートをバインドします。
  • systemd-resolvは127.0.0でリッスンし続けます。53:53

私はこの議論が解決したことでこの解決策を指摘されました:スタブリゾルバを無効にするオプションを追加します


これは、ごみ箱火災とは何かに対する最善の答えです。systemdがループバック時であっても、そのポートを占有する理由はありません。
ジョナサンS.フィッシャー


2

デフォルトのUbuntu 18.04セットアップを使用している場合、これsystemd-resolved(デフォルトDNSサーバー)との競合が原因である可能性がありdnsmasqます。dnsmasq明示的にそれを望んでいたので、自分で故意にインストールした場合、無効systemd-resolvedにする方法を説明するこの質問に対する他の回答の1つがおそらく役立つでしょう。あなた明示的にインストールしなかったならdnsmasq、あなたが使用してlxdいるのでそれはたぶん適切な場所です。これは、実際にlxdコンテナを管理するために使用しているためかもしれませんが、ほとんどの場合、スナップはlxdアプリのインストール時にユーザーを保護するために使用するためです。私の観点から、私はdnsmasqlxdそれが欲しいので)維持したいが、私も維持したいsystemd-resolved DNSサーバーとして(Ubuntuチームが選択したものであり、自分よりも信頼しているため)。

それで、これはlxd心の問題であるようです。その場合、lxd-usersメーリングリストの投稿によると、修正方法は次のとおりです。

$ lxc network edit lxdbr0

これにより、ターミナルエディターで構成が編集されます。次のようになります。

config:
  ipv4.address: 10.216.134.1/24
  ipv4.nat: "true"
  ipv6.address: none
  ipv6.nat: "true"
name: lxdbr0
type: bridge

次の3行を追加します。

config:
  ipv4.address: 10.216.134.1/24
  ipv4.nat: "true"
  ipv6.address: none
  ipv6.nat: "true"
  raw.dnsmasq: |
    auth-zone=lxd
    dns-loop-detect
name: lxdbr0
type: bridge

これdnsmasqによりlxd、によって実行されているがDNSループを検出するようになります。これは、少なくとも私にとっては、問題を解決し、停止しsystemd-resolveddnsmasq100%CPUを使用しました。


2

これが(X)Ubuntu 18.04 Bionicのソリューションです。

dnsmasqをインストールする

sudo apt install dnsmasq

ポート53のsystemd-resolvedリスナーを無効にします(アップグレード時に上書きされる可能性があるため、/ etc / systemd / resolved.confには触れないでください)。

$ cat /etc/systemd/resolved.conf.d/noresolved.conf 
[Resolve]
DNSStubListener=no

そしてそれを再起動します

$ sudo systemctl restart systemd-resolved

(またはによって完全に無効にする$ sudo systemctl disable systemd-resolved.service

/etc/resolv.confを削除して、再度作成します。resolv.confはデフォルトで/run/systemd/resolve/stub-resolv.confへのシンボリックリンクであるため、これは重要です。シンボリックリンクを削除しない場合、ファイルはリブート時にsystemdによって上書きされます(systemd-resolvedを無効にした場合でも!)。また、NetworkManager(NM)は、systemdで解決された構成を検出するためのシンボリックリンクであるかどうかを確認します。

$ sudo rm /etc/resolv.conf
$ sudo touch /etc/resolv.conf

NMによる/etc/resolv.confの上書きを無効にします(オプションrc-managerもありますが、NMマニュアルに記載されているにもかかわらず機能しません)。

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

それを再起動します:

$ sudo systemctl restart NetworkManager

NMのresolv.confを使用するようにdnsmasqに指示します。

$ cat /etc/dnsmasq.d/nmresolv.conf 
resolv-file=/var/run/NetworkManager/resolv.conf

それを再起動します:

$ sudo systemctl restart dnsmasq

解決にはdnsmasqを使用します。

$ cat /etc/resolv.conf 
# Use local dnsmasq for resolving
nameserver 127.0.0.1

1
他のいくつかの解決策を試した後、あなたのものがLinux Mint 19.1で私の問題を解決しました。どうもありがとう!
レナンラザロット

1

私はこのように解決しました:

/ etc / default / dnsmasqで次の行を追加またはコメント解除します。

IGNORE_RESOLVCONF=yes

独自の解決ファイル(/etc/resolv.personal)を作成して、ネームサーバーを定義します。ここで任意のネームサーバーを使用できます。https://www.opennic.orgから2つ取りました

nameserver 5.132.191.104
nameserver 103.236.162.119

/etc/dnsmasq.conf追加またはコメントを解除し、次の行:

resolv-file=/etc/resolv.personal

次に、dnsmasqを再起動し、デフォルトのリゾルバsystemd-resolvedを無効にします。

sudo service dnsmasq restart

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

1

両方のサービスが同じアドレスを使用しようとしている理由がわかりません。Xubuntu 18.04.1での私の場合のように、それらを配置することができます。その構成は次のとおりです。

xy@zq:~$ sudo netstat -tulpn | grep 53
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      13549/systemd-resol 
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      9632/dnsmasq 

私のdnsmasqを使用してsystemdを解決するには、次のように設定します。

#/etc/systemd/resolved.conf 
[Resolve]
DNS=127.0.0.1

dnsmasq configで、外部ネームサーバーを設定します。

#/etc/dnsmasq.conf
nameserver x.x.x.x
nameserver y.y.y.y

すべてを再起動した後:

# sudo systemctl restart systemd-resolved.service
# sudo systemctl restart dnsmasq.service

systemd-resolvedは、デフォルトDNSサーバーをdnsmasqに設定します。

#/etc/resolv.conf
nameserver 127.0.0.1

その最後の行は私を驚かせたので、調べました。あなたの場合、/etc/resolv.confへのシンボリックリンクのように聞こえます/run/systemd/resolve/resolv.conf。どうやら、これはsystemd-resolvedが動作する可能性のある4つの(!)可能なモードの 1つです。ディストリビューションの設定方法に依存すると思います。つまり、Xubuntu 18.04.1には当てはまりますが、システム。
sourcejedi

0

オンラインで見つかったソリューションの使用をdnsmasqに開始させることができませんでした。つまり、systemd-resolvedを無効にし、dnsmasq.confを「bind interfaces」ではなく「bind dynamic」に変更しました。network.serviceではなくnetwork-online.serviceの後にdnsmasq startを実行することで、ブート時に起動することができました。

[Unit]
Description=dnsmasq - A lightweight DHCP and caching DNS server
Requires=network.target
Wants=nss-lookup.target
Before=nss-lookup.target
After=network-online.target #This line changed

使用しているアプローチを投稿していただきありがとうございます。通常、network-online.targetに対して注文する場合、network-online.targetのリストにも追加することに注意してくださいWants=freedesktop.org/wiki/Software/systemd/NetworkTarget
sourcejedi

0

ここに、Ubuntu 18.10 Cosmic Cuttlefishで(何時間も苦労して)働いたものがあります。これは、dnsmasq比較的堅牢なキャッシュメカニズムを活用し、NGINXリゾルバーの脆弱性を回避するために行いました。Ubuntu Serverエディション(NetworkManager/ nmcli、justのみsystemd-networkd)を使用しており、これがAWS EC2で実行されていることに注意してください。したがって、デフォルトのEC2検索ドメインでDNSとDHCPを機能させ続ける必要があります。それがsystemd-resolved将来の更新にどのように影響するかわからないので、完全に無効にしたくありませんでした。ここでのすべては、特に明記されていない限り、root / sudoとして実行されます(EC2ユーザーデータとして渡される場合、これはデフォルトで行われます)。

## Configure dnsmasq to work with systemd-resolved
# Set static hostname with hostnamectl
hostnamectl set-hostname mydomainname
# Add an entry for the hostname to /etc/hosts
tee --append /etc/hosts <<EOF
127.0.0.1 mydomainname
EOF
# Disable stub listener for resolvconf and set DNS to loopback
tee --append /etc/systemd/resolved.conf <<EOF
DNSStubListener=no
DNS=127.0.0.1
EOF
# Tell dnsmasq to ignore resolvconf
tee --append /etc/default/dnsmasq <<EOF
IGNORE_RESOLVCONF=yes
EOF
# Create dropin directory
mkdir -p /etc/systemd/system/dnsmasq.service.d
# Create systemd dropin to make sure systemd-resolved stops before dnsmasq starts
tee /etc/systemd/system/dnsmasq.service.d/resolved-fix.conf <<EOF
[Unit]
After=systemd-resolved.service
[Service]
ExecStartPre=bin/systemctl stop systemd-resolved.service
ExecStartPost=bin/systemctl start systemd-resolved.service
EOF
# Create custom resolvconf with name servers (I usec cloudflare)
tee /etc/resolv.mydomainname <<EOF
nameserver 1.1.1.1
nameserver 1.0.0.1 
nameserver [2606:4700:4700::1111] 
nameserver [2606:4700:4700::1001] 
EOF
# Configure dnsmasq
tee /etc/dnsmasq.d/mydomainname.conf <<EOF
# Region comes from:
# EC2_AVAIL_ZONE=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
# EC2_REGION=${EC2_AVAIL_ZONE%?}
domain=$EC2_REGION.compute.internal
resolv-file=/etc/resolv.mydomainname
listen-address=127.0.0.1
port=53
interface=lo
bind-dynamic
domain-needed
bogus-priv
dnssec
dns-forward-max=300
cache-size=1000
neg-ttl=3600
EOF
# Reload to pick up dropin
systemctl daemon-reload
# Stop systemd-resolved
systemctl stop systemd-resolved
# Start dnsmasq
systemctl restart dnsmasq

127.0.0.1#53解決に使用されており、DNSSECが次のようなもので動作していることを確認しますdig +trace facebook.com


設定したら、なぜこのユニットファイルドロップインハックが必要なのか知っていますDNSStubListener=noか?
sourcejedi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.