Proxy SOCKS5 và SOCKS4

Proxy SOCKS5 và SOCKS4

Proxy SOCKS cho ứng dụng yêu cầu máy chủ trung gian kết nối đến đích thay mình. Proxy mở kết nối được yêu cầu và truyền dữ liệu hai chiều. Ứng dụng vẫn dùng giao thức riêng, nên cơ chế phù hợp yêu cầu web, máy khách API, truyền tệp và phần mềm khác hỗ trợ SOCKS.

Với cấu hình mới, SOCKS5 thường có các lựa chọn hữu ích nhất: nhiều dạng địa chỉ hơn, chọn phương thức xác thực và hỗ trợ UDP. SOCKS4 vẫn hữu ích cho phần mềm cần phiên bản cũ. Lựa chọn tổng quát giữa chúng và proxy HTTP có trong Proxy SOCKS và HTTP.

Cách ứng dụng kết nối qua SOCKS

Xét ứng dụng mở https://example.com/ qua proxy SOCKS5. Nó đến proxy trước, yêu cầu mở kết nối website rồi mới trao đổi dữ liệu website. Quy trình có bốn bước:

Đến proxy, thỏa thuận quyền truy cập, yêu cầu đích rồi trao đổi dữ liệu HTTPS. TLS chạy giữa ứng dụng và website.
  1. Ứng dụng kết nối tên máy hoặc IP và cổng lắng nghe của proxy qua TCP.
  2. Ứng dụng và proxy chọn phương thức truy cập. Nếu cần thông tin xác thực, ứng dụng cung cấp và proxy kiểm tra.
  3. Ứng dụng gửi yêu cầu SOCKS CONNECT kèm địa chỉ và cổng đích. Proxy kiểm tra quy tắc truy cập, thử kết nối tiếp và báo kết quả.
  4. Sau phản hồi thành công, ứng dụng trao đổi với đích qua proxy. Với website HTTPS, nó thiết lập TLS với website và xác minh chứng chỉ trước khi gửi yêu cầu web.

Hai số cổng thuộc hai máy chủ khác nhau. Proxy ví dụ có thể lắng nghe tại proxy.example:1080, còn website truy cập tại example.com:443. Cổng 1080 thường dùng cho SOCKS nhưng dịch vụ có thể chọn cổng khác. Dùng cổng lắng nghe cấp cho proxy; nó không thay cổng đích.

Khi chuyển tiếp TCP thông thường, SOCKS truyền luồng byte ứng dụng mà không phải diễn giải từng yêu cầu HTTP hay lệnh tệp. Ứng dụng tiếp tục nói giao thức riêng với đích. Vì thế cùng cơ chế SOCKS phục vụ được máy khách web lẫn loại phần mềm khác.

CONNECT là lệnh trong SOCKS có dạng thông điệp riêng, khác phương thức HTTP CONNECT. SOCKS còn định nghĩa BIND cho ứng dụng cần máy chủ kết nối ngược qua proxy, như FTP chủ động. BIND cần hỗ trợ riêng và không dùng cho yêu cầu website hoặc API thông thường.

Khác biệt giữa SOCKS4, SOCKS4a và SOCKS5

SOCKS4 mở kết nối TCP đến địa chỉ IPv4. SOCKS4a thêm khả năng gửi tên máy để proxy tìm IP qua DNS. SOCKS5 thêm chọn phương thức xác thực, chấp nhận IPv4, IPv6 và tên máy, đồng thời định nghĩa chuyển tiếp UDP.

Khả năngSOCKS4SOCKS4aSOCKS5
Kết nối TCP đi raCóCóCó
Đích trong yêu cầuĐịa chỉ IPv4Địa chỉ IPv4 hoặc tên miềnĐịa chỉ IPv4, IPv6 hoặc tên miền
Proxy tra được tên máyKhôngCóCó
Phương thức tên người dùng/mật khẩu tiêu chuẩnKhôngKhôngCó
Cơ chế chuyển tiếp UDPKhôngKhôngCó

Đây là khả năng giao thức. Máy khách và dịch vụ proxy phải triển khai đúng tính năng định dùng. Chẳng hạn, dịch vụ SOCKS5 có thể xử lý TCP nhưng không có chuyển tiếp UDP dùng được.

SOCKS5 có thể mang đích IPv6 trong yêu cầu, nhưng proxy cũng phải truy cập được máy chủ IPv6 đó. Hai kết nối có thể dùng phiên bản IP khác: ứng dụng đến proxy qua IPv4, còn proxy đến đích qua IPv6.

