OpenVPN liên tục thử lại sau lỗi TLS: cách dừng nó
Lỗi TLS được thử lại theo mặc định, nên máy khách quay vòng và lỗi đầu tiên trôi khỏi tầm mắt. tls-exit khiến nó thoát ra; hãy kiểm tra điều gì khởi động lại nó.
Máy khách kết nối, thất bại trong quá trình thương lượng TLS, chờ rồi thử lại đúng máy chủ đó với cùng kết quả. Dưới một giám sát viên khởi động lại tiến trình thất bại, những lần thử đó trở thành vòng lặp vô tận trong nhật ký, và dòng chẩn đoán đầu tiên trôi khỏi tầm với. OpenVPN có một tùy chọn biến lần thất bại thương lượng đó thành một lần thoát nhìn thấy được thay vì thêm một lần thử. Đây là thiết lập cho chẩn đoán và giám sát, không phải sửa chữa, nên hãy ghép nó với một chính sách thực sự cho phép tiến trình dừng lại.
Vòng lặp che giấu lỗi đầu tiên
Điều bạn thấy là một khối lặp lại chứ không phải một thất bại: một lần thử kết nối, một lỗi TLS, một khoảng dừng và sau đó là cùng chuỗi đó. Mỗi lần lặp đẩy dòng gốc cao hơn trong nhật ký. Nếu unit khởi động lại khi thất bại, vòng lặp có thể kéo dài hàng giờ mà không ai đọc nguyên nhân. Triệu chứng là vòng lặp, dù khiếm khuyết nền chỉ là một vấn đề thương lượng.
Các phiên tương tác chịu được điều này vì một thất bại tạm thời có thể hết ở lần thử sau. Các kết nối tự động không thể cho phép sự lạc quan như vậy: tiến trình phải dừng để con người hoặc giám sát thấy trạng thái.
Trước khi thay đổi bất cứ điều gì, hãy ghi lại một vòng lặp đầy đủ. Ghi địa chỉ từ xa, giai đoạn TLS được nêu trong lỗi và việc tiến trình có thoát ra hay không.
Cơ chế thử lại đằng sau vòng lặp
Thử lại là mặc định vì nhiều thời gian chờ không liên quan dùng chung một cơ chế. connect-retry đặt khoảng cách giữa các lần thử kết nối, connect-retry-max có thể giới hạn tần suất thử mỗi mục từ xa, và resolv-retry điều khiển việc tra cứu tên lặp lại. Thất bại thương lượng TLS đến cơ chế đó như một sự kiện vận chuyển, nên máy khách lên lịch một lần thử nữa thay vì báo cáo. Giá trị mặc định hữu ích với một liên kết không ổn định và có hại với khiếm khuyết không thể tự lành.
Tùy chọn --tls-exit chỉ thay đổi trường hợp thương lượng. Sách hướng dẫn mô tả nó là thoát khi thương lượng TLS thất bại, hẹp hơn so với thoát ở mọi lỗi. Thời gian chờ, lỗi trình phân giải và việc từ chối xác thực giữ hành vi riêng của chúng.
Buộc máy khách thoát khi TLS thất bại
Đặt tls-exit trong hồ sơ mà máy khách thực sự tải, hoặc truyền --tls-exit khi khởi động, rồi chạy nó một lần ở tiền cảnh. Đọc trạng thái thoát và dòng nhật ký cuối, vì giám sát viên hành động dựa trên trạng thái. Thoát khác không sau một thất bại thương lượng là kết quả mong muốn. Nếu tiến trình vẫn thử lại thay vì kết thúc, tùy chọn không nằm trong hồ sơ mà máy khách thực sự tải.
Giám sát viên quyết định lần thoát đó có hiển thị hay không. Một unit systemd với Restart=always hoặc Restart=on-failure khởi động lại máy khách, nên vòng lặp tiếp diễn và tùy chọn có vẻ không làm gì. Kiểm tra chính sách trước khi đổ lỗi cho máy khách:
systemctl show -p Restart -p RestartSec openvpn-client@office
journalctl -u openvpn-client@office -n 40 --no-pager
Restart=no để tiến trình dừng lại, và Restart=on-failure vẫn khởi động lại sau trạng thái khác không. Nếu muốn thất bại hiển thị nhưng dịch vụ phục hồi sau các sự cố không liên quan, hãy đặt Restart=on-failure và dùng StartLimitBurst cùng StartLimitIntervalSec để chặn cơn bão khởi động lại. Sau đó đọc trạng thái của unit để xác nhận mã thoát cuối: systemctl status báo nó, và nhật ký giữ lỗi đầu tiên phía trên các lần khởi động lại.
Viết quyết định vào unit hoặc vào ghi chú hồ sơ. Một hồ sơ thoát khi TLS thất bại trông như tai nạn với người tiếp theo trừ khi lý do được ghi lại. Nêu rõ thất bại nào phải dừng tiến trình và thất bại nào nên được thử lại.
Chứng minh bằng một điểm cuối dùng một lần
Để xem hành vi trước khi tin nó, hãy sao chép hồ sơ và trỏ bản sao vào một điểm cuối chấp nhận kết nối TCP nhưng không bao giờ nói OpenVPN. Một trình lắng nghe trả lời rồi im lặng là đủ. Với tls-exit, máy khách nên kết thúc khi bắt tay thất bại; nếu không có nó, cùng hồ sơ đó nên tiếp tục quay vòng. Dùng bản sao, không bao giờ dùng hồ sơ đang hoạt động.
So sánh hai lần chạy theo trạng thái thoát và dòng lỗi đầu tiên, không theo việc mỗi lần kéo dài bao lâu. Trạng thái cho biết tùy chọn có kích hoạt, và dòng đầu cho biết giai đoạn nào thất bại.
Xóa hồ sơ thử khi xong. Một bản sao có điểm cuối cố ý sai là cái bẫy cho bất kỳ ai sau này khởi động mọi hồ sơ trong thư mục.
Những giai đoạn tùy chọn này không bao giờ chạm tới
Từ chối xác thực là giai đoạn muộn hơn. Nếu máy chủ đánh giá tài khoản và từ chối, TLS đã được thương lượng, nên tls-exit không kích hoạt. Cài đặt thử lại xác thực là nơi tiếp theo cần xem, và lý do từ máy chủ quan trọng hơn dòng cuối của máy khách. Sai mật khẩu và thiếu chứng chỉ có thể tạo ra thông báo tương tự ở phía máy khách.
Thiếu tuyến đường, sai trình phân giải hoặc cổng không tới được cũng nằm ngoài tùy chọn, vì chúng không phải thất bại thương lượng. Mất gói âm thầm là trường hợp kém rõ ràng nhất: tùy theo trao đổi đi được bao xa, máy khách có thể báo thất bại thương lượng hoặc chỉ đơn giản hết thời gian.
Giữ sự phân biệt đó trong ghi chú của bạn. Thiết lập này dành cho chẩn đoán và giám sát hơn là sửa chữa, nên nó không sửa sự không khớp mật mã, vấn đề chứng chỉ hay cổng sai. Hãy sửa nguyên nhân thương lượng thất bại trước, rồi quyết định xem thoát ngay còn phù hợp với triển khai hay không.