저는 아치 호스트 OS와 win10 게스트 OS를 사용하여 libvirt/qemu를 실행하고 있습니다. 한동안 기본 네트워크 구성을 사용하고 있었지만 특정 도메인 이름이 확인되지 않는 문제가 발생하기 시작했습니다. 자체 개인 DNS가 있는 업무용 VPN이 있습니다. 게스트 VM에서 이러한 개인 DN(때로는 다른 DN)을 확인하는 것이 점점 더 어려워지고 있습니다. 때로는 다음 방법으로 문제를 일시적으로 해결할 수 있습니다.
virsh net-destroy default && virsh net-start default && systemctl restart libvirtd
다른 경우에는 게스트(및 호스트 OS)를 재부팅해야 합니다.
읽고 나서문서네트워크 구성을 다음과 같이 변경했습니다( virsh net-edit default
).
<network>
<name>default</name>
<uuid>...</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='...'/>
<dns>
<forwarder addr='8.8.8.8'/>
<forwarder domain='private.dn' addr='192.168.30.1'/>
</dns>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
내가 추가한 것은 그 <dns>
부분뿐이었습니다. 다른 모든 것은 자동으로 생성되었습니다.
대부분 작동하지만 작동하려면 요청을 여러 번 제출해야 하는 경우가 많습니다. 간단한 방법을 시도했는데 ping
결과 could not find host
가 작동하지 않기 때문에 DN 확인이라고 생각합니다 .
C:\Users\user>ping google.com
Pinging google.com [74.125.136.113] with 32 bytes of data:
Reply from 74.125.136.113: bytes=32 time=26ms TTL=106
C:\Users\user>ping yahoo.com
Ping request could not find host yahoo.com. Please check the name and try again.
C:\Users\user>ping yahoo.com
Pinging yahoo.com [74.6.143.26] with 32 bytes of data:
Reply from 74.6.143.26: bytes=32 time=43ms TTL=51
이 예에서는 google.com
첫 번째 시도가 해결되고 yahoo.com
두 번 더 시도됩니다. 때로는 해결하는 데 5~6번의 시도가 필요할 수도 있습니다.
syslog는 평범해 보입니다. could not find host
오류가 발생하면 아무 것도 기록되지 않습니다.
user:~$ journalctl -eu libvirtd
Dec 14 07:50:01 systemd[1]: Started Virtualization daemon.
Dec 14 07:50:02 dnsmasq[641]: started, version 2.86 cachesize 150
Dec 14 07:50:02 dnsmasq[641]: compile time options: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset auth cryptohash DNSSEC loop-detect inotify dumpfile
Dec 14 07:50:02 dnsmasq-dhcp[641]: DHCP, IP range 192.168.122.2 -- 192.168.122.254, lease time 1h
Dec 14 07:50:02 dnsmasq-dhcp[641]: DHCP, sockets bound exclusively to interface virbr0
Dec 14 07:50:02 dnsmasq[641]: using nameserver 8.8.8.8#53
Dec 14 07:50:02 dnsmasq[641]: using nameserver 192.168.30.1#53 for domain private.cp
Dec 14 07:50:02 dnsmasq[641]: read /etc/hosts - 17 addresses
Dec 14 07:50:02 dnsmasq[641]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
Dec 14 07:50:02 dnsmasq-dhcp[641]: read /var/lib/libvirt/dnsmasq/default.hostsfile
Dec 15 08:24:52 dnsmasq-dhcp[641]: DHCPREQUEST(virbr0) 192.168.122.7 52:54:00:e0:55:a8
Dec 15 08:24:52 dnsmasq-dhcp[641]: DHCPACK(virbr0) 192.168.122.7 52:54:00:e0:55:a8 DESKTOP-3GAMEL8
이것이 간헐적으로만 작동하는 이유를 아는 사람이 있습니까? 아니면 적어도 더 관련 있는 디버깅/로깅 정보를 어디에서 찾을 수 있습니까? 티아
답변1
libvirt
이미 DNS 서버를 실행하고 있는데 왜 8.8.8.8을 전달자( dnsmasq
) 로 사용하도록 구성하겠습니까?
대신 로컬 DNS 서버만 사용하도록 libvirt를 구성한 다음, private.dn
자체적으로 해결할 수 없고(예: 도메인) 이전에 전달된 요청을 캐시하지 않는 모든 요청에 대한 전달자로 8.8.8.8을 사용하도록 DNS 서버를 구성합니다. 로그 항목에 따르면 dnsmasq는 이미 이 작업을 수행하도록 설정되어 있으므로 정의에서 이를 제거 dnsmasq[641]: using nameserver 8.8.8.8#53
하기만 하면 됩니다 .<forwarder addr='8.8.8.8'/>
<network>
그런데 libvirt 네트워크 정의에 개인 도메인이 이라고 나와 있고 private.dn
dnsmasq에 이라고 나와 있습니다 private.cp
. 이것이 구성 오류인지, 예상 구성인지, 아니면 이 문제에 대한 개인 도메인을 익명화하는 버그인지 확실하지 않습니다.
일종의 경쟁 조건이 발생할 수 있습니다. libvirt가 <dns>...</dns>
섹션의 여러 전달자 항목을 어떻게 처리하는지, 나열된 순서대로 하나씩 시도할지, 두 서버에 동시에 요청을 보내고 첫 번째 서버에서 반환된 결과를 사용할지 잘 모르겠습니다 .
이것이 문제 해결 여부에 관계없이 dnsmasq가 8.8.8.8로 전달해야 하는 모든 DNS 요청 결과를 캐시하므로 반복되는 요청에 대한 왕복 대기 시간이 훨씬 짧아지기 때문에 전반적으로 DNS 확인 속도가 빨라집니다.
답변2
@cas가 제공한 매우 좋은 답변을 자세히 설명하기 위해 몇 가지 세부 정보를 제공하고 싶습니다. dnsmasq
다음 설정으로 서비스를 설정 했습니다 /etc/dnsmasq.conf
.
no-resolv
server=/private.dn/192.168.30.1
server=1.1.1.1
server=8.8.8.8
server=8.8.4.4
127.0.0.1
이 작업을 수행하는 더 좋은 방법이 있을 수 있지만 NetworkManager에서 DNS를 제공 하고 싶습니다 . dnsmasq
내가 읽고 있는 내용 /etc/resolv.conf
이 순환 참조로 이어질 수 있다고 생각합니다.
이 설정을 완료하고 나면 libvirtd 서비스를 중지했음에도 불구하고 libvirt에 의해 시작된 dnsmasq의 로컬 복사본에서 포트 53이 여전히 사용 중인 것으로 나타났습니다. virsh net-destroy default
그것을 막기 위해서는 하나의 조치를 취해야 합니다 .
그러면 나는 다음을 할 수 있습니다:
systemctl start dnsmasq
systemctl enable dnsmasq
다음으로 NetworkManager로 이동하여 모든 연결을 IPv4로 변경하고 DHCP Addresses Only
DNS 서버를 지정하고 127.0.0.1
Wi-Fi에 다시 연결하고 테스트한 결과 모든 것이 괜찮아 보였습니다.
편집: 이후 다음과 같이 모든 네트워크 연결에 대해 전역적으로 DNS를 설정할 수 있다는 것을 알게 되었습니다 /etc/NetworkManager/conf.d/dns-servers.conf
.
[global-dns-domain-*]
servers=127.0.0.1
(이것에 대한 공로를 인정하고 싶지만 어디서 얻었는지 기억이 나지 않습니다.)
아, 테스트하는 동안 마지막으로 수행한 작업은 log-queries
syslog에 추가 /etc/dnsmasq.conf
하면 syslog에 DNS 확인이 추가된다는 것입니다. 모든 것이 정상인지 확인하도록 도와주세요.