SOCKS4a là phần mở rộng SOCKS4, không phải tên khác cho mọi kết nối SOCKS4. Nếu máy khách cũ chỉ gửi IPv4, chọn SOCKS4 không mang lại DNS từ xa. SOCKS4a cần hỗ trợ hai đầu. SOCKS5 thường đơn giản hơn khi cả hai hỗ trợ; chọn SOCKS4 không tự cải thiện uy tín IP đầu ra hay tốc độ.

Ai phân giải tên đích

Trước khi kết nối đến máy chủ có tên, tên phải được chuyển thành IP. SOCKS5 có thể nhận kết quả tra hoặc chính tên đó. Thiết lập DNS của máy khách quyết định nó gửi gì.

Với DNS cục bộ, ứng dụng hỏi bộ phân giải đã cấu hình về reports.example. Giả sử trả 203.0.113.27: ứng dụng yêu cầu kết nối SOCKS tới 203.0.113.27:443. Việc tra đã diễn ra ở máy khách dù kết nối website sau đó qua proxy.

Với DNS phía proxy, ứng dụng gửi reports.example:443 mà không tra cục bộ trước. Proxy lấy IP qua DNS và mở kết nối yêu cầu. Tên máy đến proxy trong yêu cầu SOCKS.

Ở chế độ DNS cục bộ, ứng dụng hỏi bộ phân giải DNS và gửi IP nhận được cho SOCKS. Ở chế độ từ xa, nó gửi tên máy để proxy hỏi bộ phân giải của mình.

Điều này hữu ích khi máy khách không phân giải được tên nhưng proxy có thể. Một số dịch vụ trả địa chỉ khác theo bộ phân giải DNS, nên chuyển nơi tra có thể đổi máy chủ nhận kết nối. Nó không đặt quốc gia đầu ra proxy hay đảm bảo website chấp nhận yêu cầu.

Trong curl, hai lệnh sau chọn hai chế độ DNS:

curl --proxy socks5://proxy.example:1080 https://example.com/
curl --proxy socks5h://proxy.example:1080 https://example.com/

socks5:// khiến curl phân giải tên website cục bộ; socks5h:// chuyển tên cho proxy. Cả hai dùng SOCKS5. Chữ h nghĩa là phân giải tên máy bởi proxy trong cú pháp URL của máy khách này. Nó không biến SOCKS5 thành HTTPS hay thêm mã hóa. Ứng dụng khác có thể dùng ô chọn hoặc tự chọn DNS từ xa. Thay tên máy và cổng proxy ví dụ bằng thông tin dịch vụ, cung cấp xác thực cần thiết.

Gửi tên miền trong yêu cầu TCP SOCKS5 không đòi hỗ trợ chuyển tiếp UDP. Proxy tra bằng cấu hình DNS riêng. Điều này khác yêu cầu SOCKS5 mang các gói UDP của máy khách.

Nếu máy khách được đặt để proxy xử lý DNS đích nhưng lại tra cục bộ, nó làm lộ tên yêu cầu ngoài tuyến dự kiến. Đây là rò rỉ DNS. DNS mã hóa bảo vệ trao đổi với bộ phân giải nhưng bộ phân giải vẫn nhận tên. Tra tên proxy là việc riêng; ứng dụng khác có hành vi DNS riêng. DNS từ xa trong một chương trình không chuyển mọi lần tra của thiết bị.

Xác thực và mã hóa

SOCKS5 cho máy khách đưa các phương thức xác thực hỗ trợ để proxy chọn. Tên người dùng và mật khẩu là một lựa chọn. Lựa chọn khác là kết nối không trao đổi đăng nhập SOCKS, dịch vụ có thể cho phép sau khi đối chiếu IP nguồn với danh sách IP được phép. Vì vậy, điểm kết nối không có ô mật khẩu vẫn có thể hạn chế truy cập.

Không thỏa thuận được phương thức khác với bị từ chối mật khẩu: trường hợp đầu chưa trao đổi mật khẩu. Máy khách không hỗ trợ tên người dùng/mật khẩu không thể dùng điểm SOCKS5 chỉ cho đăng nhập mật khẩu chỉ vì có cài đặt SOCKS5. SOCKS4 có trường ID người dùng nhưng không có trao đổi mật khẩu tiêu chuẩn tương đương; máy chủ vẫn có thể áp quy tắc truy cập.

