De tunnel komt op, het certificaat wordt gevalideerd en dan meldt een dialoog dat de DNS-server of de domeinen niet konden worden ingesteld. Op Linux gaat die dialoog meestal niet over de gateway: de client draagt de naamconfiguratie via D-Bus over aan systemd-resolved, en een geweigerde overdracht laat de interface omhoog staan met resolutie die nog steeds naar de oude verbinding wijst. Dezelfde laptop lost namen prima op voordat het profiel een suffix krijgt, en dat is de aanwijzing die het volgen waard is. Aan de tunnel veranderde niets op het moment dat de dialoog verscheen.

Zonder suffix duwt de client alleen naamservers. Voeg een zoekdomein toe en een tweede aanroep sluit zich daarbij aan, SetLinkDomains, met zijn eigen autorisatiecontrole, daarom werkt hetzelfde profiel op Windows en faalt het hier. De gateway duwt in beide gevallen dezelfde instellingen, en het onderdeel dat ze weigert is lokaal.

Bevestig dat systemd-resolved de resolver is

Deze client spreekt met systemd-resolved en met niemand anders. Arch en verschillende andere distributies leveren het uitgeschakeld, en /etc/resolv.conf kan volledig van een andere resolver zijn, dus stel de eigenaar vast voordat je naar rechten kijkt.

Drie opdrachten maken dat duidelijk:

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

Je zoekt een actieve dienst, een symbolische link die naar /run/systemd/resolve/stub-resolv.conf wijst, en DNS per link in resolvectl. Als NetworkManager het eigenaarschap heeft, verplaats het dan naar resolved in plaats van met de client te vechten; de drop-in hieronder stelt beide sleutels in:

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

Herstart NetworkManager zodra dat bestand bestaat. Een inactieve resolver samen met een client die zijn D-Bus-naam blijft aanroepen, levert een fout op die geen van beide noemt.

Kijk naar de D-Bus-aanroep die mislukt

Deze stap maakt van de dialoog een concreet antwoord. Kijk in de ene terminal naar de resolver-interface en in de andere naar het journaal, en verbind dan opnieuw:

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

Er zouden drie aanroepen moeten verschijnen: SetLinkDNS, SetLinkDomains en SetLinkDefaultRoute. Degene die als foutantwoord terugkomt, is degene die je moet herstellen. Dat antwoord noemt meestal zijn reden, bijvoorbeeld org.freedesktop.DBus.Error.AccessDenied tegen SetLinkDomains. Noteer welke aanroep het was, want de volgende sectie gaat over het doorlaten van precies die aanroep.

Geef de client de polkit-acties die hij nodig heeft

Lees het beleid voordat je een regel schrijft. Een client die als dienst draait, kan geen interactieve vraag beantwoorden, dus een impliciete auth_admin_keep is een doodlopende weg.

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

Als het antwoord auth_admin_keep is, heeft de client een expliciete regel nodig. Het fragment hieronder staat de vier resolve1-acties toe die een VPN-client tijdens een verbinding gebruikt, en laat al het andere op 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;
});

Plaats het in /etc/polkit-1/rules.d/ als een bestand dat je later herkent, bijvoorbeeld 50-azurevpn.rules, en vervang de groepsnaam in het fragment door je eigen naam voordat je uitlogt en weer inlogt. Houd het smal, want elke resolve1-actie voor elk account toestaan is breder dan deze client nodig heeft en veel lastiger om later te auditen.

Controleer de profiel-XML voordat je polkit aanpast

Een met de hand bewerkt profiel kan zonder een woord worden genegeerd. Microsoft documenteert een platte indeling waarin dnsserver-vermeldingen direct in dnsservers staan en suffixen in dnssuffixes. Een extra omhullend element rond elk adres is die vorm niet, en de client valt stil terug op wat de gateway ook duwt.

Doe de verwijderingstest voordat je polkit aanraakt. Haal het suffixblok weg, verbind opnieuw en kijk of de dialoog verandert. Als dat zo is, was de mislukte aanroep de domeinoverdracht, en de oplossing is autorisatie en niet nog een XML-bewerking.

Verifieer het domein op de tunnelverbinding

Verbind opnieuw en lees resolvectl status nog eens, en controleer dat de tunnelverbinding de naamserver en het zoekdomein samen draagt. Los een korte privénaam op in plaats van een openbare. Als de naam oplost maar de dienst erachter niet antwoordt, is de DNS-overdracht geslaagd en is het resterende probleem routering.

Schrijf de resolver-eigenaar, de mislukte D-Bus-aanroep, het regelbestand en de profielversie in de ticket. Die vier regels maken de volgende Linux-laptop een korte correctie in plaats van een herhaald onderzoek.

Gerelateerde artikelen