SOCKS5 proxy là gì? So sánh proxy SOCKS5 và HTTP, nên chọn loại nào
SOCKS5 proxy là gì, khác proxy HTTP ở đâu, vì sao có socks5 và socks5h, và cách dùng proxy SOCKS5 trong cURL và Python. Giải thích dễ hiểu dựa trên chính các tiêu chuẩn RFC.

Mục lục
- SOCKS5 proxy là gì?
- Proxy HTTP làm việc khác thế nào?
- So sánh nhanh SOCKS5 và proxy HTTP
- Chuyện tên miền: socks5 và socks5h khác nhau ra sao
- Dùng proxy SOCKS5 trong cURL và Python
- Nên chọn proxy SOCKS5 hay HTTP?
- Proxy SOCKS5 ở BinProxy
- Câu hỏi thường gặp
- SOCKS5 có mã hoá dữ liệu không?
- Proxy SOCKS5 có nhanh hơn proxy HTTP không?
- socks5h là gì?
- Vì sao Python báo lỗi "Missing dependencies for SOCKS support"?
- Một proxy có dùng được cả HTTP và SOCKS5 không?
Khi mua proxy, bạn thường được hỏi chọn HTTP hay SOCKS5. Nhiều người chọn đại, vì phần mềm nào cũng có ô điền proxy, rồi đến lúc kết nối không được mới quay lại tìm hiểu. Bài này giải thích SOCKS5 proxy là gì, khác proxy HTTP ở đâu, vì sao có "socks5" và "socks5h", kèm ví dụ dùng proxy SOCKS5 trong cURL và Python. Đọc xong, bạn sẽ biết lúc nào chọn loại nào mà không cần thử tới thử lui.
SOCKS5 proxy là gì?
SOCKS5 là một giao thức proxy được chuẩn hoá trong tài liệu RFC 1928, công bố tháng 3/1996. Tài liệu này mô tả SOCKS5 như một "lớp đệm" nằm giữa tầng ứng dụng và tầng truyền tải. Nói dễ hiểu: SOCKS5 không cần biết bạn đang gửi gì, nó chỉ nhận lời "hãy nối tôi tới địa chỉ này, cổng này" rồi chuyển dữ liệu qua lại.
Vì không cần hiểu nội dung, một proxy SOCKS5 dùng được cho đủ loại kết nối, không chỉ web. Theo RFC 1928, SOCKS5 có:
- Ba lệnh: CONNECT (mở kết nối TCP tới đích), BIND (chờ kết nối đi vào) và UDP ASSOCIATE (chuyển tiếp gói UDP).
- Ba kiểu địa chỉ: IPv4, tên miền và IPv6.
- Bước thương lượng cách xác thực: phía người dùng liệt kê các cách mình hỗ trợ, máy chủ chọn một.
Cách xác thực phổ biến nhất là tên đăng nhập và mật khẩu, được mô tả trong RFC 1929. Có một điều bạn nên biết: chính RFC 1929 ghi rằng mật khẩu được gửi dưới dạng văn bản thường, không mã hoá. Vì vậy, dữ liệu quan trọng nên luôn đi bằng HTTPS bên trong kết nối proxy.
Proxy HTTP làm việc khác thế nào?
Proxy HTTP thì ngược lại: nó hiểu giao thức HTTP. Theo bộ quy chuẩn RFC 9110, proxy là một tác nhân chuyển tiếp thông điệp, và một số proxy được thiết kế để biến đổi thông điệp đi qua. Proxy HTTP cũng phải thêm dòng Via vào mỗi thông điệp nó chuyển tiếp.
Với website dùng HTTPS (gần như mọi website ngày nay), proxy HTTP dùng lệnh CONNECT để mở một "đường hầm" tới đích. RFC 9110 mô tả đường hầm này là chuyển tiếp mù dữ liệu theo cả hai chiều. Proxy chỉ biết bạn muốn tới tên miền nào, cổng nào; còn đường dẫn, nội dung trang và dữ liệu bạn gửi đều nằm trong phần đã mã hoá. Tài liệu của Squid, một phần mềm proxy rất phổ biến, cũng nói rõ rằng nó không đọc được những thông điệp đã mã hoá trong đường hầm, trừ khi được cấu hình riêng để giải mã, và khi đó phía người dùng phải tin chứng chỉ của proxy.
Còn khi proxy không cho bạn qua vì sai tên đăng nhập hay mật khẩu, nó trả về mã lỗi 407 Proxy Authentication Required. Nếu bạn từng thấy mã này, giờ bạn biết nó đến từ đâu rồi đó.
So sánh nhanh SOCKS5 và proxy HTTP

