![dnsmasq와 systemd-resolved 간의 충돌을 피하는 방법은 무엇입니까?](https://linux55.com/image/92602/dnsmasq%EC%99%80%20systemd-resolved%20%EA%B0%84%EC%9D%98%20%EC%B6%A9%EB%8F%8C%EC%9D%84%20%ED%94%BC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
최근에 설치했어요DNS내 로컬 네트워크의 DNS 서버 역할을 합니다. dnsmasq는 로컬 DNS 스텁 수신기에서 이미 사용 중인 포트 53에서 수신합니다.체계적 분석.
dnsmasq가 실행된 후 systemd-resolved를 중지하고 다시 시작하면 문제가 해결됩니다. 그러나 재부팅 후 다음이 반환됩니다. systemd-resolved가 먼저 시작되었으며 포트 53이 이미 사용 중이므로 dnsmasq가 시작되지 않습니다.
첫 번째 분명한 질문은 로컬 DNS 스텁 수신기를 시작해서는 안 된다는 것을 이해하기 위해 systemd-resolve를 얻는 가장 좋은 방법이며, 따라서 dnsmasq에서 사용하기 위해 포트 53을 예약하는 것입니다.
그러나 더 흥미로운 질문은 두 서비스가 일반적으로 어떻게 함께 작동하는지입니다. 병렬로 작동하도록 되어 있습니까? 아니면 dnsmasq를 사용하는 경우 systemd를 통해 구문 분석하는 것입니까?
답변1
~처럼시스템 232(2017 릴리스) 다음 줄을 편집 /etc/systemd/resolved.conf
( 아님 )하고 추가할 수 있습니다./etc/resolv.conf
DNSStubListener=no
그러면 포트 53에 대한 바인딩이 닫힙니다. 파일의 [Resolve]
섹션 헤더가 맨 위에 있는지 확인하십시오(설치가 손상되지 않은 경우에는 맨 위에 있어야 함).
이 옵션에 대한 자세한 설명은 다음에서 확인할 수 있습니다.resolved.conf
맨페이지.
시스템에서 실행 중인 시스템 버전을 찾을 수 있습니다.
systemctl --version
답변2
방금 /etc/dnsmasq.conf의 줄 시작 부분에 있는 "#"을 제거하여 "bind-interfaces" 옵션을 활성화했습니다.
dnsmasq를 다시 시작할 수 있었습니다.
- dnsmasq는 127.0.0.1을 포함한 모든 인터페이스에서 DNS 포트 53을 바인딩합니다.
- systemd-resolv는 계속해서 127.0.0을 수신합니다.53:53
이 토론은 이 솔루션을 가리킵니다.해결됨: 스텁 파서를 비활성화하는 옵션 추가
답변3
systemd-resolved
를 사용하여 시작 시 로딩을 비활성화 할 수 있습니다 sudo systemctl disable systemd-resolved
.
두 가지를 동시에 실행하려면 systemd-resolved
localhost를 기본 이름 서버로 사용하도록 리디렉션할 수 있습니다. 이렇게 하면 외부 DNS 서버에 도달하기 전에 모든 쿼리가 확인을 위해 dnsmasq로 전달됩니다. 이는 파일 nameserver 127.0.0.1
상단에 행을 추가하여 수행할 수 있습니다 /etc/resolv.conf
. 그러면 systemd의 로컬 캐시도 비활성화됩니다.
당신은 할 수 있습니다아치 리눅스 위키. 나는 이것을 거기에서 복사했고 꽤 잘 다루고 있습니다.
그러나 이는 시작 오류를 안정적으로 방지하지 못합니다. 즉, systemd-resolved가 먼저 시작되면 dnsmasq는 여전히 실패합니다. 귀하의 버전이 systemd
충분히 새로운 경우 답변을 사용하십시오.말비니우스. 버전이 systemd
너무 오래된 경우 dnsmasq 유닛을 수정하여 이 문제를 해결할 수 있습니다. 섹션 [Unit]
에 Before=systemd-resolved
.
그런 다음 원하는 경우 /etc/dnsmasq-resolv.conf
업스트림 네임서버에 대한 별도의 파일을 생성하고 -r
or --resolv-file
옵션을 사용하여 전달하거나 업스트림 네임서버를 dnsmasq 구성 파일에 추가하고 -R
or --no-resolv
옵션을 사용할 수 있습니다. 이렇게 하면 localhost만 있고 /etc/resolv.conf
모든 것이 dnsmasq를 통과합니다.
답변4
systemd 맨페이지에 따르면 스텁 DNS 서버를 수동으로 비활성화할 수는 없습니다. 흥미롭게도 systemd를 230에서 231로 업그레이드한 후에야 설명된 문제를 발견했습니다.
DHCP를 통해 수신된 업스트림 DNS 서버를 처리하는 데 필요하므로 systemd-resolved를 비활성화하는 것은 옵션이 아닙니다.
내 해결책은 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
이것은 다소 해킹된 솔루션처럼 보이지만 작동합니다.