dnsmasq와 systemd-resolved 간의 충돌을 피하는 방법은 무엇입니까?


56

최근에 로컬 네트워크의 DNS 서버 역할을하도록 dnsmasq 를 설치 했습니다 . dnsmasq는 systemd-resolved 에서 로컬 DNS 스텁 리스너가 이미 사용중인 포트 53에서 청취합니다 .

dnsmasq가 실행 된 후 systemd-resolved를 중지했다가 다시 시작하면이 문제가 해결됩니다. 그러나 재부팅 후 반환됩니다. systemd-resolved가 기본 설정으로 시작되고 포트 53이 이미 사용 중이므로 dnsmasq가 시작되지 않습니다.

첫 번째 명백한 질문은 systemd-resolved가 로컬 DNS 스텁 리스너를 시작하지 않아야하므로 dnsmasq에서 사용하도록 포트 53을 유지해야한다는 것을 가장 잘 이해하는 것입니다.

그러나보다 흥미로운 질문은 두 서비스가 일반적으로 함께 작동하는 방법입니다. 그것들은 나란히 작동하거나 dnsmasq를 사용하는 방식으로 체계적으로 해결됩니까?


4
를 통해 사용 중지 sudo systemctl disable systemd-resolved하시겠습니까? 제대로 구성된 경우 dnsmasq는 내가 생각하는 도메인 해상도를 처리해야합니다.
pbhj

1
sudo systemctl stop systemd-resolved실행중인 경우 에도 발행 해야합니다. sudo systemctl status systemd-resolved확인에 사용
Bruce Barnett

답변:


41

현재로 systemd 232 (2017 년 발표) 편집 할 수있는 /etc/systemd/resolved.conf이 줄을 추가합니다 :

DNSStubListener=no

포트 53에 대한 바인딩이 해제됩니다.

이 옵션은 resolved.conf 맨 페이지 에 자세히 설명되어 있습니다 .

시스템이 실행중인 시스템 버전을 찾을 수 있습니다.

systemctl --version

2
인터넷 연결 전환
Ravinder

2
@Ravinder : 시스템 DNS 서버를 비활성화합니다. 예. 시스템이이 서버를 사용하도록 구성된 경우 인터넷 연결이 해제되어 인터넷 연결이 작동하지 않는 것처럼 보입니다. 다른 DNS 서버를 대신 사용하도록 시스템을 구성해야합니다. 일반적으로 사람들은 자신의 DNS 서버를 대신 실행하려고하므로 포트 53에서 바인딩을 해제하므로 문제가되지 않습니다.
Malvineous

18

systemd-resolved사용하여 부팅시로드를 비활성화 할 수 있습니다 sudo systemctl disable systemd-resolved.

둘을 함께 실행 systemd-resolved하려면 로컬 호스트를 기본 이름 서버로 사용하도록를 리디렉션 할 수 있습니다 . 이렇게하면 외부 DNS 서버에 도달하기 전에 모든 쿼리가 해결을 위해 dnsmasq로 향하게됩니다. 파일 nameserver 127.0.0.1맨 위에 줄 을 추가하면 /etc/resolv.conf됩니다. 또한 systemd의 로컬 캐싱을 비활성화합니다.

아치 리눅스 위키 에서 더 많은 것을 읽을 수 있습니다 . 나는 거기에서 이것을 복사했고 그것은 꽤 잘 다루고 있습니다.

그러나 이것은 부팅시 오류를 확실하게 피할 수 없습니다. 즉, systemd-resolved가 먼저 시작되면 dnsmasq는 여전히 실패합니다. 귀하의 버전이 systemd충분히 새롭다면 Malvineous 의 답변을 사용하십시오 . 버전 systemd이 너무 오래된 경우 dnsmasq 단위를 수정하여이 문제를 해결할 수 [Unit]있습니다 Before=systemd-resolved. 섹션 에서을 추가하십시오 .

그런 다음 원하는 경우 /etc/dnsmasq-resolv.conf업스트림 이름 서버에 대해 별도의 파일을 작성 하고 -r또는 --resolv-file옵션을 사용하여 파일을 전달 하거나 dnsmasq 구성 파일에 업스트림 이름 서버를 추가하고 -R또는 --no-resolv옵션을 사용할 수 있습니다. 이렇게하면 로컬 호스트 만 /etc/resolv.conf있고 dnsmasq를 통해 모든 것이 진행됩니다.


2
더 이상 문제가 해결되었음을 확인할 수 없으므로 이전 의견을 삭제해야했습니다. 여기에 묻기 전에 위키를 읽었으며 맨 위에 localhost 네임 서버가있는 resolv.conf 파일이 이미 있습니다. 이것은 도움이되지 않았습니다. 그런 다음 지침에 따라 외부 네임 서버를 dnsmasq의 두 번째 파일로 옮깁니다. 첫 번째 재부팅 후 dnsmasq가 먼저로드되어 문제가 발생하지 않았습니다. 두 번째 재부트시 먼저로드 된 문제가 해결되었으므로 dnsmasq가 설명 된 오류로 종료되었습니다. 나는 예전과도 거리가 멀다.
vic

