OpenVPN iroute và tuyến kernel: cái nào đang thiếu?
Máy chủ đã có tuyến mà lưu lượng vẫn dừng. Một quyết định đường đi thuộc về kernel, quyết định kia thuộc về peer; hãy tìm hiểu cái nào đang thiếu và cần kiểm tra gì.
Một gói tin đến 10.77.20.0/24 phải qua hai quyết định riêng biệt trên máy chủ OpenVPN: hệ điều hành phải chuyển nó cho giao diện VPN, và OpenVPN phải biết tiền tố đó thuộc về client nào đang kết nối. Thiếu tuyến kernel thì gói tin bị bỏ trước khi vào đường hầm, thiếu tuyến peer thì nó bị bỏ sau đó. Nhìn từ LAN phía xa, hai kiểu hỏng trông giống hệt nhau, và để chẩn đoán bạn đang gặp kiểu nào cần một lệnh ở mỗi bên.
Trong đường dữ liệu userspace cổ điển, tuyến kernel đưa gói tin vào tiến trình đường hầm và iroute báo cho tiến trình đó biết peer nào sẽ nhận nó. Không cái nào thay thế cái kia, và một cấu hình chỉ có một trong hai sẽ trông hợp lý cho đến lần ping đầu tiên.
Hai quyết định, không phải một tuyến
Hãy hình dung một liên kết site-to-site trong đó 10.77.20.0/24 nằm sau một client duy nhất. Tuyến kernel của máy chủ, ví dụ ip route add 10.77.20.0/24 dev tun0, gửi các gói tin khớp đến thiết bị đường hầm. Sau đó OpenVPN tra bảng nội bộ của chính nó, được dựng từ các mục iroute trong thư mục cấu hình client, để quyết định kết nối peer nào sẽ nhận chúng. Không có tuyến kernel thì gói tin không bao giờ tới tiến trình, còn không có tuyến peer thì nó tới tiến trình nhưng không đi đâu cả.
Sự tách đôi đó dễ bị quên, vì một dòng tuyến trong hồ sơ client có thể trông như làm cả hai việc. Không phải vậy: đẩy tuyến cho client biết phải gửi gì qua đường hầm, trong khi iroute cho máy chủ biết ai sở hữu một dải địa chỉ nằm sau client. Chúng nằm ở các tệp khác nhau, được hai phía khác nhau đọc, và hỏng theo hai hướng ngược nhau.
iroute nằm ở đâu và nó nói gì
Mục này nằm trong một tệp riêng cho từng client, được đặt tên theo common_name của client, trong thư mục client-config-dir, với dạng iroute 10.77.20.0/24. Việc tên tệp phải khớp không phải chuyện hình thức: OpenVPN tra danh tính đã xác thực và đọc tệp có đúng tên đó, nên một tệp tên site-a chỉ có hiệu lực với client có common name là site-a. Thêm ccd-exclusive nếu muốn từ chối thẳng những client không có tệp như vậy, đây là thiết lập đúng khi mọi client đều là cổng site. Giữ một tệp cho mỗi cổng và đặt tên theo subject của chứng chỉ mà bạn thực sự cấp.
Hãy kiểm tra mục này từ phía máy chủ trước khi đổ lỗi cho LAN phía xa. Tệp trạng thái liệt kê các client đang kết nối kèm common name của chúng, và máy chủ chạy với --verb 4 sẽ ghi nhật ký việc cài đặt iroute khi peer kết nối. Nếu không có gì xuất hiện lúc kết nối, tệp nằm sai thư mục hoặc đặt tên sai danh tính.
Cái bẫy: có tệp nhưng sai danh tính
Một iroute trông đúng nhưng gắn nhầm peer làm mất thời gian hơn cả tệp bị thiếu, vì mọi thứ trên đĩa đều trông ổn. Đổi tên chứng chỉ, trùng common name, và username-as-common-name làm thay đổi danh tính hiệu lực đều tạo ra tình huống này. Hãy kiểm tra máy chủ đã xác thực danh tính nào thay vì danh tính bạn mong đợi: đầu ra trạng thái là nguồn đáng tin, còn tên tệp chỉ là khóa tra cứu.
Một tuyến cũng có thể sống lâu hơn chủ của nó. Tuyến tĩnh và các mục iroute mô tả một tiền tố chứ không phải bảo đảm tính sẵn sàng, nên lưu lượng có thể vẫn tiếp tục được định tuyến về một peer hiện đang ngắt kết nối.
Hoàn tất đường đi phía sau peer
Quyền sở hữu peer là giữa đường chứ không phải cuối đường. Client phải chuyển tiếp gói tin từ đường hầm vào LAN của nó, nghĩa là bật IP forwarding trên máy đó và có quy tắc tường lửa cho phép đi qua. Các máy trong LAN phía xa cần đường về cho địa chỉ đường hầm: hoặc một tuyến trỏ ngược về cổng, hoặc một thiết kế NAT có chủ đích ở phía client. Hãy xác nhận thiết lập chuyển tiếp trên client bằng sysctl net.ipv4.ip_forward thay vì giả định giá trị mặc định của bản phân phối.
Nếu các client VPN khác cũng phải tới được mạng con đó, cách bố trí lại lớn hơn: máy chủ cần client-to-client, và các client đó cần định tuyến tiền tố qua đường hầm. Không điều nào trong số đó được ngụ ý bởi bảng tuyến của chính máy chủ.
Hãy kiểm chứng một đích từ một nguồn thật thay vì từ chính máy chủ. Một lệnh ping từ máy LAN không liên quan tới một máy sau client sẽ kiểm tra đường về, quy tắc chuyển tiếp và quyền sở hữu peer trong một động tác, trong khi một handshake thành công chỉ chứng minh danh tính. Sau đó hãy ngắt kết nối peer sở hữu và ghi lại tuyến phản ứng ra sao, vì câu trả lời đó chính là kiểu hỏng của bạn.