Không gian tên mạng của Linux cho VPN: những gì chúng không cô lập
Không gian tên di chuyển giao diện, tuyến đường và socket, không phải tệp hay tài khoản. Đây là những gì VPN trong netns riêng bao phủ, và nơi lưu lượng vẫn thoát ra.
Khởi động VPN bên trong không gian tên riêng của nó, chạy một ứng dụng ở đó, và lưu lượng vẫn đi ra theo tuyến của máy chủ. Không có gì hỏng: không gian tên chỉ quản lý các tiến trình đi vào nó, và rò rỉ đến từ một tiến trình chưa bao giờ đi vào. Giao diện, địa chỉ, tuyến, quy tắc tường lửa và socket là những gì không gian tên sở hữu. Tệp, tài khoản và dịch vụ đang chạy thì không, và đó là nguồn gốc của hầu hết bất ngờ.
Không gian tên sở hữu gì, và socket sinh ra ở đâu
Chuyển một giao diện vào không gian tên và máy chủ mất nó; dựng một đường hầm bên trong và máy chủ không thể thấy nó. Đó là cơ chế của VPN giới hạn trong không gian tên: thiết bị và các tuyến trỏ tới nó sống trong một ngữ cảnh mà chỉ những tiến trình được chọn mới chạm tới. Máy chủ giữ tuyến mặc định của mình, nên mọi thứ bên ngoài vẫn nguyên vẹn.
Với WireGuard, ngữ cảnh tạo ra quan trọng ngang với vị trí hiện tại: socket UDP được gắn trong không gian tên nơi giao diện được tạo, kể cả sau khi thiết bị chuyển đi nơi khác. Các gói được mã hóa đi theo bảng định tuyến nào phụ thuộc vào nơi sinh đó. Khi socket ở lại trong một ngữ cảnh không có tuyến tới đối tác, giao diện sẽ tra cứu và bắt tay không bao giờ đi ra. Hãy kiểm tra nơi sinh của nó, rồi vị trí hiện tại.
Những gì không gian tên không cô lập
Không gì ở đây tách hệ thống tệp, tài khoản hay bí mật, và không ranh giới nào trong số đó xuất hiện vì bạn đã tạo một không gian tên. Cấu hình trình phân giải là một tệp, nên tiến trình bên trong vẫn có thể đọc một thiết lập trỏ tới trình phân giải của máy chủ và gửi truy vấn của nó ra ngoài theo tuyến mà điều đó hàm ý. Một ứng dụng trao yêu cầu cho một nhà môi giới hoặc dịch vụ hệ thống đang chạy sẽ liên quan tới một tiến trình trong ngữ cảnh hoàn toàn khác. Cả hai đều là những yêu cầu mà ranh giới chưa bao giờ được thiết kế để trả lời.
Giải pháp là một tệp cho mỗi không gian tên tại /etc/netns/<name>/resolv.conf, hoặc một bind mount của tệp đã chuẩn bị, trỏ tới trình phân giải có thể tiếp cận từ bên trong. Chỉnh sửa /etc/resolv.conf trên máy chủ không thay đổi gì mà không gian tên nhìn thấy.
Việc đặt tiến trình chính là kiểm soát
Sự cô lập bạn nhận được đúng là sự cô lập của các tiến trình bạn khởi động bên trong. Một shell khởi động qua trợ giúp exec của không gian tên, và mọi thứ nó sinh ra, ở lại bên trong; một ứng dụng máy tính để bàn khởi chạy từ phiên của máy chủ thì không. Tạo ngữ cảnh, chuyển thiết bị, rồi chứng minh cả hai phía:
ip netns add vpn1
ip link set wg0 netns vpn1
ip netns exec vpn1 wg show
wg show
Đọc wg show thứ nhất từ bên trong không gian tên và thứ hai từ máy chủ, và kỳ vọng chỉ một trong hai liệt kê đối tác. Nếu cả hai đều liệt kê, thiết bị chưa từng được chuyển; nếu không cái nào, nó đã đi nơi khác. Khi trình khởi chạy là trình quản lý dịch vụ, tệp unit là thứ cần sửa, không phải lối tắt trên máy tính để bàn. Một unit không có thiết lập không gian tên sẽ khởi động daemon trong ngữ cảnh của máy chủ và âm thầm vô hiệu hóa thiết kế.
Kiểm tra từ ngữ cảnh của ứng dụng
Chạy kiểm tra với cùng tệp nhị phân và cùng người dùng mà ứng dụng dùng, bên trong không gian tên. Bao gồm DNS và cả hai họ địa chỉ, vì một tuyến IPv6 bạn chưa từng nghĩ tới là lối thoát phổ biến. Một thử nghiệm từ shell của chính bạn chỉ chứng minh rằng shell của bạn được cô lập.
Sau đó chạy kiểm tra y hệt trên máy chủ và xác nhận câu trả lời khác nhau: địa chỉ đường hầm và lối ra dự định bên trong, tuyến của máy chủ và lối ra văn phòng bên ngoài, và trình phân giải theo tên. Đặt tên không gian tên theo việc triển khai chứ không theo giao thức, để một script dọn dẹp không nhầm lẫn hai cái.
Chuyển tiếp, chính sách khi lỗi và dọn dẹp
Với một cổng, hãy bật chuyển tiếp một cách có chủ đích và quyết định điều gì phải xảy ra khi đường hầm sụp. Không gian tên không chặn các tuyến bạn cài bên trong, nên một tuyến dự phòng tới máy chủ sẽ được dùng nếu bạn tạo một tuyến. Đó là một quyết định chính sách, và nên được ghi lại trước khi một sự cố kiểm tra nó.
Ghi lại tên không gian tên, giao diện và ai sở hữu cấu hình, để việc dọn dẹp chỉ xóa những gì việc triển khai đã tạo. Đặt lại mạng của máy chủ trong lúc khôi phục sẽ biến dọn dẹp thành sự cố. Trang network_namespaces(7) ngắn và đáng đọc trước khi bạn thiết kế con đường đó.