Một IP dịch vụ trên mỗi nút OpenVPN: những gì nó không làm
Dành riêng một /32 riêng tư trên mỗi nút để máy khách đến được máy chủ nó đã chọn. Địa chỉ đó không chuyển đổi khi sự cố, không di chuyển phiên và không chọn nút khỏe.
Một máy khách kết nối tới một trong nhiều máy chủ OpenVPN và sau đó cần một dịch vụ nhỏ chạy trên chính nút ấy: một trang trạng thái, một điểm cuối số liệu, một tác nhân sao lưu. Gán cho mọi nút cùng một địa chỉ dịch vụ riêng khiến cấu hình của máy khách giống hệt nhau bất kể nó đáp xuống máy chủ nào. Sự tiện lợi đó là thật, và cũng dễ đọc quá mức: địa chỉ dùng chung cho bạn biết bạn đã tới nút nào, chứ không phải rằng có gì đó dư thừa.
Vì sao cùng một địa chỉ trên mọi nút lại hoạt động
Mỗi nút sở hữu địa chỉ đó ngay tại chỗ và trả lời thay cho nó, nên máy khách đến được địa chỉ ấy qua đường hầm hiện tại sẽ nhận dịch vụ ở đầu bên kia của đường hầm đó. Không có gì được phối hợp giữa các nút, và không có lưu lượng nào đi từ nút này sang nút khác.
Địa chỉ là một nhãn cục bộ, được lặp lại chứ không phải được sao chép. Mỗi nút chỉ trả lời cho chính nó, và không nút nào chuyển tiếp lưu lượng cho địa chỉ đó thay cho nút khác. Chính điều này giữ một cấu hình máy khách có hiệu lực trong khi các máy chủ vẫn độc lập. Đó cũng là lý do thiết kế không cần bất kỳ phối hợp nào giữa các nút.
Vì thế cùng một cấu hình hoạt động trên mọi máy chủ mà không cần giao thức định tuyến giữa chúng. Đó cũng là lý do thiết kế không nói gì về sức khỏe: địa chỉ tồn tại trên một nút ốm y hệt như trên một nút khỏe, bởi nó gắn với máy chủ chứ không gắn với việc dịch vụ có hữu ích hay không.
Hãy gán nó cho loopback, không phải cho đường hầm
Đặt địa chỉ lên một giao diện loopback tách nó khỏi vòng đời của bất kỳ thiết bị đường hầm nào, nên việc kết nối lại hay nạp lại cấu hình không xóa nó đi. Địa chỉ tồn tại chừng nào máy chủ còn tồn tại.
Một địa chỉ trên lo không phải là bộ lọc. Dịch vụ vẫn phải lắng nghe trên đó, và tường lửa của máy chủ vẫn đánh giá con đường vào thực tế, con đường đến qua giao diện đường hầm. Ai cho rằng loopback nghĩa là chỉ cục bộ cuối cùng sẽ chặn những máy khách hợp lệ hoặc phơi bày thứ họ không định phơi bày.
Hãy làm cho việc gán trở nên bền vững qua cấu hình mạng của máy chủ thay vì thêm lại từ một hook. Một hook cài đặt sẽ không chạy trên nút mà không có đường hầm nào được dựng lên, và địa chỉ dịch vụ không nên phụ thuộc vào hoạt động của đường hầm. Đặt địa chỉ vào cấu hình giao diện mà bản phân phối của bạn quản lý, rồi khởi động lại một lần và kiểm tra. Khởi động lại là phép thử duy nhất sống sót qua một thay đổi cấu hình về sau.
ip address show dev lo | grep 10.250.0.1
ip address add 10.250.0.1/32 dev loĐẩy một tuyến đường và ngụ ý một đích đến
Máy khách cần một tuyến đường máy chủ cho địa chỉ, do máy chủ mà nó kết nối cung cấp. Vì mọi máy chủ đều cung cấp cùng một đích, hồ sơ không đổi khi máy khách di chuyển.
Hãy kiểm tra xem máy khách đã cài gì trước khi đổ lỗi cho dịch vụ.
ip route get 10.250.0.1Với một dịch vụ HTTP, hãy đặt cho địa chỉ một cái tên và một chứng chỉ cho tên đó. IP dùng chung không phải là danh tính, và nó không xóa bỏ việc xác minh TLS, cũng không biện minh cho việc sao chép một khóa riêng tư lên mọi nút. Một cái tên phân giải về địa chỉ dùng chung giữ câu chuyện chứng chỉ bình thường và cho phép bạn giữ danh tính theo từng nút nếu cần.
Những gì địa chỉ dùng chung không thể làm
Nó không cung cấp chuyển đổi khi có sự cố. Nếu nút được chọn chết, địa chỉ chết theo, và máy khách phải kết nối lại ở nơi khác.
Nó không di chuyển một phiên TCP đang sống, vì kết nối mới kết thúc ở một máy chủ khác không biết gì về cái cũ.
Nó không chọn một nút khỏe, không cân bằng tải và không đồng bộ dữ liệu giữa các nút. Mỗi thứ đó là một cơ chế riêng với các kiểu hỏng riêng, và giả vờ rằng mẹo đánh địa chỉ bao trùm chúng chính là cách một thiết kế đơn giản có được tiếng tăm không xứng về khả năng chịu lỗi. Nếu hai đường hầm cùng hoạt động, ý nghĩa của đích trở nên mơ hồ, nên hãy giữ giả định chỉ một đường hầm hoạt động một cách rõ ràng.
Giữ danh tính của dịch vụ cùng với cái tên
Viết ra địa chỉ nghĩa là gì: nó đến dịch vụ trên nút mà máy khách đang kết nối. Câu duy nhất đó ngăn phần lớn sự hiểu lầm mà mẫu thiết kế này thu hút.
Sau đó ghi lại các phần cùng nhau: địa chỉ, giao diện nó sống trên đó, tuyến đường máy chủ đẩy xuống, và cái tên cùng chứng chỉ mà dịch vụ trình bày. Bốn sự thật nhỏ mà một người đọc sau này có thể kiểm chứng, theo thứ tự họ sẽ kiểm tra.
Nếu yêu cầu là một đích ổn định cho dịch vụ cục bộ trên nút, mẫu này phù hợp và gần như không tốn gì.
Nếu yêu cầu là tính sẵn sàng, hãy lên một tầng: một bộ cân bằng tải, một tên dịch vụ có kiểm tra sức khỏe, hoặc một hệ thống điều phối đã biết cách thay thế một nút.
Quyết định điều đó sớm giữ cho địa chỉ dùng chung đúng như nó là, một nhãn tiện lợi, thay vì một thành phần bị lặng lẽ kỳ vọng làm công việc mà nó chưa bao giờ được thiết kế.