Hai ứng dụng VPN chạy cùng lúc không tạo ra một đường hầm lồng nhau; chúng tạo ra hai đường hầm và một cuộc tranh cãi về định tuyến. Một đường hầm lồng nhau tồn tại khi kết nối của ứng dụng bên trong tới máy chủ của chính nó được chính đường hầm bên ngoài mang, và đó là một cách sắp đặt được xây dựng có chủ đích. Làm đúng thì máy chủ bên trong thấy địa chỉ của máy chủ bên ngoài; làm sai thì một ứng dụng lặng lẽ kết nối lại vòng qua ứng dụng kia. Ba điều kiện quyết định việc lồng nhau là thật hay tình cờ.

Ba điều kiện quyết định việc lồng nhau

Điều kiện thứ nhất là điểm cuối nào cần đường đi nào. Hãy nêu địa chỉ của máy chủ bên trong, nêu địa chỉ của máy chủ bên ngoài, và nói rõ rằng máy chủ bên trong chỉ đến được qua đường hầm bên ngoài. Mọi thứ còn lại suy ra từ câu đó, kể cả tuyến nào thuộc bảng nào.

Điều kiện thứ hai là bạn có nhìn thấy đường đi ở từng lớp hay không. Nếu bạn không thể hỏi nhân hệ điều hành tuyến nào sẽ được dùng cho một đích cụ thể, bạn đang suy ra chuỗi từ một IP thoát cuối cùng, và đó chính là bằng chứng không thể phân biệt việc lồng nhau với sự trùng hợp.

Điều kiện thứ ba là điều gì xảy ra khi đường hầm bên ngoài sập. Đường hầm bên trong có thể dừng theo nó, kết nối lại qua mạng thường, hoặc bị chặn cho tới khi đường đi bên ngoài trở lại, và cả ba đều là chính sách có thể bảo vệ được. Chúng không phải cùng một chính sách, và hành vi mặc định của hầu hết ứng dụng là cái thứ hai. Một ứng dụng kết nối lại điểm cuối của mình qua mạng vật lý trong khi vẫn hiển thị kết nối khỏe mạnh là cách phổ biến nhất để một chuỗi có chủ đích lặng lẽ trở thành hai đường hầm không liên quan.

Điều kiện thứ nhất: điểm cuối nào cần đường đi nào

ip route get 203.0.113.10 trả lời trực tiếp câu hỏi đó: nó in ra tuyến, địa chỉ nguồn và giao diện mà nhân hệ điều hành sẽ dùng cho đích đó ngay lúc này.

Chạy lệnh này cho máy chủ bên trong trước khi ứng dụng bên trong khởi động và một lần nữa sau đó, rồi so sánh. Nếu câu trả lời đổi từ giao diện vật lý sang giao diện của đường hầm bên ngoài, việc lồng nhau là thật tại thời điểm đó. Nếu nó không đổi, ứng dụng bên trong đang kết nối trực tiếp, bất kể bảng điều khiển nói gì. Lặp lại cho địa chỉ của máy chủ bên ngoài, địa chỉ này vẫn phải được phân giải qua giao diện vật lý, vì một tuyến bắt cả hai điểm cuối một cách đệ quy chính là sự cố đưa máy ra khỏi mạng hoàn toàn.

Điều kiện thứ hai: kiểm tra đường đi ở từng lớp

Chọn tuyến trên một ứng dụng hiện đại không chỉ là bảng chính. Các quy tắc chính sách có thể gửi gói tin được đánh dấu sang bảng khác, ứng dụng có thể gắn socket của mình vào một giao diện, và một container hay không gian tên có bảng riêng. ip rule và ip route show table all là cách tìm ra cơ chế nào trong số đó đang có hiệu lực.

Một ứng dụng đặt SO_MARK trên socket của chính nó, hoặc được cấu hình để gắn vào một thiết bị cụ thể, sẽ bỏ qua tuyến mặc định mà bạn tưởng đã sắp đặt. Đó là một tính năng chứ không phải lỗi, và nó có nghĩa là kiểm tra đáng tin cậy duy nhất là kiểm tra chạy trong cùng không gian tên với ứng dụng. Nếu các ứng dụng chạy trong container, hãy chạy kiểm tra bên trong các container đó thay vì trên máy chủ.

Điều kiện thứ ba: điều gì xảy ra khi đường hầm bên ngoài sập

Hành vi khi có sự cố cần một quyết định, không phải một giá trị mặc định. Hãy viết ra điều gì phải xảy ra với đường hầm bên trong khi đường hầm bên ngoài biến mất, rồi buộc các ứng dụng làm đúng như vậy.

Các lựa chọn rất cụ thể. Dừng ứng dụng bên trong khi đường đi bên ngoài biến mất cho một chuỗi sạch và một sự cố rõ ràng. Để nó kết nối lại trực tiếp cho tính sẵn sàng và lặng lẽ gỡ bỏ thuộc tính mà chuỗi được xây dựng vì nó. Chặn cho tới khi đường đi bên ngoài trở lại là lựa chọn nghiêm ngặt nhất và phiền nhất khi vận hành, vì mỗi lần rung của đường hầm bên ngoài trở thành một sự cố nhìn thấy được.

Hãy thử cả ba với lưu lượng vô hại và một sự cố cố ý của đường hầm bên ngoài, vì đọc cấu hình sẽ không cho bạn biết bạn đang có cái nào. Giết đường hầm bên ngoài, quan sát ứng dụng bên trong làm gì, và kiểm tra lại tuyến trong khi nó đang sập. Sau đó đưa đường hầm bên ngoài trở lại và xác nhận chuỗi hình thành lại thay vì để ứng dụng bên trong ở trên tuyến trực tiếp mà nó đã chọn trong lúc đó.

Điều mà chuỗi không cho bạn

Các lớp thêm vào thêm điểm cuối, khóa và chế độ lỗi; chúng không thêm bất kỳ bảo đảm ẩn danh nào và chúng không làm cho nhà vận hành bên ngoài không thể thấy rằng có một đường hầm tồn tại. Mọi khẳng định về việc lồng nhau bảo vệ khỏi điều gì đều phải nêu tên người quan sát mà nó bảo vệ chống lại.

Kết quả là một tài liệu ngắn chứ không phải một kết nối đang chạy: điểm cuối nào dùng đường đi nào, điều gì xảy ra khi sự cố bên ngoài, và ba lệnh hiển thị trạng thái hiện tại. Tài liệu của strongSwan về chuyển tiếp là một tham chiếu hữu ích về cách lưu lượng đường hầm được chuyển tiếp giữa các giao diện trên một máy chủ Linux. Chạy lại các kiểm tra sau mỗi lần cập nhật ứng dụng, vì các giá trị mặc định đã tạo ra chuỗi của bạn không phải là một hợp đồng. Một đường hầm lồng nhau mà bạn không thể kiểm tra là một tin đồn có đèn trạng thái.

Bài viết liên quan