6
dnsmasq 단위 Before=systemd-resolved에서 [Unit]섹션 에 a 를 넣으십시오 . 그렇게하면 dnsmasq가 항상 먼저 시작됩니다.
Munir

7

systemd 맨 페이지에서 판단하면 스텁 DNS 서버를 수동으로 비활성화 할 수 없습니다. 흥미롭게도 시스템을 230에서 231로 업그레이드 한 후에 설명 된 문제 만 나타났습니다.

DHCP를 통해 수신 된 업스트림 DNS 서버를 처리해야하므로 systemd-resolved를 비활성화하지 않아도됩니다.

내 솔루션은 dnsmasq 중지를 시작하고 나중에 다시 시작하기 전에 시스템 해결을 수행하는 것이 었습니다.

드롭 인 구성을 만들었습니다 /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
실제로이 솔루션은 매우 매끄 럽습니다. 패키지를 업데이트 한 후에도 원본 단위 파일을 유지하므로 영구적입니다. 잘 했어요 DNSStubListenerresolved.conf 매뉴얼에 다음 내용이 설명되어 있습니다. "듣기 주소와 포트가 이미 사용중인 경우 DNS 스텁 리스너는 암시 적으로 해제됩니다." 그래서이 방법이 잘 작동하는 이유입니다.
Jonathan Komar

++ 솔루션 !!!
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가 해당 포트를 점유해야하는 이유는 없습니다.
Jonathan S. Fisher


2

기본 Ubuntu 18.04 설정을 사용하는 경우 (기본 DNS 서버) 와의 충돌로 인해 발생할 있습니다 . 명시 적으로 원했기 때문에 의도적으로 자신 을 설치했다면 이 질문에 대한 다른 답변 중 하나를 비활성화하는 방법을 설명하는 것이 좋습니다. 당신이 경우 하지 않았다 명시 적으로 설치 , 그것은 당신이 사용하고 있기 때문에 장소에 가능성이 높습니다 . 실제로 컨테이너를 관리하는 데 사용 하기 때문일 수 있지만 앱을 설치할 때 스냅이 사용자 를 보호하기 위해 사용 하기 때문일 가능성이 큽니다 . 내 관점에서, 나는 (원하기 때문에 ) 유지하고 싶지만systemd-resolveddnsmasqdnsmasqsystemd-resolveddnsmasqlxdlxdlxddnsmasqlxdsystemd-resolved DNS 서버로 (우분투 팀이 선택한 것이므로 본인보다 더 신뢰할 수 있습니다).

따라서 이것은 lxd마음에 문제 가있는 것 같습니다 . 그렇다면 lxd-users 메일 링리스트 post에 따라 수정 한 방식 은 다음과 같습니다.

$ 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

그것에 세 줄을 추가하십시오 :

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가)에 의해 실행되는 lxdDNS 루프를 감지해야합니다. 이것은 나를 위해 적어도, 문제를 해결하고 중지 systemd-resolveddnsmasq100 %의 CPU를 사용.


2

다음은 (X) Ubuntu 18.04 Bionic 용 솔루션입니다.

dnsmasq 설치

sudo apt install dnsmasq

포트 53에서 systemd-resolved listener를 비활성화합니다 (업그레이드시 덮어 쓸 수 있으므로 /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)는 시스템 해결 구성을 감지하기위한 기호 링크인지 확인합니다.

$ 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

Nns에서 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에서 내 문제를 해결 한 솔루션이었습니다. 고마워요!
Renan Lazarotto

1

나는 이것을 이렇게 해결했다.

/ etc / default / dnsmasq 에서 다음 줄을 추가하거나 주석 해제하십시오 .

IGNORE_RESOLVCONF=yes

고유 한 resolv 파일 (/etc/resolv.personal)을 작성하여 이름 서버를 정의하십시오. 여기에서 모든 네임 서버를 사용할 수 있습니다. 나는 https://www.opennic.org 에서 두 개를 가져 갔다.

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-resolved를 만들려면 방금 설정했습니다.

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

내 dnsmasq 구성에서 외부 네임 서버를 설정했습니다.

#/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 가지 (!) 가능한 다른 모드 중 하나입니다 . 분포가 어떻게 설정되어 있는지에 따라 다릅니다. 시스템.
sourcejedi

0

온라인에서 찾은 솔루션을 사용하여 dnsmasq를 시작할 수 없었습니다. 즉, systemd-resolved를 비활성화하고 dnsmasq.conf를 "bind interfaces"대신 "bind dynamic"으로 변경합니다. dnsmasq가 network.service가 아닌 network-online.service 이후에 시작되도록하여 부팅시 시작할 수있었습니다.

[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

우분투 18.10 우주 오징어에서 나를 위해 (몇 시간의 고통 후) 나를 위해 일한 것이 있습니다. 나는 이점이 걸릴 이런 짓을 dnsmasq의 상대적으로 더 강력한 캐싱 메커니즘을하고 방지하기 위해 Nginx의 확인자 취약점을 . Ubuntu Server 에디션 ( NetworkManager/ / nmclijust 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


설정 한 후에도 여전히이 유닛 파일 dropin hack이 필요한 이유를 알고 DNSStubListener=no있습니까?
sourcejedi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.