OpenVPN route-nopull thực sự ngăn máy chủ đẩy đi những gì
route-nopull bỏ các tuyến và tùy chọn DHCP được đẩy xuống, không bỏ bắt tay. Hãy chọn giữa nó, pull-filter hay không dùng gì, rồi tự thêm các tuyến.
Bạn đặt route-nopull trong hồ sơ máy khách để đường hầm không nuốt tuyến mặc định của mình, và giờ mạng con văn phòng không truy cập được trong khi máy khách vẫn báo đã kết nối. Cả hai quan sát đều đúng, và không có gì hỏng. Cờ này bảo máy khách bỏ qua các tuyến và mục DHCP do máy chủ đẩy xuống, một chỉ dẫn hẹp hơn nhiều người vẫn tưởng khi thêm nó vào. Còn lại là một đường hầm đang chạy nhưng không có ý kiến gì về việc đích nào nên dùng nó.
Khoảng trống đó chính là toàn bộ quyết định mà bài viết này bàn tới. Hoặc máy chủ mô tả mạng, hoặc máy khách làm việc đó, và cờ này giao việc ấy cho máy khách mà không tự làm giúp bạn phần nào.
Cờ này tắt những gì vào lúc kết nối
Một máy khách OpenVPN ở chế độ nhận cấu hình thường lấy từ máy chủ một gói sau khi xác thực: các tuyến, chuyển hướng cổng mặc định, máy chủ DNS và vài chỉ thị tinh chỉnh. Khi route-nopull có hiệu lực, máy khách vẫn chấp nhận phiên, vẫn kiểm tra chứng chỉ, vẫn thương lượng mật mã và keepalive, và vẫn bật giao diện lên. Thứ nó bỏ đi là việc áp dụng các dòng route và dhcp-option được đẩy xuống, kể cả DNS.
Sự khó hiểu đến từ một đèn xanh nằm cạnh một ứng dụng đã chết. Đường hầm tồn tại; ánh xạ từ các đích tới đường hầm đó thì không. Không thứ gì trong bảng trạng thái máy khách phân biệt «đã kết nối và đang định tuyến» với «đã kết nối mà không làm gì», vì theo góc nhìn của đường hầm cả hai là cùng một trạng thái.
Vì sao một đường hầm còn sống vẫn có thể không định tuyến gì
Giao diện xuất hiện với địa chỉ riêng của nó và, trên một liên kết điểm-điểm, thường không có gì cụ thể hơn một tuyến máy chủ tới đầu bên kia. Một mạng con riêng chỉ trở nên truy cập được khi có tuyến trỏ tới giao diện đó với tiền tố đúng, và khi việc đẩy bị tắt thì tuyến ấy không bao giờ đến. Hồ sơ tải về cũng thường không giúp được gì, vì nó được viết với giả định máy chủ sẽ cung cấp đúng thông tin này. Đó là lý do giao diện có thể trông khỏe mạnh trong khi mạng con vẫn tối.
Vì vậy đọc hồ sơ chứng minh được rất ít. Thay vào đó hãy đọc trạng thái đang chạy trên máy đã kết nối:
ip addr show tun0
ip route show dev tun0
ip route get 10.20.5.10
Một địa chỉ không có tuyến mạng con trong lệnh thứ hai chính là dấu hiệu của vấn đề này. Lệnh thứ ba trả lời câu hỏi người dùng thực sự quan tâm, vì nó báo giao diện mà nhân hệ điều hành sẽ chọn cho một đích cụ thể, chứ không phải danh sách bạn hy vọng nó dùng. Nếu nó trả lời qua liên kết vật lý của bạn thì đường hầm hoàn toàn không nằm trên đường đi.
Phân giải tên thất bại vì một lý do liên quan chứ không phải lý do riêng. Các mục dhcp-option DNS được đẩy xuống cũng bị chính cờ này bỏ qua, nên truy vấn cho máy chủ nội bộ đi tới bất kỳ trình phân giải nào mà mạng cục bộ cung cấp. Trình phân giải đó không có vùng cho văn phòng, nên truy vấn thất bại hoặc trả về một câu trả lời công khai, và lỗi trông như vấn đề máy chủ trong khi thực ra là vấn đề cấu hình máy khách. Thử một địa chỉ trước một tên là cách tách hai khả năng.
Chọn giữa cờ này và bộ lọc tiền tố
Hai lựa chọn giải quyết hai dạng khác nhau của cùng một phàn nàn, và chọn dở chính là thứ tạo ra trạng thái kết nối mà vô dụng. Một cái thay toàn bộ chính sách được đẩy xuống, cái kia sửa nó theo tiền tố. Bảng dưới đây tóm gọn, và đoạn sau đó nói về phần khiến người ta dễ sập bẫy.
| Setting | What the client keeps | Reasonable when |
|---|---|---|
| no option | every pushed route and DHCP entry | the server's view of the network is correct |
route-nopull | the session, none of the pushed routing or DNS | you will write the full local policy yourself |
pull-filter | everything except lines matching your prefixes | the push is nearly right and one or two lines are wrong |
pull-filter là bộ khớp tiền tố với ba động từ, nên nó có thể nhận cả một họ dòng, lặng lẽ bỏ qua chúng, hoặc từ chối thẳng kết nối khi một tiền tố xuất hiện. Hành vi cuối cùng mới đáng để biết: một quy tắc từ chối biến bất đồng chính sách thành một lần bắt tay thất bại thay vì một lần bỏ sót lặng lẽ. Sách hướng dẫn OpenVPN 2.6 liệt kê các tiền tố được chấp nhận và ngữ nghĩa chính xác của từng động từ.
Một con đường trung dung phổ biến là chỉ từ chối redirect-gateway và để các tuyến văn phòng cùng DNS đến như mong muốn. Cách này giữ cho việc đẩy vẫn hoạt động với những phần máy chủ hiểu rõ hơn bạn, đồng thời ngăn đúng dòng sẽ chiếm lấy tuyến mặc định của bạn.
Tự thêm tuyến và trình phân giải
Nếu giữ cờ này, hồ sơ phải nói ra điều máy chủ lẽ ra đã nói. Các chỉ thị route phía máy khách được áp dụng sau khi kết nối được thiết lập, nên chúng chạy song song với cờ chứ không bị cờ chặn. Hãy đặt chúng trong hồ sơ, không đặt trong dòng lệnh tương tác, nếu không lần kết nối lại tiếp theo sẽ không tái tạo được trạng thái đang chạy.
route-nopull
route 10.20.0.0 255.255.0.0
dhcp-option DNS 10.20.0.53
Dòng DNS nằm ở vị trí khó xử: nó là chỉ thị phía máy khách, nhưng vài máy khách chỉ áp dụng nó qua tích hợp DNS của nền tảng, thứ có thể ghi đè nó khi liên kết thay đổi. Trên một máy chủ systemd, đặt trình phân giải trực tiếp trên giao diện đường hầm dễ đoán hơn là hy vọng máy khách thắng cuộc tranh giành mức ưu tiên:
resolvectl dns tun0 10.20.0.53
resolvectl domain tun0 ~corp.example.com
Miền định tuyến quan trọng ngang với địa chỉ. Nếu thiếu nó, truy vấn cho các tên công khai cũng có thể bị gửi tới trình phân giải nội bộ, và bất kỳ trình phân giải nội bộ nào từ chối đệ quy sẽ làm hỏng việc duyệt web trong khi vùng riêng vẫn chạy. Có nó thì chỉ các tên dưới hậu tố đó được định tuyến tới trình phân giải của đường hầm, còn mọi thứ khác đi theo liên kết vật lý.
Kiểm tra kết quả: địa chỉ, tên và đường ra bên ngoài
Ba phép thử tách các khả năng hỏng. Lấy địa chỉ riêng theo IP, sau đó cùng máy chủ ấy theo tên, rồi một trang công khai bình thường. IP chạy mà tên hỏng thì chỉ vào trình phân giải; IP hỏng mà tên chạy thì chỉ vào định tuyến; cả hai cùng hỏng thường có nghĩa đường hầm không nằm trên đường đi.
Sau đó hãy nhìn ra ngoài thay vì vào trong. Tuyến riêng của điểm cuối đường hầm phải sống sót qua thay đổi, và mọi việc chặn lỗi phải được giới hạn trong đường hầm mà không bắt lấy điểm cuối. Một máy khách vẫn duyệt web sau khi đường hầm rơi là vấn đề chính sách chứ không phải định tuyến, và nó sẽ không hiện ra trong bất kỳ phép thử nào ở trên.
Hãy ghi danh sách cuối cùng vào tài liệu của hồ sơ: các tuyến, trình phân giải, các miền và lý do mỗi thứ tồn tại. Một lần kết nối lại tái tạo đúng bảng đó là bằng chứng duy nhất rằng chính sách cục bộ đã đầy đủ. Nếu ứng dụng vẫn hỏng khi đường hầm đang lên và cả ba phép thử đều qua, nơi cần xem tiếp theo là nhóm vấn đề kết nối mà ngoại tuyến chứ không phải những chứng chỉ đã được xác minh.