Hỏi ba kỹ sư cách tiếp cận một dịch vụ nội bộ và bạn sẽ nhận ba thiết kế: một proxy web, một đường hầm SSH hoặc một VPN đầy đủ. Cả ba đều đưa dịch vụ từ xa vào tầm với, và cả ba đều có thể làm lưu lượng trông như đến từ nơi khác. Khác biệt lộ ra về sau, khi giao thức đang dùng không phải giao thức mà công cụ đã chọn giả định. Một thiết kế qua được bài kiểm tra nhanh trên trình duyệt thường hỏng ở ứng dụng đã tạo ra yêu cầu.

Quyết định từ hai sự thật: giao thức nào phải đi qua, và ai có thể phân giải những cái tên liên quan. Mọi thứ khác là sở thích.

Proxy chỉ chuyển thứ nó hiểu

Một proxy web phân tích giao thức mà nó được xây cho. Máy khách đưa cho nó một yêu cầu và nó chuyển yêu cầu đó đi tiếp, nên một ứng dụng không có thiết lập proxy hoàn toàn không tham gia. Với HTTPS máy khách cần một kênh không trong suốt, mà proxy cung cấp qua CONNECT thay vì đọc yêu cầu.

Chuyển tiếp động của SSH mở một cổng cục bộ nói SOCKS, và cổng đó chuyển một luồng TCP đến bất kỳ đích nào máy khách nêu tên. Các giao thức xây trên TCP thường hoạt động qua nó. UDP thì không, trừ khi một công cụ thêm hỗ trợ một cách rõ ràng. Chuyển tiếp cục bộ còn hẹp hơn: một cổng cục bộ ánh xạ tới một máy chủ và cổng cố định, phục vụ một dịch vụ đã biết và không gì hơn.

ssh -D 1080 user@bastion
ssh -L 8443:fileserver.internal:443 user@bastion

VPN chuyển các gói tin. Mọi thứ máy khách định tuyến vào đường hầm đều đi qua nó, kể cả UDP và ICMP, nên nó hợp với một yêu cầu mạng hơn là một kết nối đơn lẻ.

Phải có ai đó phân giải cái tên

Khi tên đích chỉ tồn tại trong DNS của mạng từ xa, máy thực hiện tra cứu phải nhìn thấy vùng đó. Một proxy web tự tra cứu, nên một tên nội bộ vẫn hoạt động qua nó ngay cả khi máy tính xách tay không phân giải được tên. SOCKS có thể cư xử như vậy, nhưng chỉ khi máy khách chuyển tiếp tên thay vì kết nối tới một địa chỉ mà nó đã phân giải. Lựa chọn đó nằm ở máy khách, không ở máy chủ.

curl cho thấy sự phân đôi rõ ràng: một cờ chuyển tên máy chủ cho proxy, cờ khác phân giải nó cục bộ trước. Với phân giải cục bộ, một tên chỉ có nội bộ hỏng trước khi bất kỳ đường hầm nào bị chạm tới, và lỗi đổ cho proxy một việc thật ra là quyết định DNS.

VPN đi con đường thứ ba bằng cách cài trình phân giải riêng và miền tìm kiếm bên cạnh các tuyến. Điều đó tiện, và nó tạo ra một ảo giác quen thuộc: một tuyến tồn tại với trình phân giải không trả lời trông đúng như một đường hầm chết, dù các gói tin vẫn đang tới phía bên kia.

Khi mạng chỉ cho phép một lối ra

Nhiều mạng doanh nghiệp chỉ cho phép kết nối ra ngoài qua một proxy web có xác thực. OpenVPN và SSH đều có thể được làm cho hoạt động ở đó, cái đầu bằng cách tạo đường hầm cho vận chuyển của chính nó qua proxy, cái sau qua một lệnh proxy chạy một trình trợ giúp CONNECT nhỏ.

Các đường hầm xây trên TCP sống sót qua ràng buộc đó, còn VPN dựa trên UDP thì không, điều này giải thích rất nhiều cấu hình chạy được ở nhà và hỏng ở văn phòng. Chi phí thứ hai dễ bị bỏ qua: một đường hầm TCP chở trong một kết nối TCP đã qua proxy giờ có hai tầng gửi lại, và khi mất gói, cặp đôi đó kẹt theo cách mà không tầng nào tự tạo ra.

Nối chuỗi các trung gian là một câu hỏi khác với việc chọn một tầng. Thêm một proxy thứ hai hoặc Tor thay đổi ai quan sát cái gì, và vị trí trong chuỗi quyết định chặng nào thấy bản mã.

Thứ tự quan trọng hơn số chặng. Một chặng ngoài nhìn thấy một luồng đã mã hóa trong khi chặng trong thấy bản rõ mà nó chở, nên một chuỗi chỉ riêng tư bằng mắt xích cẩu thả nhất. Trộn giao thức giữa các chặng không tự động cải thiện điều đó. Phần lớn nó chỉ làm các kiểu hỏng khó suy luận hơn.

Địa chỉ giả không phải một trong các lựa chọn

Tạo gói tin với địa chỉ nguồn của người khác không đạt được gì hữu ích: các trả lời đi tới chủ thật, và phần lớn mạng bỏ thẳng lưu lượng đó. Cần một trung gian chính vì không thể bịa ra nguồn, và đó là lý lẽ trung thực cho cả ba thiết kế.

Nó cũng giới hạn điều mỗi thiết kế có thể tuyên bố. Trông như xuất phát từ một địa chỉ cụ thể là câu hỏi về nơi địa chỉ đó được cấp phát hợp pháp và ai có thể định tuyến nó, không phải về công cụ nào có thể làm giả một tiêu đề. Nếu một thiết kế giả định khác đi, giả định đó sụp đổ ở nhà cung cấp đầu tiên lọc nó. Hãy viết giả định ra để nhận ra hỏng hóc khi nó đến.

Quyết định theo giao thức và tên

Chọn proxy khi một máy khách web cần một dịch vụ web và nó có thiết lập proxy. Chọn đường hầm SSH khi vài dịch vụ TCP đã biết là đủ và quyền truy cập SSH đã có. Chọn VPN khi nhiều ứng dụng, lưu lượng không phải TCP, DNS riêng hoặc một đường đi dùng lại được là một phần của yêu cầu.

Rồi kiểm chứng bằng máy khách thật và tên thật. Tải một trang qua proxy không dạy bạn gì về UDP, và làm một công cụ chạy qua SOCKS không dạy bạn gì về trình phân giải của hệ thống. Đọc xem tiến trình đã gắn địa chỉ cục bộ nào và trình phân giải nào đã trả lời. Đó là khác biệt giữa một đường đi hoạt động và một đường đi tình cờ hoạt động một lần.

Bài viết liên quan