Chỉ một máy khách quản trị: vì sao trình giám sát đá văng giao diện đồ họa
Socket quản trị chỉ nhận một kết nối tại một thời điểm. Người đăng ký thứ hai hoặc không gắn được, hoặc cướp quyền điều khiển khỏi thành phần nắm giữ các lời nhắc.
Một giao diện đồ họa trên máy tính để bàn giữ kết nối quản trị, nên một script giám sát cố mở kết nối riêng thì không đọc được gì hoặc, tệ hơn, giao diện ngừng phản hồi các lời nhắc. Kết luận thường thấy là daemon chập chờn. Trong daemon cộng đồng, giới hạn này là có chủ ý: giao diện điều khiển phục vụ một máy khách quản trị đang kết nối tại một thời điểm, và con số đó không liên quan gì đến số người dùng mà VPN có thể chở.
Một socket, một người giữ
Kênh quản trị chấp nhận một máy khách đang kết nối. Khi máy thứ hai đến trong lúc máy thứ nhất đang hoạt động, nó chờ hoặc bị từ chối, và không có chế độ người đăng ký song song nào ẩn sau một tùy chọn. Ngắt kết nối người giữ hiện tại cho phép daemon nhận máy tiếp theo, và đó là một lần chuyển giao, không phải kênh thứ hai.
Điều đó biến mọi công cụ thêm thành đối thủ. Nếu giao diện giữ kết nối, script thăm dò hoặc không gắn được, hoặc chỉ thành công sau khi giao diện bỏ cuộc, và chuỗi này lặp lại ở lần kết nối lại kế tiếp. Nếu script gắn trước, giao diện mất đường điều khiển và các lời nhắc của nó ngừng hoạt động. Không công cụ nào báo xung đột, vì mỗi công cụ chỉ thấy lệnh thất bại của chính nó.
| What you need | Mechanism that fits | What it cannot do |
|---|---|---|
| Periodic list of connected clients | Status file written on an interval | Deliver events as they happen |
| Interactive prompts and session control | The single management connection | Serve two controllers at once |
| Multiple consumers of either | One owner process that fans out | Exist without you writing it |
Quyết định thành phần nào giữ quyền điều khiển
Chọn một người giữ cho kênh tương tác và để nó là thứ duy nhất kết nối. Một giao diện quản lý kết nối, một script trả lời các lời nhắc xác thực và một bộ điều khiển kết thúc phiên đều được tính là người giữ, và chỉ một bên có thể đảm nhận vai trò.
Khi giao diện giữ kết nối, hãy dùng tích hợp mà giao diện đó cung cấp thay vì chống lại nó. Chạy đua với người giữ để giành socket tạo ra những lỗi gián đoạn mà người dùng thấy như ngẫu nhiên, và người gỡ lỗi thường chỉ thấy nửa sau của cuộc đua. Ghi lại tiến trình nào kết nối trước sau khi khởi động lại, vì thứ tự đó quyết định ai thắng mỗi lần. Một trình giám sát khởi động trước giao diện sẽ giữ kênh cho đến khi giao diện bỏ cuộc.
Dùng ảnh chụp trạng thái cho các bộ thu thập
Phần lớn nhu cầu giám sát cần một danh sách, không phải một cuộc trò chuyện. Một tệp trạng thái định kỳ trả lời điều đó mà không chạm vào kênh điều khiển, và nó tiếp tục hoạt động trong khi giao diện vẫn kết nối.
status /run/openvpn/server.status 10
management /run/openvpn/server.sock unix
Khoảng thời gian là ngân sách độ tươi, nên hãy đặt nó theo điều bảng điều khiển thực sự cần, chứ không theo giá trị nhỏ nhất có vẻ an toàn. Một ảnh chụp ghi mỗi vài giây là rẻ; một script kết nối lại với socket điều khiển mỗi vài giây thì không, vì mỗi lần kết nối lại đều tranh chấp với người giữ.
Ảnh chụp không phải lịch sử và cũng không phải luồng sự kiện. Những kết nối đến và đi trong cùng một khoảng thời gian không bao giờ xuất hiện, nên không thể đáp ứng yêu cầu kiểm toán bằng cách thăm dò một tệp tự ghi đè lên chính nó. Nếu bạn cần biết một người dùng đã từng kết nối hay chưa, ảnh chụp là công cụ sai.
Phân phối là thiết kế, không phải chế độ
Nếu nhiều bên tiêu thụ thực sự cần dữ liệu quản trị trực tiếp, hãy đặt một thành phần đáng tin cậy duy nhất trước socket và để nó công bố những quan sát được chọn lọc kỹ cho phần còn lại. Thành phần đó giữ việc kết nối lại, các lời nhắc xác thực và quyết định về điều gì là an toàn để lộ ra.
Hãy xây dựng nó một cách có chủ đích: xác định những truy vấn nào được phép, ghi lại ai đã hỏi, và tránh để lớp phân phối vô tình trở thành bảng điều khiển từ xa. Daemon không có chế độ nhiều máy khách để bật, và không dòng cấu hình nào tạo ra nó. Hãy coi người giữ là một phần của ranh giới bảo mật, vì nó nắm một giao diện có thể ngắt kết nối con người. Khởi động lại nó nên là một thao tác thường quy với đường phục hồi được ghi lại.
Coi socket là đặc quyền, không phải số liệu
Giao diện quản trị có thể ngắt kết nối người dùng, thay đổi trạng thái và đọc các sự kiện có nêu tên người. Mật khẩu của nó xác thực máy khách và không mã hóa đường truyền, nên một bộ lắng nghe mạng phơi bày cuộc trò chuyện cho bất kỳ ai có thể quan sát.
Hãy ưu tiên một socket cục bộ hoặc một bộ lắng nghe bị hạn chế chặt chẽ, và kiểm tra bộ thu thập của bạn thực sự đang nhắm tới tiến trình nào, vì các sản phẩm máy chủ mang theo API quản trị riêng hoạt động khác đi. Một bộ thu thập trỏ nhầm daemon sẽ cho ra kết luận chắc chắn nhưng sai. Hãy xác nhận đường dẫn và tiến trình sở hữu trước khi gỡ lỗi một truy vấn không trả về gì.