Đường hầm kết nối, chứng chỉ được xác thực, rồi một hộp thoại báo không thể đặt máy chủ DNS hoặc miền. Trên Linux hộp thoại đó thường không phải về cổng: ứng dụng chuyển cấu hình tên cho systemd-resolved qua D-Bus, và một lần bàn giao bị từ chối để giao diện vẫn kết nối với việc phân giải vẫn trỏ vào liên kết cũ. Cùng chiếc máy xách tay đó phân giải tên tốt trước khi hồ sơ có thêm hậu tố, và đó là manh mối đáng theo. Không có gì ở đường hầm thay đổi vào lúc hộp thoại xuất hiện.

Không có hậu tố, ứng dụng chỉ đẩy máy chủ tên. Thêm một miền tìm kiếm và lệnh gọi thứ hai tham gia cùng nó, SetLinkDomains, với kiểm tra ủy quyền riêng, vì thế cùng hồ sơ đó chạy trên Windows mà lại thất bại ở đây. Cổng đẩy cùng cấu hình trong cả hai trường hợp, và thành phần từ chối chúng là cục bộ.

Xác nhận systemd-resolved là bộ phân giải

Ứng dụng này chỉ nói chuyện với systemd-resolved và không với ai khác. Arch và vài bản phân phối khác cung cấp nó ở trạng thái tắt, và /etc/resolv.conf có thể thuộc về một bộ phân giải hoàn toàn khác, nên hãy xác định chủ sở hữu trước khi xem quyền.

Ba lệnh làm rõ điều đó:

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

Bạn đang tìm một dịch vụ đang hoạt động, một liên kết tượng trưng trỏ tới /run/systemd/resolve/stub-resolv.conf, và DNS theo từng liên kết trong resolvectl. Khi NetworkManager giữ quyền sở hữu, hãy chuyển nó sang resolved thay vì đấu với ứng dụng; tệp drop-in bên dưới đặt cả hai khóa:

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

Khởi động lại NetworkManager ngay khi tệp đó tồn tại. Một bộ phân giải không hoạt động cùng ứng dụng vẫn gọi tên D-Bus của nó sẽ tạo ra lỗi không nêu tên cả hai.

Theo dõi lệnh gọi D-Bus thất bại

Bước này biến hộp thoại thành câu trả lời cụ thể. Theo dõi giao diện bộ phân giải ở một cửa sổ dòng lệnh và nhật ký ở cửa sổ khác, rồi kết nối lại:

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

Ba lệnh gọi sẽ xuất hiện: SetLinkDNS, SetLinkDomains và SetLinkDefaultRoute. Lệnh trả về dưới dạng phản hồi lỗi là lệnh cần sửa. Phản hồi đó thường nêu lý do, ví dụ org.freedesktop.DBus.Error.AccessDenied so với SetLinkDomains. Ghi lại đó là lệnh nào, vì phần tiếp theo nói về việc cho lệnh đó đi qua.

Cấp các hành động polkit mà ứng dụng cần

Đọc chính sách trước khi viết quy tắc. Ứng dụng chạy như dịch vụ không thể trả lời lời nhắc tương tác, nên auth_admin_keep ngầm là một ngõ cụt.

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

Nếu câu trả lời là auth_admin_keep, ứng dụng cần một quy tắc rõ ràng. Đoạn bên dưới cho phép bốn hành động resolve1 mà ứng dụng VPN dùng trong khi kết nối và để mọi thứ khác ở 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;
});

Đặt nó trong /etc/polkit-1/rules.d/ như một tệp bạn sẽ nhận ra sau này, ví dụ 50-azurevpn.rules, và thay tên nhóm trong đoạn bằng tên của bạn trước khi đăng xuất và đăng nhập lại. Giữ nó hẹp, vì cho phép mọi hành động resolve1 cho mọi tài khoản rộng hơn mức ứng dụng này cần và khó kiểm tra lại hơn nhiều.

Kiểm tra XML hồ sơ trước khi sửa polkit

Một hồ sơ sửa bằng tay có thể bị bỏ qua không một lời. Microsoft tài liệu hóa bố cục phẳng trong đó các mục dnsserver nằm trực tiếp bên trong dnsservers, và hậu tố bên trong dnssuffixes. Một phần tử bọc thêm quanh mỗi địa chỉ không phải hình dạng đó, và ứng dụng lặng lẽ quay về những gì cổng đẩy xuống.

Hãy thử nghiệm xóa trước khi chạm vào polkit. Bỏ khối hậu tố, kết nối lại và xem hộp thoại có đổi không. Nếu có, lệnh thất bại là việc bàn giao miền, và cách sửa là ủy quyền chứ không phải sửa XML lần nữa.

Xác minh miền trên liên kết đường hầm

Kết nối lại và đọc resolvectl status lần nữa, kiểm tra rằng liên kết đường hầm mang cả máy chủ tên và miền tìm kiếm. Phân giải một tên riêng ngắn thay vì tên công cộng. Khi tên phân giải được nhưng dịch vụ phía sau không trả lời, việc bàn giao DNS đã chạy và vấn đề còn lại là định tuyến.

Ghi vào phiếu chủ sở hữu bộ phân giải, lệnh D-Bus thất bại, tệp quy tắc và phiên bản hồ sơ. Bốn dòng đó biến chiếc máy Linux tiếp theo thành một bản sửa ngắn thay vì một cuộc điều tra lặp lại.

Bài viết liên quan