터널이 올라오고 인증서가 검증된 뒤, 대화상자가 DNS 서버나 도메인을 설정할 수 없다고 알립니다. Linux에서 이 대화상자는 대개 게이트웨이 문제가 아닙니다. 클라이언트가 이름 구성을 D-Bus로 systemd-resolved에 넘기는데, 그 인계가 거부되면 인터페이스는 올라온 채로 남고 이름 확인은 여전히 예전 링크를 가리킵니다. 같은 노트북이 프로필에 접미사가 붙기 전에는 이름을 잘 확인하며, 이것이 따라가 볼 만한 단서입니다. 대화상자가 나타난 순간 터널 쪽에서는 아무것도 바뀌지 않았습니다.

접미사가 없으면 클라이언트는 네임 서버만 밀어 넣습니다. 검색 도메인을 추가하면 두 번째 호출이 여기에 붙습니다. SetLinkDomains에는 자체 권한 부여 확인이 있으며, 그래서 같은 프로필이 Windows에서는 되고 여기서는 실패합니다. 게이트웨이는 어느 경우든 같은 설정을 보내고, 그것을 거부하는 구성 요소는 로컬입니다.

systemd-resolved가 확인자임을 확인하십시오

이 클라이언트는 systemd-resolved와만 대화하고 다른 무엇과도 대화하지 않습니다. Arch와 여러 배포판은 이를 비활성 상태로 제공하며, /etc/resolv.conf은 전혀 다른 확인자에 속할 수 있으므로 권한을 보기 전에 소유자를 확정하십시오.

세 명령이면 분명해집니다.

systemctl status systemd-resolved
ls -l /etc/resolv.conf
resolvectl status

찾아야 할 것은 활성 서비스, /run/systemd/resolve/stub-resolv.conf을 가리키는 심볼릭 링크, 그리고 resolvectl의 링크별 DNS입니다. 대신 NetworkManager가 소유하고 있다면 클라이언트와 싸우지 말고 resolved로 옮기십시오. 아래 drop-in이 두 키를 모두 설정합니다.

[main]
dns=systemd-resolved
systemd-resolved=true

그 파일이 생기면 NetworkManager를 한 번 재시작하십시오. 비활성 확인자와 그 D-Bus 이름을 계속 부르는 클라이언트가 함께 있으면 둘 중 어느 것도 이름을 대지 않는 오류가 납니다.

실패하는 D-Bus 호출을 관찰하십시오

이 단계는 대화상자를 구체적인 답으로 바꿉니다. 한 터미널에서 확인자 인터페이스를, 다른 터미널에서 저널을 본 뒤 다시 연결하십시오.

sudo dbus-monitor --system "interface='org.freedesktop.resolve1.Manager'"
journalctl -fu systemd-resolved

세 호출이 나타나야 합니다. SetLinkDNS, SetLinkDomains 그리고 SetLinkDefaultRoute. 오류 응답으로 돌아오는 것이 바로 고칠 대상입니다. 그 응답은 보통 이유를 밝힙니다. 예를 들어 org.freedesktop.DBus.Error.AccessDenied 대 SetLinkDomains입니다. 어느 호출이었는지 적어 두십시오. 다음 절이 바로 그 호출을 통과시키는 이야기입니다.

클라이언트에 필요한 polkit 동작을 부여하십시오

규칙을 쓰기 전에 정책을 읽으십시오. 서비스로 실행되는 클라이언트는 대화형 프롬프트에 답할 수 없으므로 암묵적 auth_admin_keep은 막다른 길입니다.

pkaction --verbose --action-id org.freedesktop.resolve1.set-domains
pkaction --action-id org.freedesktop.resolve1.set-dns-servers --verbose

답이 auth_admin_keep라면 클라이언트에는 명시적 규칙이 필요합니다. 아래 스니펫은 VPN 클라이언트가 연결 중 사용하는 네 가지 resolve1 동작을 허용하고 나머지는 모두 polkit.Result.NOT_HANDLED 수준으로 둡니다.

polkit.addRule(function(action, subject) {
  var allowed = [
    "org.freedesktop.resolve1.set-dns-servers",
    "org.freedesktop.resolve1.set-domains",
    "org.freedesktop.resolve1.set-default-route",
    "org.freedesktop.resolve1.revert"
  ];
  if (allowed.indexOf(action.id) !== -1 &&
      subject.isInGroup("wheel")) {
    return polkit.Result.YES;
  }
  return polkit.Result.NOT_HANDLED;
});

이것을 /etc/polkit-1/rules.d/에 나중에 알아볼 파일로 두십시오. 예를 들어 50-azurevpn.rules입니다. 로그아웃했다가 다시 로그인하기 전에 스니펫의 그룹 이름을 자신의 것으로 바꾸십시오. 좁게 유지하십시오. 모든 계정에 모든 resolve1 동작을 허용하는 것은 이 클라이언트가 필요한 범위보다 넓고 나중에 감사하기가 훨씬 어렵습니다.

polkit을 편집하기 전에 프로필 XML을 확인하십시오

손으로 편집한 프로필은 아무 말 없이 무시될 수 있습니다. Microsoft는 평평한 배치를 문서화합니다. 그 배치에서는 dnsserver 항목이 dnsservers 바로 안에 있고 접미사는 dnssuffixes 안에 있습니다. 각 주소를 감싸는 추가 래퍼 요소가 있으면 그 형태가 아니며, 클라이언트는 게이트웨이가 보내는 쪽으로 조용히 되돌아갑니다.

polkit을 건드리기 전에 제거 테스트를 하십시오. 접미사 블록을 빼고 다시 연결해 대화상자가 바뀌는지 보십시오. 바뀐다면 실패한 호출은 도메인 인계였고, 해결책은 권한 부여이지 또 다른 XML 편집이 아닙니다.

터널 링크에서 도메인을 검증하십시오

다시 연결해 resolvectl status을 다시 읽고, 터널 링크가 네임 서버와 검색 도메인을 함께 갖는지 확인하십시오. 공개 이름이 아니라 짧은 사설 이름을 확인하십시오. 이름은 확인되는데 그 뒤의 서비스가 응답하지 않는다면 DNS 인계는 성공한 것이고 남은 문제는 라우팅입니다.

티켓에 확인자 소유자, 실패한 D-Bus 호출, 규칙 파일, 프로필 버전을 적으십시오. 그 네 줄이 다음 Linux 노트북을 반복 조사가 아닌 짧은 수정으로 바꿉니다.

관련 글