Với một máy chủ OpenVPN không khởi động cùng hệ thống, có hai cách xử lý: chờ địa chỉ, hoặc để dịch vụ thử lại cho đến khi ràng buộc thành công. Cả hai đều nhắm vào cùng một triệu chứng nhưng hành xử khác nhau khi thất bại. Chờ đợi mã hóa một điều kiện tiên quyết cụ thể và thất bại ồn ào khi thiếu nó; thử lại che giấu điều kiện tiên quyết và tiếp tục cố gắng. Cách nào phù hợp với unit của bạn phụ thuộc vào việc địa chỉ đó là một phụ thuộc được thiết kế hay chỉ là sự tình cờ của thời điểm.

Cả hai đều tốt hơn một khoảng ngủ cố định, vốn không chờ gì và cũng không báo rằng nó đã chờ cái gì.

Tùy chọn local thực sự yêu cầu gì

local chỉ định địa chỉ mà tiến trình daemon ràng buộc socket của nó vào, và việc ràng buộc vào một địa chỉ chưa tồn tại sẽ thất bại ngay với lỗi về địa chỉ được yêu cầu. Khi thiếu tùy chọn này, daemon lắng nghe trên mọi địa chỉ, đó là lý do cùng một hồ sơ vẫn chạy trên máy chưa có giao diện mạng: nó lắng nghe khắp nơi thay vì đúng địa chỉ bạn đã nêu. Chính sự khác biệt đó là toàn bộ lỗi, và nó vẫn vô hình cho đến lần khởi động lại.

Yêu cầu không phải là giao diện đã sẵn sàng theo một nghĩa chung chung nào đó. Địa chỉ phải được gán cho đúng giao diện tại thời điểm ràng buộc, và đó phải là giao diện nền chứ không phải một đường hầm mà chính daemon đó sẽ tạo ra sau này. Một lần kiểm tra vài phút sau khi đăng nhập không chứng minh được gì về trình tự khởi động.

Chờ địa chỉ so với thử lại ràng buộc

Chờ đợi nghĩa là một ExecStartPre thăm dò cho đến khi địa chỉ xuất hiện, với số lần thử có giới hạn và mã thoát khác không khi hết thời gian. Thử lại nghĩa là để tiến trình chính thất bại và yêu cầu trình quản lý dịch vụ khởi động lại nó, ví dụ Restart=on-failure với RestartSec=5. Cách thứ nhất báo điều kiện tiên quyết thiếu dưới dạng một unit thất bại, còn cách thứ hai báo nó như một chuỗi khởi động lại cuối cùng dừng lại; trong nhật ký điều này ồn hơn nhưng chịu được một địa chỉ đến muộn vì những lý do bạn không thể lường trước.

Hãy ưu tiên chờ khi địa chỉ là phụ thuộc được thiết kế, và ưu tiên thử lại khi địa chỉ thường xuất hiện nhưng thời điểm thay đổi. Kết hợp cả hai là hợp lý: một khoảng chờ có giới hạn bao phủ trường hợp thường gặp và chính sách khởi động lại bao phủ ngoại lệ. Điều cả hai không nên làm là chạy mãi mãi, vì một unit thử lại vô hạn sẽ che giấu cấu hình sai thay vì báo cáo nó.

Vì sao network-online.target là chưa đủ

network-online.target chỉ hứa đúng những gì cách hiện thực mạng đang hoạt động hiểu là online, và không hơn. Với systemd-networkd, systemd-networkd-wait-online quyết định khi nào đạt được mục tiêu đó, và quan niệm mặc định của nó về online có thể được thỏa mãn trước khi địa chỉ cụ thể của bạn tồn tại. Dưới NetworkManager, dịch vụ wait-online áp dụng luật riêng của nó. Xếp thứ tự sau mục tiêu là một nền tảng vững chắc, không phải bảo đảm rằng một địa chỉ, một câu trả lời DNS hay một peer từ xa đã sẵn sàng.

Lập luận tương tự loại trừ những lựa chọn thay thế thường thấy. Một mục tự khởi động trên màn hình chờ một phiên người dùng có thể không bao giờ mở trên máy chủ, và một lệnh cron bị trì hoãn chỉ thêm thời gian trôi qua mà không nêu tên tài nguyên mà nó hy vọng sẽ xuất hiện. Cả hai có thể trông thành công trong nhiều tháng rồi thất bại đúng vào lần khởi động quan trọng.

Kiểm tra ràng buộc sau một lần khởi động nguội

Hãy kiểm chứng bằng một lần khởi động nguội thật, không phải bằng khởi động lại dịch vụ, vì khởi động lại kế thừa một địa chỉ mà trình tự khởi động đã phải tạo ra. Sau khi khởi động, ss -lntp hoặc ss -lunp hiển thị địa chỉ cục bộ mà mỗi trình lắng nghe thực sự ràng buộc, và journalctl -b -u openvpn-server@server cho biết lần thử đầu tiên có thất bại không. Hãy so sánh địa chỉ đã ràng buộc với địa chỉ trong hồ sơ, rồi lặp lại phép so sánh sau khi kết nối lại mạng.

Nếu hồ sơ chưa bao giờ cần một địa chỉ cố định, việc bỏ local là một cách đơn giản hóa chính đáng, nhưng hãy biến nó thành quyết định bảo mật chứ không phải thói quen xử lý sự cố.

Mở rộng trình lắng nghe thay đổi việc ai có thể tiếp cận nó, nên hãy ghép thay đổi đó với chính sách tường lửa mà lẽ ra phải giới hạn nó. Một dịch vụ khởi động đáng tin cậy trên mọi giao diện chưa giải quyết được vấn đề ban đầu; nó chỉ chuyển vấn đề ra biên của mạng.

Bài viết liên quan