Một socket .NET cần bắt tay SOCKS
Giải thích những gì một socket TCP .NET thô phải làm trước khi các byte của ứng dụng có thể đi qua proxy SOCKS.
Trỏ Socket.Connect() tới một máy chủ SOCKS sẽ mở một kết nối TCP tới máy chủ đó. Các byte tiếp theo vẫn phải nói tiếng SOCKS. Gửi ngay giao thức của ứng dụng sẽ khiến máy chủ chờ một cuộc trò chuyện khác.
Với SOCKS5, việc thiết lập kết nối gồm thương lượng phương thức, trao đổi xác thực đã chọn (nếu có) và một yêu cầu nêu đích đến. Chỉ một phản hồi thành công mới mở đường cho các byte của ứng dụng. Các giai đoạn này được định nghĩa trong RFC 1928.
Giữ thương lượng trong lớp kết nối
Một ứng dụng có giao thức TCP riêng có thể dùng một bộ kết nối hiểu proxy và trả về một luồng đã thiết lập. Phần còn lại của ứng dụng đọc và ghi qua luồng đó. Bộ kết nối phải tính đến việc đọc một phần, địa chỉ có độ dài thay đổi, lỗi xác thực và thời hạn cho việc thương lượng.
Một triển khai viết tay chỉ đọc một bộ đệm kích thước cố định và giả định thành công là dễ vỡ. TCP không giữ lại ranh giới của các thông điệp SOCKS. Hãy đọc toàn bộ phản hồi được mô tả bởi loại địa chỉ của nó trước khi bắt đầu giao thức ứng dụng. Trình đọc phản hồi CONNECT cho .NET 7+ minh họa bước đó.
Nếu một thư viện được duy trì đã cung cấp lớp kết nối này, hãy kiểm tra các phiên bản SOCKS được hỗ trợ, phương thức xác thực và khung đích. Một liên kết diễn đàn mười năm tuổi là điểm khởi đầu để điều tra, không phải bằng chứng về khả năng tương thích hiện tại.
Cấu hình ứng dụng HTTP có phạm vi riêng
Cài đặt proxy của một ứng dụng HTTP cấu hình chính ứng dụng HTTP đó. Nó không sửa đổi mọi socket thô trong tiến trình. API Socket chấp nhận một điểm cuối mạng và để việc thương lượng cấp cao hơn cho bên gọi.
Với một giao thức ứng dụng được mã hóa, hãy thực hiện bắt tay TLS sau khi đường hầm proxy được thiết lập. Xác thực danh tính đích dự định ở giai đoạn đó. Xác thực proxy và xác thực đích vẫn tách biệt dù chúng dùng chung luồng bên dưới.