Trao đổi tên người dùng/mật khẩu SOCKS5 thông thường không mã hóa thông tin. Nó diễn ra trước khi ứng dụng thiết lập HTTPS với đích, nên HTTPS sau không bảo vệ đăng nhập proxy trước. Mã hóa đường máy khách–proxy cần kết nối bảo vệ riêng hoặc cơ chế bảo mật được hỗ trợ rõ ràng.

Trao đổi mật khẩu SOCKS5 bình thường gửi thông tin xác thực tới proxy không mã hóa. Sau CONNECT, TLS bảo vệ dữ liệu website xuyên suốt qua phần chuyển tiếp.

Trong chuyển tiếp SOCKS thông thường, HTTPS bảo vệ trao đổi giữa ứng dụng và website khi bật xác minh chứng chỉ và không có giải mã TLS trung gian. Giao thức ứng dụng không mã hóa vẫn không mã hóa qua proxy. Chỉ hỗ trợ SOCKS5 hoặc xác thực mật khẩu không hứa lưu lượng được mã hóa.

Proxy vẫn biết IP máy khách kết nối, đích yêu cầu và thời gian kết nối. Đích thấy IP đầu ra proxy và nhận dữ liệu ứng dụng dành cho nó. Cookie, đăng nhập tài khoản và mã nhận diện ứng dụng vẫn có thể xác định người dùng; đổi phiên bản SOCKS không bỏ chúng.

Cách SOCKS5 mang TCP và UDP

TCP cung cấp luồng byte có thứ tự. Yêu cầu trình duyệt, gọi API hoặc phiên SSH có thể dùng TCP qua SOCKS khi máy khách hỗ trợ tuyến và proxy cho phép đích. Thành công trên cổng 443 website không xác lập cổng ứng dụng khác khả dụng.

UDP gửi datagram riêng. Máy khách SOCKS5 trước hết mở kết nối điều khiển TCP và yêu cầu bộ chuyển tiếp bằng UDP ASSOCIATE. Proxy trả địa chỉ và cổng UDP của bộ chuyển tiếp. Máy khách gửi datagram đến đó với tiêu đề SOCKS mô tả đích. Đóng kết nối điều khiển TCP kết thúc liên kết UDP này; datagram đi riêng, không nằm trong luồng SOCKS CONNECT thông thường.

TCP dùng luồng byte CONNECT. UDP dùng kết nối điều khiển TCP có UDP ASSOCIATE và đường chuyển tiếp UDP riêng. Kết nối điều khiển phải luôn mở.

Ứng dụng và dịch vụ đều phải hỗ trợ cơ chế, mạng phải cho đường UDP. Chương trình có thể xong đăng nhập TCP nhưng âm thanh, trò chơi hoặc chức năng UDP khác vẫn lỗi. Yêu cầu HTTPS thành công qua SOCKS CONNECT chứng minh chuyển tiếp TCP, không phải UDP hoạt động. QUIC dùng UDP nhưng còn tùy máy khách và toàn tuyến; chỉ nhãn SOCKS5 không xác lập được.

Khi SOCKS hữu ích

SOCKS hữu ích khi phần mềm cần kết nối trung gian nhưng giữ giao thức ứng dụng riêng. Tập lệnh yêu cầu dữ liệu API qua IP được cấp, máy khách truyền tệp đến máy chủ từ xa theo tuyến được chấp thuận, ứng dụng máy tính tương thích dùng proxy dù không phải trình duyệt. Mỗi trường hợp phụ thuộc hỗ trợ SOCKS của máy khách và cổng đích được dịch vụ cho phép.

Với công việc lặp trên cùng tài khoản hoặc máy chủ, đầu ra cố định có thể phù hợp. Với tác vụ riêng, dịch vụ xoay có thể hữu ích. SOCKS4 và SOCKS5 không quyết định hành vi: dịch vụ quyết định IP đầu ra, loại mạng, ai khác dùng và khi nào đổi. Phiên bản giao thức cũng không xếp hạng tốc độ; độ dài tuyến, tải máy chủ và băng thông ảnh hưởng kết quả.

Hỗ trợ máy khách có thể hẹp hơn giao thức. SOCKS5 tích hợp Chrome phân giải tên đích qua proxy nhưng không thực hiện xác thực tên người dùng/mật khẩu SOCKS5 hay chuyển tiếp UDP. Vì vậy, điểm chỉ nhận mật khẩu có thể chạy trong curl nhưng lỗi qua cài đặt trình duyệt tích hợp. Bộ điều hợp bên ngoài là phần kết nối riêng với khả năng riêng.

