Тунелът се вдига, сертификатът се валидира и тогава диалог съобщава, че DNS сървърът или домейните не могат да бъдат зададени. В Linux този диалог обикновено не е за шлюза: клиентът предава настройките за имена на systemd-resolved през D-Bus и отказаното предаване оставя интерфейса вдигнат с резолюция, която още сочи към старата връзка. Същият лаптоп резолвира имена нормално, преди профилът да получи суфикс, и това е следата, която си струва да следвате. Нищо по тунела не се промени в момента, в който се появи диалогът.

Без суфикс клиентът предава само сървъри за имена. Добавете домейн за търсене и към него се присъединява второ повикване, 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, и DNS за всяка връзка в resolvectl. Когато собственик е 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, клиентът се нуждае от явно правило. Фрагментът по-долу разрешава четирите действия resolve1, които VPN клиент използва при свързване, и оставя всичко останало на 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 за всеки акаунт е по-широко, отколкото този клиент изисква, и много по-трудно за одит после.

Проверете XML на профила, преди да редактирате polkit

Ръчно редактиран профил може да бъде игнориран без дума. Microsoft документира плоска подредба, в която записите dnsserver стоят директно вътре в dnsservers, а суфиксите вътре в dnssuffixes. Допълнителен обвиващ елемент около всеки адрес не е тази форма и клиентът тихо се връща към това, което шлюзът предава.

Направете теста за премахване, преди да пипате polkit. Извадете блока със суфикса, свържете се отново и вижте дали диалогът се променя. Ако се промени, провалилото се повикване е било предаването на домейна и поправката е оторизация, а не още една XML редакция.

Проверете домейна на тунелната връзка

Свържете се отново и прочетете resolvectl status пак, като проверявате, че тунелната връзка носи сървъра за имена и домейна за търсене заедно. Резолвирайте кратко частно име, а не публично. Когато името се резолвира, но услугата зад него не отговаря, DNS предаването е сработило и останалият проблем е маршрутизация.

Запишете в тикета собственика на резолвера, D-Bus повикването, което се провали, файла с правилото и версията на профила. Тези четири реда превръщат следващия Linux лаптоп в кратка поправка, а не в повторно разследване.

Подобни статии