Hai biểu tượng kết nối xanh trông như một phép so sánh và thường chỉ là sự trùng hợp. Nếu yêu cầu kiểm thử có thể dùng bất kỳ đường hầm nào trong hai đường, kết quả chỉ mô tả được một trong hai trong trường hợp tốt nhất và không mô tả được cái nào trong trường hợp xấu nhất. Cho mỗi quan sát một bối cảnh mạng, một đích đến dự kiến và một kỳ vọng được viết ra trước khi bài kiểm thử chạy. Trên một máy Linux do bạn tự quản lý, các không gian tên mạng có tên là cách rẻ nhất để mua lấy sự tách biệt đó.

Hai đèn xanh không phải là một phép so sánh

Không gian tên tách riêng bảng định tuyến, giao diện và trạng thái của ngăn xếp mạng, nên một yêu cầu bắt đầu bên trong cái này không thể lặng lẽ mượn đường hầm của cái kia. Thứ nó không tách riêng là CPU, một liên kết vật lý đi lên hoặc tiến trình phân giải tên chạy trên máy chủ. Chính khoảng trống cuối cùng này là nơi phần lớn các bài kiểm thử như vậy thất bại mà không ai nhận ra. Một truy vấn rời khỏi không gian tên và hỏi trình phân giải của máy chủ sẽ trả về câu trả lời không có liên hệ nào với đường hầm đang được kiểm thử.

Quy trình này giả định đã có hai không gian tên kiểm thử được chuẩn bị và phê duyệt, với kết nối bên ngoài hoạt động và các ứng dụng khách được hỗ trợ. Nó không tạo ra gì, không đăng ký gì và không thay thế cấu hình nào. Máy ảo riêng vẫn là lựa chọn trung thực khi ứng dụng khách cần một phiên màn hình đầy đủ hoặc từ chối chạy bên ngoài nó.

Cố định kỳ vọng trước lần chạy đầu tiên

Quyết định cho từng bối cảnh xem thành công trông như thế nào: trình phân giải, tên dịch vụ, địa chỉ mong đợi và hành vi cần có khi đường hầm sập. Giữ những giá trị đã hoạch định trong cột riêng của chúng, vì một bản ghi trộn lẫn kế hoạch và quan sát chỉ là hư cấu có đóng dấu thời gian. Danh sách kiểm tra bên dưới chính là hình thức mà bản ghi cần, và mọi hàng phải điền được trước kết nối đầu tiên.

TunnelOwnerClient interface inside the namespaceProof commandRequired on disconnect
vpn-athe identity that owns profile A, recorded by nameits own tun device, never the host'sip -n vpn-a -4 route get 10.55.10.20traffic stops; no host-side fallback
vpn-ba separate owner, even when both run on one boxits own tun device in its own namespaceip -n vpn-b -4 route get 10.55.20.20verified separately, never inferred from A

Phần dây của trình phân giải xứng đáng có hàng riêng trong bản ghi đó, vì đây là trường dễ nói dối nhất. Các tệp gắn với không gian tên, như /etc/netns/vpn-a/resolv.conf xuất hiện ở những đường dẫn quen thuộc khi một lệnh chạy bên trong không gian tên, đúng như tài liệu tham chiếu của iproute2 về không gian tên mô tả, nhưng cấu hình chuyển đổi dịch vụ tên và bất kỳ trình phân giải cục bộ nào nó khởi động vẫn có thể kéo một truy vấn trở lại máy chủ.

Mỗi lần một đường hầm, cái còn lại bị ngắt

Kết nối A qua chủ sở hữu hiện có của nó trong khi B vẫn tắt, rồi kiểm tra chính sách, tuyến đường và đường đi được chọn từ bối cảnh quản trị. Ba trong số các lệnh bên dưới chỉ đọc trạng thái; chỉ lệnh cuối liên hệ với một dịch vụ tên, và không lệnh nào gửi yêu cầu ứng dụng.

sudo ip -n vpn-a -4 rule show
sudo ip -n vpn-a -4 route show table all
sudo ip -n vpn-a -4 route get 10.55.10.20
sudo ip netns exec vpn-a getent ahostsv4 svc-a.lab.internal

Tra cứu tuyến đường trả lời một câu hỏi giả định về đích đến, nên nó không thể cho thấy dịch vụ chấp nhận lưu lượng. Giữ hai loại bằng chứng đó ở các cột riêng, vì một tuyến đường khỏe mạnh bên cạnh một kết nối bị từ chối là kết quả có thật và thường gặp. Sau đó gửi một yêu cầu vô hại đã được cho phép bằng ứng dụng thật, khởi chạy trong bối cảnh của A với tư cách người dùng thường không có đặc quyền của nó, giữ nguyên việc xác thực chứng chỉ và xác thực ứng dụng, và ghi lại kết quả cùng địa chỉ nguồn mà dịch vụ đã thấy. Ngắt A qua chủ sở hữu của nó và lặp lại toàn bộ đường cơ sở cho B, ghi lại mọi thay đổi cấu hình bạn thực hiện, nếu không hai đường cơ sở sẽ không còn so sánh được.

Cả hai cùng bật, rồi từng cái tắt một

Trạng thái ổn định là phần dễ. Khi cả hai đường hầm đã kết nối, lặp lại truy vấn và yêu cầu ứng dụng của từng bối cảnh, rồi cắt một đường hầm và kiểm tra cái còn lại. Kết nối lại theo thứ tự ngược khi chính thứ tự kết nối là câu hỏi.

sudo ip netns exec vpn-a tcpdump -ni any port 443 -c 5
sudo ip netns exec vpn-b getent ahostsv4 svc-b.lab.internal
sudo ip -n vpn-b -4 route get 10.55.20.20

Việc bắt gói giải quyết những tranh luận mà kết quả ứng dụng không thể giải quyết: nó cho thấy yêu cầu đã đi ra qua giao diện bạn mong đợi hay qua một thứ hoàn toàn khác. Với mỗi lần chuyển trạng thái, ghi lại hành động của chủ sở hữu, dấu thời gian, kết quả tuyến đường, kết quả tên và kết quả ứng dụng. Sau đó kiểm tra yêu cầu đóng an toàn bên trong không gian tên bị ảnh hưởng, vì cách ly không phải là công tắc ngắt. Một không gian tên giữ hai đường hầm tách nhau; nó không ngăn đường nào mang lưu lượng khi hồ sơ của nó nói rằng lưu lượng phải dừng.

Bản ghi này có thể và không thể khẳng định điều gì

Một lần đạt chứng minh những quan sát đó cho cách bố trí này, trên máy chủ này, tại thời điểm đó. Nó không nói gì về hai ứng dụng khách dùng chung một bảng định tuyến màn hình, và cũng không nói gì về thông lượng khi cả hai đường hầm đang mang tải. Đó là những câu hỏi riêng với bài kiểm thử riêng, và một phép so sánh chỉ tốt bằng bối cảnh gắn với từng hàng.

Giữ những thất bại trong bản ghi bên cạnh những thành công, có ghi rõ đường hầm nào đang bật lúc đó. Một trang sạch sẽ giấu trạng thái tại thời điểm đo còn tệ hơn một trang xấu xí cho thấy nó. Thứ khiến bản ghi dùng lại được về sau là bối cảnh, không phải điểm số.

Hai đường hầm trên một máy có thể được so sánh một cách trung thực, nhưng chỉ trong đúng số bối cảnh mà bạn thực sự kiểm soát. Bất cứ điều gì vượt ra ngoài đó chỉ là một điều ước với một biểu tượng xanh bên cạnh.

Bài viết liên quan