Địa chỉ của peer thay đổi giữa phiên: float trong OpenVPN làm gì
float cho phép peer đã xác thực thay đổi địa chỉ bên ngoài của nó giữa phiên. Nó không khám phá điểm cuối, không mở lại liên kết đã chết và không bỏ qua các kiểm tra danh tính.
Laptop chuyển từ Wi-Fi văn phòng sang hotspot điện thoại, đường hầm duy trì thêm vài giây, rồi lưu lượng dừng lại trong khi giao diện vẫn khẳng định là đang kết nối. Trên máy chủ, danh sách trạng thái vẫn hiển thị địa chỉ công khai cũ. Đây chính là tình huống mà float tồn tại, và cũng là tình huống mà người ta kỳ vọng ở nó nhiều hơn hẳn so với những gì nó làm. Hiểu đúng ranh giới sẽ biến một lần kẹt khó hiểu thành hoặc một thay đổi cấu hình một dòng, hoặc một cuộc điều tra hoàn toàn khác.
float nới lỏng điều gì, và không bao giờ nới lỏng điều gì
Thông thường một phiên tiếp tục nói chuyện với địa chỉ và cổng bên ngoài mà nó đã bắt đầu, và các gói đến từ bất kỳ nơi nào khác đều bị bỏ qua. Tùy chọn float gỡ bỏ ràng buộc nghiêm ngặt đó sau khi peer đã tự chứng minh, nhờ vậy ánh xạ nguồn đã thay đổi có thể tiếp tục cùng phiên thay vì bị loại bỏ. Không có gì trong các kiểm tra mật mã thay đổi: khóa, chứng chỉ và mọi bảo vệ HMAC vẫn giữ nguyên như đã cấu hình.
Đây là quyết định cho từng gói, không phải chính sách về việc ai được kết nối. Một máy lạ gửi gói từ địa chỉ mới không chứng minh được gì, và gói của nó bị loại bỏ như mọi lưu lượng chưa xác thực khác. Chỉ lưu lượng đi qua xác thực của chính phiên mới có thể dịch chuyển địa chỉ peer đã ghi nhận, và đó là lý do an toàn khi để float bật trong môi trường mà các client di chuyển.
Nó cũng không nói gì về đường hầm bên trong. Một địa chỉ bên ngoài bị dịch chuyển không cấp lại địa chỉ đường hầm, không đổi pool và không cho peer quyền truy cập vào thứ gì mới. Bên trong đường hầm, cùng một danh tính và cùng những tuyến bị đẩy vẫn áp dụng trước và sau khi dịch chuyển. Việc di chuyển cũng không thương lượng lại kênh dữ liệu, nên thuật toán mã hóa và khóa đã thỏa thuận vẫn tiếp tục.
Gói làm dịch chuyển phiên phải được xác thực
Bắt đầu một phiên theo cách thông thường với đầu xa đã cấu hình, và float xử lý điều gì xảy ra khi ánh xạ thay đổi. Một nhà mạng di động đánh số lại giữa dòng, một cổng NAT viết lại ánh xạ cổng của nó, hay một laptop đổi đường lên đều tạo ra cùng một hình dạng: các gói đã xác thực từ một tuple mới, đến một phiên vẫn còn tin vào cái cũ.
Khi được hỏi float có hoạt động không, bằng chứng hữu ích là một lần bắt tay đã hoàn tất và sau đó là một thay đổi nguồn được chấp nhận, không phải một dòng nhật ký chỉ về địa chỉ. Liên kết địa chỉ bên ngoài cũ và mới với phiên còn sống, rồi xác nhận rằng lưu lượng thực sự tiếp tục qua đường hầm.
Nếu phiên chết thay vì dịch chuyển, gói đến từ địa chỉ mới có lẽ đã thất bại khi xác thực hoặc không hề đến. Cả hai trường hợp trông giống nhau từ phía client. Trên máy chủ, một lần bắt gói trên giao diện công khai sẽ cho bạn biết là trường hợp nào trước khi bạn chạm vào bất kỳ cấu hình nào.
Khám phá là một cơ chế hoàn toàn riêng
float không phân giải tên theo bộ đếm thời gian và không theo dõi bản ghi DNS động. Nếu tên máy chủ bắt đầu phân giải sang một địa chỉ mới, một client đang rảnh không có lý do gì để nhận ra và không có gói nào từ điểm cuối mới để xác thực. Vấn đề đó thuộc về logic kết nối lại, hành vi thử lại của chính client và DNS, không thuộc về float.
Thêm tùy chọn một lần nữa không thể bù đắp cho việc không có tuyến đến địa chỉ mới. Nó cũng không giúp gì khi peer im lặng, vì một peer im lặng không bao giờ gửi gói đã xác thực có thể dịch chuyển được gì.
Tường lửa bên dưới cũng có tiếng nói. Một quy tắc chỉ cho phép điểm cuối bên ngoài cũ sẽ chặn địa chỉ đã thay đổi trước khi OpenVPN kịp nhìn thấy, và không cấu hình phía client nào khắc phục được điều đó. Hãy xem vòng đời của các địa chỉ được phép là một nhiệm vụ riêng; mở rộng quy tắc cho mọi nguồn là đổi một vấn đề nhỏ lấy một vấn đề lớn.
Khi NetworkManager sở hữu hồ sơ
Hồ sơ dòng lệnh và kết nối được nhập là hai cấu hình riêng biệt, và sửa cái này không đụng đến cái kia. Trước khi cho rằng tùy chọn không được hỗ trợ, hãy xác định hồ sơ đã lưu thực sự dùng loại plugin nào và các giá trị của nó nằm ở đâu. UUID của hồ sơ là định danh quan trọng khi bạn kiểm tra hoặc thay đổi bất cứ điều gì.
Hãy kiểm tra kết nối đã lưu chứ không phải tệp nhập gốc. Một dòng còn lại trong tệp .ovpn không chứng minh được gì nếu trình quản lý đang hoạt động chưa bao giờ áp dụng nó, và một trình soạn thảo không có hộp kiểm cho một tùy chọn nhất định cũng không chứng minh được gì về khả năng của giao thức.
Đừng vá một plugin đã đóng gói để thêm hành vi, nhất là không bằng một diff viết cho phiên bản lịch sử của một thành phần không liên quan. Nếu tích hợp đã cài đặt thực sự không thể diễn đạt thiết lập đó, bước đúng là một hồ sơ được hỗ trợ hoặc một đường dẫn client khác được người sở hữu triển khai phê duyệt.
Hãy chứng minh chuyển đổi thay vì giả định
Chạy thử nghiệm theo đúng cách sự cố xảy ra. Kết nối, xác minh lưu lượng qua đường hầm, buộc địa chỉ bên ngoài thay đổi, rồi kiểm tra ba điều: phiên vẫn tồn tại, địa chỉ peer đã ghi nhận đã dịch chuyển và một yêu cầu thực vẫn đến được đích. Bất cứ điều gì ít hơn cả ba đều là câu trả lời một phần.
Giữ sẵn quyền truy cập phục hồi trong khi kiểm tra, vì các thử nghiệm chuyển vùng thường để lại chiếc máy bạn đang làm việc bị kẹt. Một console nối tiếp hoặc một tuyến ngoài băng sẽ biến một lần kiểm tra thất bại thành một lần phục hồi năm phút thay vì một chuyến đến tận nơi.
Cuối cùng, chỉ mô tả trường hợp bạn thực sự thử. Một thay đổi địa chỉ thành công trong phiên không phải bằng chứng rằng việc di chuyển DNS, một cách triển khai client khác hay một hồ sơ được dựng lại sẽ hành xử giống hệt. Tài liệu link-options nêu chính xác phạm vi của tùy chọn; nhật ký kiểm tra của bạn nên nói rõ bạn đã thực sự bao phủ phần nào của phạm vi đó.