| SOCKS5 | Proxy HTTP(S) | |
|---|---|---|
| Làm việc ở đâu | Giữa ứng dụng và tầng truyền tải, không đọc nội dung | Ở tầng HTTP, hiểu được yêu cầu web |
| Loại kết nối | Mọi kết nối TCP; UDP nếu máy chủ hỗ trợ | Yêu cầu web; HTTPS đi qua đường hầm CONNECT |
| Với HTTPS | Chuyển tiếp nguyên vẹn | Chuyển tiếp trong đường hầm, chỉ thấy tên miền và cổng |
| Xác thực | Thương lượng, phổ biến là user/pass | Dòng Proxy-Authorization, sai thì trả 407 |
| Phân giải tên miền | Tuỳ bạn: ở máy bạn (socks5) hoặc ở proxy (socks5h) | Thường do proxy làm |
Chuyện tên miền: socks5 và socks5h khác nhau ra sao
Đây là chi tiết nhỏ nhưng hay gây nhầm lẫn nhất khi dùng proxy SOCKS5. Khi bạn mở https://example.com, ai đó phải tra xem tên miền này ứng với địa chỉ IP nào. Với SOCKS5, bạn được chọn người làm việc đó:
socks5://: máy của bạn tự tra tên miền, rồi gửi địa chỉ IP cho proxy.socks5h://: máy bạn gửi nguyên tên miền cho proxy, và proxy tự tra.
Tài liệu của cURL và thư viện requests của Python đều mô tả đúng như vậy. Với proxy dân cư, chúng tôi khuyên bạn dùng socks5h, vì hai lẽ. Một là việc tra tên miền diễn ra ở phía IP bạn chọn, nên khớp với vị trí bạn muốn kiểm tra hơn. Hai là máy chủ tên miền của mạng nhà bạn không cần biết bạn đang truy cập những trang nào.
Dùng proxy SOCKS5 trong cURL và Python
Với cURL, bạn chỉ cần ghi rõ giao thức ở đầu địa chỉ proxy. Nếu bỏ trống phần này, cURL sẽ hiểu đó là proxy HTTP; còn nếu quên ghi cổng, nó tự dùng cổng 1080. Vì vậy bạn nên luôn ghi đủ:
curl -x "socks5h://USER:[email protected]:80" https://ipinfo.io/json
Với Python, thư viện requests hỗ trợ SOCKS từ phiên bản 2.10.0 nhưng cần cài thêm phần phụ. Nếu thiếu, bạn sẽ gặp lỗi "Missing dependencies for SOCKS support":
# cài một lần: pip install "requests[socks]"
import requests
proxy = "socks5h://USER:[email protected]:80"
info = requests.get(
"https://ipinfo.io/json",
proxies={"http": proxy, "https": proxy},
timeout=20,
).json()
print(info["ip"], info["country"])

Nên chọn proxy SOCKS5 hay HTTP?
Một vài gợi ý để bạn chọn nhanh:
- Bạn chỉ làm việc với website (thu thập dữ liệu công khai, theo dõi giá, kiểm tra kết quả tìm kiếm): proxy HTTP là đủ và được hầu hết thư viện hỗ trợ sẵn.
- Phần mềm của bạn chỉ có ô điền SOCKS, hoặc bạn cần nối tới một dịch vụ không phải web qua TCP: chọn SOCKS5.
- Bạn cần UDP: SOCKS5 có lệnh cho UDP trong tiêu chuẩn, nhưng không phải mạng proxy nào cũng bật tính năng này. Hãy hỏi nhà cung cấp trước khi mua.
- Về tốc độ: chênh lệch giữa hai giao thức thường nhỏ, quãng đường mạng tới IP bạn chọn ảnh hưởng nhiều hơn.
Proxy SOCKS5 ở BinProxy
Ở BinProxy, HTTP và SOCKS5 dùng chung một địa chỉ và một cổng: proxy.binproxy.com:80, xác thực bằng tên đăng nhập và mật khẩu. Trên trang Tạo proxy, bạn chọn SOCKS5 ở mục Giao thức, chọn định dạng socks5://user:pass@host:port, rồi đổi socks5:// thành socks5h:// nếu muốn proxy tự tra tên miền như đã nói ở trên. Muốn biết thêm về việc xoay hay giữ IP, bạn đọc bài proxy đổi IP là gì; còn giá thì ở bảng giá.
Câu hỏi thường gặp
SOCKS5 có mã hoá dữ liệu không?
Không. SOCKS5 chỉ chuyển tiếp dữ liệu, và theo RFC 1929, ngay cả mật khẩu xác thực cũng được gửi dưới dạng văn bản thường. Việc bảo vệ nội dung là nhờ HTTPS ở bên trong kết nối.
Proxy SOCKS5 có nhanh hơn proxy HTTP không?
Thường không chênh nhau nhiều. SOCKS5 không phải đọc nội dung nên xử lý gọn hơn một chút, nhưng tốc độ thực tế chủ yếu phụ thuộc vào đường truyền tới IP bạn đang dùng.
socks5h là gì?
Đó là cách viết địa chỉ proxy SOCKS5 để proxy tự phân giải tên miền, thay vì máy của bạn làm việc đó. Cả cURL lẫn thư viện requests của Python đều hiểu cách viết này.
Vì sao Python báo lỗi "Missing dependencies for SOCKS support"?
Vì thư viện requests cần cài thêm phần hỗ trợ SOCKS. Bạn chạy pip install "requests[socks]" một lần là hết lỗi.
Một proxy có dùng được cả HTTP và SOCKS5 không?
Tuỳ nhà cung cấp. Ở BinProxy thì có: cả hai giao thức dùng chung một địa chỉ và cổng, bạn chỉ cần chọn đúng giao thức trong phần mềm của mình.


