VirtualBox NAT 게스트 DNS가 호스트의 VPN 연결 후 깨진다
게스트에는 자체 리졸버가 있고 NAT 어댑터에는 두 가지 DNS 모드가 있다. 조회 하나를 추적한 뒤 호스트 리졸버 모드가 VPN 정책에 맞는지 판단한다.
Windows 호스트에서는 VPN이 연결되면 내부 애플리케이션 이름이 확인되지만 Ubuntu 게스트 내부에서는 확인되지 않는다. 게스트는 자체 리졸버 설정을 유지한다, 그리고 그 앞의 NAT 어댑터는 DNS 쿼리에 두 가지 방식으로 응답할 수 있다. 게스트를 공용 리졸버로 향하게 하면 웹사이트는 다시 로드되지만 사설 이름은 깨진 채로 남는다. 그래서 무엇이든 편집하기 전에 리졸버 경로를 추적한다.
NAT 어댑터를 통해 조회 하나를 추적한다
대조군으로 내부 정규화된 이름 하나와 공용 이름 하나를 고른다. 터널이 올라간 상태에서 호스트에서 내부 이름이 확인되고 그 뒤의 애플리케이션이 열리는지 확인한다. 그다음 같은 두 조회를 게스트 안에서 실행하고 도구가 아니라 응답을 비교한다.
더 나아가기 전에 어댑터가 정말 일반 NAT인지 확인한다. 브리지 어댑터, 이름 있는 NAT 네트워크, 게스트 내부의 두 번째 VPN 클라이언트는 각각 고유한 구성과 고유한 설명을 가진다. 이 시점에서 추측하면 나머지 조사를 낭비한다.
VBoxManage showvminfo work-ubuntu --machinereadable | grep -i natnet resolvectl status | head -40 cat /etc/resolv.conf
첫 번째 명령은 어댑터 모드와 연결된 NAT 네트워크를 보여 준다. Ubuntu 게스트 안에서 두 번째는 링크별 DNS 설정을 나열하고, 세 번째는 흔히 로컬 스텁 주소만 드러내므로 실제 upstream은 다른 곳에 있다.
확인과 도달 가능성을 분리한다. 올바른 주소를 받았지만 연결을 열 수 없는 게스트에는 라우팅, 필터링 또는 서비스 권한 문제가 있고, 추가 DNS 변경은 그것을 건드리지 못한다. 주소를 따로 테스트하고 둘 중 어느 것이 실패했는지 적는다.
프록시 모드와 호스트 리졸버 모드는 다른 메커니즘이다
프록시 모드에서 NAT 엔진은 게스트 쿼리를 이미 알고 있는 DNS 서버로 전달한다. 호스트 리졸버 모드에서는 쿼리를 가로채고 호스트 운영 체제에 지금 호스트가 쓰는 방식으로 이름을 확인하라고 요청한다. 터널이 올라올 때 호스트 확인을 다시 쓰는 VPN 클라이언트를 따르는 것은 두 번째뿐이다. 그래서 두 설정은 같은 머신에서 다른 응답을 만든다.
그 차이가 한 문장으로 된 전체 문제다. 게스트에 서버 주소 목록을 주는 것은 Windows에 구성된 리졸버로 이름을 확인하라고 요청하는 것과 같지 않으며, 분할 DNS VPN에서는 두 응답이 다르다. 어댑터 옵션은 메커니즘에 관한 것이지 권한에 관한 것이 아니다.
어느 모드도 무엇에도 접근 권한을 주지 않는다. 권한 부여는 VPN 정책과 서비스에 있고, 조회가 된다는 것은 이름이 주소로 바뀌었다는 것뿐이다.
어댑터를 바꾼 뒤 게스트가 무엇을 받는지 확인한다
먼저 VM의 네트워크와 DNS 설정을 기록하고, 그다음 머신을 종료해 편집하는 것이 영구 구성이 되게 한다. 첫 어댑터가 NAT를 담당하는 work-ubuntu라는 VM에서는 VM이 꺼진 상태에서 호스트로부터 어댑터별 옵션을 설정한다. 그 후 다시 시작하고 종료 상태를 믿는 대신 결과를 검사한다.
VBoxManage modifyvm work-ubuntu --natdnshostresolver1 on VBoxManage showvminfo work-ubuntu --machinereadable | grep -i natdns
끝자리는 어댑터 번호를 고르므로 보편적인 값이 아니며, 어댑터 2 설정이라면 그 위치에 2가 들어간다. 설치된 VirtualBox 버전에 속한 VBoxManage 바이너리를 사용해야 하는데, 경로에 있는 더 오래된 것은 실행 중인 버전이 무시하는 설정을 기록할 수 있다.
대신 프록시 옵션을 켜면 다른 메커니즘이 선택되고 호스트 리졸버 동작은 얻지 못한다. 게스트가 시작된 후에는 실제로 가진 DNS 구성을 확인해야 한다, 왜냐하면 게스트 내부에 고정된 리졸버나 암호화 DNS 설정은 어댑터가 무엇을 제공하든 애플리케이션을 다른 경로에 두기 때문이다.
VPN 수명 주기 전체에서 테스트하고 한 번만 하지 않는다
게스트에서 두 조회를 모두 반복하고, 그다음 실제 애플리케이션을 열어 TLS 호스트 이름을 검증하게 한다. IP만 사용하는 연결 테스트는 DNS를 잘 분리하지만 인증서 확인이 아니며 그렇게 보고해서는 안 된다. 이름, 주소, 애플리케이션 결과를 함께 기록한다.
승인된 창에서 호스트 VPN을 끊었다 다시 연결하고 테스트를 반복한다. 결과는 접근 정책과 일치해야 하며, 공용 확인이 다시 작동한다고 해서 사설 쿼리가 의도한 경로에 남았다는 것은 아니다.
호스트 리졸버 모드가 아무것도 바꾸지 않으면 기록된 값을 되돌리고 관찰을 유지한다. 하이퍼바이저 트래픽을 제외하는 VPN 클라이언트, 도달할 수 없는 내부 리졸버, 고정된 게스트 설정은 각각 다른 수정이 필요하며, 어댑터를 브리지하면 DNS를 재설정하는 대신 네트워크 설계를 바꾼다.