Hai máy khách OpenVPN trên một cổng Linux: chia chính sách
Cả hai đường hầm đều có thể dựng lên trong khi mỗi máy khách dùng một. Quyết định theo nguồn, cấp cho mỗi nhóm bảng riêng, rồi cho phép và dịch trên thiết bị đã chọn.
Hai daemon OpenVPN đều có thể báo cáo một đường hầm thành công trong khi cổng gửi mọi máy khách qua cùng một đường. Không có gì trong bắt tay quyết định đường hầm nào một máy khách dùng; nhân quyết định, từng gói một, bằng cách duyệt các quy tắc chính sách rồi tới bảng mà mỗi quy tắc nêu tên. Nhìn theo cách đó, cấu hình không còn là về các tùy chọn OpenVPN mà trở thành một ma trận định tuyến với hai chủ sở hữu.
Nhân quyết định, không phải daemon
Một gói được chuyển tiếp đến trên giao diện LAN và mã định tuyến đánh giá danh sách quy tắc theo thứ tự ưu tiên. Quy tắc đầu tiên mà bộ chọn khớp sẽ nêu tên một bảng, và các tuyến của bảng đó chọn thiết bị ra. Nếu bảng không có tuyến khớp, việc tra cứu tiếp tục sang quy tắc kế tiếp, và chính chi tiết này khiến một thiết lập làm dở thất bại âm thầm thay vì ồn ào.
Tiến trình đường hầm không có tiếng nói trong lượt duyệt đó. Nó tạo một giao diện và có thể cài tuyến, nhưng gói của một máy khách cụ thể có vào giao diện đó hay không phụ thuộc hoàn toàn vào bảng mà nó được gửi tới. Vì thế hai đường hầm có tuyến nhập giống nhau sẽ cạnh tranh, và bên ghi sau cùng thắng cho mọi người. Đó là lý do một thiết lập có thể trông cân bằng trong các tệp cấu hình mà vẫn gửi mọi máy khách qua một daemon.
Cấp cho mỗi thực thể bộ tài nguyên riêng
Hãy bắt đầu từ tên, vì tên dùng lại là cách hai thực thể vô tình chia sẻ trạng thái. Gán thiết bị đường hầm riêng, tệp cấu hình riêng, thông tin đăng nhập riêng và đơn vị dịch vụ riêng. Ghi điểm cuối bên ngoài và địa chỉ đường hầm của từng thực thể vào cùng bảng với ma trận chính sách, để một thay đổi về sau có một chỗ để nhìn.
dev tun-office
route-nopull
pull-filter ignore "redirect-gateway"
dev tun-lab
route-nopull
route-nopull giữ các tuyến do máy chủ đẩy ra ngoài bảng cục bộ, và đó chính là điều bạn muốn khi các bảng chính sách phải rõ ràng. Việc một máy chủ nhất định có đẩy tùy chọn redirect-gateway hay không, và phiên bản máy khách của bạn có hỗ trợ dạng bộ lọc hay không, nên kiểm tra trong hướng dẫn thay vì giả định.
Viết ma trận: nguồn, bảng, thiết bị
Với mỗi nhóm máy khách, thêm một quy tắc chọn bảng theo địa chỉ nguồn, rồi đặt đường đi mong muốn vào bảng đó:
ip rule add from 10.8.1.0/24 lookup 100 priority 1000
ip rule add from 10.9.1.0/24 lookup 200 priority 1000
ip route add default dev tun-office table 100
ip route add default dev tun-lab table 200
Bảng cần các tuyến đích mà nhóm nên có, cộng với mọi ngoại lệ cục bộ hoặc quản trị giữ cho cổng dùng được. Một bảng chỉ chứa tuyến mặc định là chính sách đường hầm đầy đủ cho nhóm đó, có thể hoàn toàn đúng, nhưng đó nên là một quyết định chứ không phải một thiếu sót.
Lưu lượng của chính đường hầm không nằm trong nhóm máy khách
Các gói mã hóa của mỗi daemon phát sinh ngay trên cổng, hướng tới đối tác bên ngoài. Một quy tắc chỉ khớp với tiền tố nguồn của máy khách sẽ để yên các gói đó, và đó là lý do các quy tắc giới hạn theo nguồn an toàn hơn các quy tắc khớp với mọi thứ. Một quy tắc không có bộ chọn có thể bắt lấy chính lưu lượng của đường hầm và gửi nó trở lại qua một đường hầm, và khi đó kết nối thất bại theo cách trông giống sự cố của nhà cung cấp.
Giữ phiên quản trị cục bộ và đường đi của lớp dưới một cách rõ ràng bên ngoài các bảng chính sách. Ghi các ngoại lệ đó bên cạnh ma trận; chúng là một phần của thiết kế, không phải một lối vòng phải phát hiện lại trong một sự cố.
Chọn một đường đi không phải là cho phép
Quyền chuyển tiếp là quyết định thứ hai được đưa ra muộn hơn trên đường đi. Một quy tắc tường lửa chấp nhận các gói ra qua đường hầm thứ hai không làm mã định tuyến chọn nó, và một bảng đúng không cấp quyền chuyển tiếp. Cả hai đều phải tồn tại, và một phép thử chỉ chứng minh một trong hai sẽ đánh lừa bạn về cái kia. Khi một nhóm hoạt động còn nhóm kia không, hãy kiểm tra hai bước đó riêng rẽ thay vì viết lại các bảng.
Dịch nguồn là quyết định thứ ba, và nó nên được giới hạn trong nhóm nguồn và thiết bị đường hầm thực sự mang nó. Thêm một chuỗi riêng cho hai thực thể thay vì xóa sạch chuỗi postrouting, vì các dịch vụ không liên quan có thể có mục ở đó và việc xóa sạch sẽ âm thầm gỡ chúng.
Điều gì xảy ra khi một đường hầm sập
Hãy quyết định hành vi khi thất bại trước. Khi một bảng đường hầm mất tuyến, việc tra cứu rơi xuống quy tắc kế tiếp, và lưu lượng của nhóm tiếp tục qua đường hầm kia hoặc qua liên kết lên thông thường mà không có lỗi nào. Nếu điều đó không chấp nhận được, hãy thêm một quy tắc kết thúc với số ưu tiên thấp hơn trả về kết quả không thể tới cho nguồn đó, để mất mát hiện ra thay vì bị hấp thụ.
Gửi một yêu cầu mới từ mỗi nhóm nguồn và ghi lại bốn sự thật: bảng được chọn, thiết bị ra, nguồn đã dịch và liệu phản hồi có quay lại cùng đường hay không. Sau đó hạ một đường hầm xuống và lặp lại. Hai thiết bị TUN trong danh sách giao diện chứng minh cả hai daemon đã khởi động; chúng không nói gì về việc một máy khách cụ thể đã dùng cái nào. Lần chạy thứ hai, với một đường hầm ít hơn, mới là lần cho thấy quy tắc dự phòng của bạn có làm đúng điều bạn định.