Proxy cấu hình trong một chương trình chỉ áp dụng cho kết nối chương trình đó hỗ trợ. Nó không cấu hình trình tải hay tập lệnh riêng. Cài đặt proxy hệ thống cũng chỉ ảnh hưởng phần mềm sử dụng chúng. Khi bộ điều hợp chuyển hướng kết nối từ ứng dụng không có SOCKS sẵn, phạm vi TCP, UDP và DNS quan trọng. SOCKS không chuyển tiếp ICMP thông thường, nên ping không phải phép thử đường proxy này.

Thiết lập kết nối và thử nghiệm hữu ích

Bắt đầu bằng địa chỉ proxy, cổng lắng nghe, phiên bản SOCKS và cách truy cập cấp cho điểm kết nối. Số như 1080 không tự xác định giao thức. Chọn SOCKS trong máy khách thay vì nhập cùng địa chỉ vào ô chỉ hỗ trợ proxy HTTP.

Thông tin xác thực proxy cho phép dùng trung gian; đăng nhập website cho phép dùng website. Chúng thuộc các thiết lập khác nhau. Trong curl, --proxy-user cung cấp thông tin proxy, còn --user cung cấp thông tin đích. Với truy cập bằng IP, danh sách được phép phải khớp IP nguồn mà proxy thấy; IP có thể đổi khi máy khách sang mạng khác.

Chọn chế độ DNS mong muốn rồi kiểm tra quy tắc bỏ qua. Đích trong danh sách ngoại lệ có thể không đi qua proxy cấu hình. Trong curl, NO_PROXY có thể gây điều này; --noproxy "" xóa ngoại lệ cho một lần chạy khi bạn chủ động muốn kiểm tra tuyến proxy.

Thử từ chương trình thực làm việc. Điểm kiểm tra IP hoặc nhật ký máy chủ đích do bạn kiểm soát có thể cho thấy IP nguồn yêu cầu. So với yêu cầu trực tiếp. Địa chỉ để đến proxy và IP đầu ra đích thấy không nhất thiết giống nhau.

Sau đó thử tác vụ thật. IP đổi chứng minh tuyến của yêu cầu đã thử, không đo mọi phương thức truyền hay xác lập website khác phản hồi ra sao. Thử riêng UDP hoặc IPv6 nếu cần và đánh giá thời gian phản hồi, độ ổn định dưới tải đại diện.

Xác định lỗi theo giai đoạn kết nối

Phân biệt đến proxy, được cấp quyền, mở kết nối đích và nhận phản hồi ứng dụng. Các giai đoạn có nguyên nhân lỗi khác nhau.

Phần thất bạiĐiều cần kiểm tra
Kết nối proxy hết thời gian chờ hoặc bị từ chốiTên máy proxy, cổng lắng nghe, khả năng kết nối qua mạng và hạn chế truy cập. Kết nối đích chưa được mở.
Không có phương thức xác thực chấp nhận đượcMáy khách có hỗ trợ phương thức điểm này chấp nhận không. Đây chưa phải đánh giá mật khẩu.
Đăng nhập bằng tên người dùng/mật khẩu bị từ chốiThông tin xác thực proxy và quyền tài khoản, sau khi xác nhận đã chọn phương thức mật khẩu.
Không phân giải được tên đíchBên nào thực hiện tra cứu. Lỗi DNS cục bộ có thể xảy ra trước khi máy khách yêu cầu SOCKS mở kết nối đích. Với DNS từ xa, proxy phải lấy IP đích.
Proxy từ chối đích hoặc thao tácQuy tắc truy cập, cổng đích và hỗ trợ lệnh hoặc dạng địa chỉ được yêu cầu. Từ chối theo chính sách khác với không hỗ trợ lệnh UDP hoặc IPv6.
Proxy không đến được đíchĐịa chỉ, cổng và tính sẵn sàng của đích từ mạng proxy. Đích có thể không tiếp cận được hoặc từ chối kết nối.

Nếu HTTPS được xác minh thành công và website trả trang đăng nhập, CAPTCHA hoặc từ chối truy cập, SOCKS đã mang được trao đổi đó. Hãy điều tra phản hồi website và hành vi ứng dụng. Nếu yêu cầu vẫn hiện IP công cộng thường dùng, kiểm tra proxy chọn và quy tắc bỏ qua trong chương trình.

Quay lại cơ sở kiến thức