Proxy không hỗ trợ giao thức cần thiết: phải làm gì
Bạn đã thiết lập proxy, chạy script — và nhận được lỗi "Protocol not supported" hoặc "Connection refused". Vấn đề không tương thích giao thức xảy ra thường xuyên hơn bạn nghĩ. Hãy cùng tìm hiểu tại sao điều này xảy ra và cách giải quyết vấn đề mà không cần thay đổi nhà cung cấp.
Các giao thức được proxy sử dụng
Trước khi giải quyết vấn đề, điều quan trọng là phải hiểu sự khác biệt giữa các giao thức. Mỗi giao thức có lĩnh vực ứng dụng và giới hạn riêng.
| Giao thức | Cổng mặc định | Đặc điểm |
|---|---|---|
| HTTP | 80, 8080, 3128 | Chỉ lưu lượng HTTP, có thể sửa đổi tiêu đề |
| HTTPS (CONNECT) | 443, 8443 | Tạo đường hầm qua HTTP CONNECT, mã hóa |
| SOCKS4 | 1080 | Kết nối TCP, không xác thực, không có UDP |
| SOCKS5 | 1080, 1081 | TCP và UDP, xác thực, DNS qua proxy |
Các xung đột điển hình:
- Selenium và Puppeteer yêu cầu HTTP/HTTPS, nhưng bạn lại có SOCKS5
- Telegram bot hoạt động qua SOCKS5, nhưng proxy chỉ hỗ trợ HTTP
- Ứng dụng Torrent yêu cầu SOCKS5 với UDP, nhưng proxy là SOCKS4
- Ứng dụng trò chơi yêu cầu UDP, nhưng proxy HTTP không hỗ trợ nó
Chẩn đoán: xác định giao thức proxy
Nếu nhà cung cấp không nêu rõ giao thức hoặc bạn không chắc chắn, hãy tự kiểm tra proxy.
Kiểm tra bằng curl
Kiểm tra giao thức HTTP:
# Proxy HTTP
curl -x http://proxy_ip:port http://httpbin.org/ip
# Có xác thực
curl -x http://user:pass@proxy_ip:port http://httpbin.org/ip
Kiểm tra SOCKS5:
# Proxy SOCKS5
curl -x socks5://proxy_ip:port http://httpbin.org/ip
# SOCKS5 với DNS qua proxy (socks5h)
curl -x socks5h://proxy_ip:port http://httpbin.org/ip
Nếu lệnh trả về địa chỉ IP của proxy — giao thức đã được xác định chính xác. Lỗi Connection refused hoặc Unsupported proxy — giao thức không đúng.
Kiểm tra bằng Python
import requests
proxy_ip = "proxy_ip:port"
# Kiểm tra HTTP
try:
r = requests.get("http://httpbin.org/ip",
proxies={"http": f"http://{proxy_ip}"},
timeout=10)
print(f"HTTP hoạt động: {r.json()}")
except Exception as e:
print(f"HTTP không hoạt động: {e}")
# Kiểm tra SOCKS5 (yêu cầu pip install requests[socks])
try:
r = requests.get("http://httpbin.org/ip",
proxies={"http": f"socks5://{proxy_ip}"},
timeout=10)
print(f"SOCKS5 hoạt động: {r.json()}")
except Exception as e:
print(f"SOCKS5 không hoạt động: {e}")
Tự động phát hiện
Script để duyệt qua các giao thức:
import requests
def detect_protocol(proxy_address):
protocols = ["http", "https", "socks4", "socks5", "socks5h"]
for proto in protocols:
try:
proxies = {
"http": f"{proto}://{proxy_address}",
"https": f"{proto}://{proxy_address}"
}
r = requests.get("http://httpbin.org/ip",
proxies=proxies, timeout=5)
if r.status_code == 200:
return proto
except:
continue
return None
result = detect_protocol("proxy_ip:port")
print(f"Giao thức phát hiện: {result}")
Chuyển đổi HTTP sang SOCKS và ngược lại
Nếu proxy hỗ trợ không đúng giao thức mà phần mềm của bạn cần, hãy sử dụng bộ chuyển đổi cục bộ.
Privoxy: HTTP → SOCKS
Privoxy nhận các yêu cầu HTTP và chuyển chúng qua proxy SOCKS.
Cài đặt:
# Ubuntu/Debian
sudo apt install privoxy
# macOS
brew install privoxy
# Windows — tải về từ trang web chính thức
Cấu hình (tệp /etc/privoxy/config):
# Lắng nghe trên cổng cục bộ 8118 (HTTP)
listen-address 127.0.0.1:8118
# Chuyển tiếp qua SOCKS5 bên ngoài
forward-socks5 / socks_proxy_ip:1080 .
# Có xác thực
forward-socks5 / user:pass@socks_proxy_ip:1080 .
Bây giờ phần mềm của bạn kết nối tới 127.0.0.1:8118 qua HTTP, và lưu lượng được chuyển qua SOCKS5.
Gost: bộ chuyển đổi đa năng
Gost là một công cụ mạnh mẽ cho mọi loại chuyển đổi giao thức.
# Proxy HTTP đầu vào → SOCKS5 đầu ra
gost -L http://:8080 -F socks5://socks_proxy_ip:1080
# SOCKS5 đầu vào → HTTP đầu ra
gost -L socks5://:1080 -F http://http_proxy_ip:8080
# Có xác thực ở cả hai đầu
gost -L http://local_user:local_pass@:8080 \
-F socks5://remote_user:remote_pass@proxy_ip:1080
Bộ chuyển đổi bằng Python
Bộ chuyển đổi tối giản cho các tác vụ đơn giản:
# pip install pproxy
# HTTP đầu vào, SOCKS5 đầu ra
pproxy -l http://:8080 -r socks5://proxy_ip:1080
# SOCKS5 đầu vào, HTTP đầu ra
pproxy -l socks5://:1080 -r http://proxy_ip:8080
Thiết lập đường hầm cục bộ
Đôi khi việc chuyển đổi là không đủ — cần có một đường hầm đầy đủ.
Đường hầm SSH qua proxy HTTP
Nếu bạn có máy chủ SSH và proxy HTTP, bạn có thể tạo SOCKS5:
# Tạo SOCKS5 trên localhost:1080 qua proxy HTTP
ssh -D 1080 -o ProxyCommand="nc -X connect -x http_proxy:8080 %h %p" user@ssh_server
Stunnel cho HTTPS
Nếu bạn cần proxy HTTPS nhưng chỉ có HTTP:
# stunnel.conf
[https-proxy]
client = yes
accept = 127.0.0.1:8443
connect = http_proxy_ip:8080
protocol = connect
protocolHost = target_host:443
Cấu hình phần mềm theo giao thức khả dụng
Đôi khi việc cấu hình phần mềm theo giao thức hiện có sẽ dễ dàng hơn là chuyển đổi.
Selenium với các giao thức khác nhau
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Proxy HTTP (cách tiêu chuẩn)
options = Options()
options.add_argument('--proxy-server=http://proxy_ip:8080')
# Proxy SOCKS5
options.add_argument('--proxy-server=socks5://proxy_ip:1080')
# Đối với Firefox với SOCKS5
from selenium.webdriver.firefox.options import Options as FirefoxOptions
profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.socks", "proxy_ip")
profile.set_preference("network.proxy.socks_port", 1080)
profile.set_preference("network.proxy.socks_version", 5)
aiohttp với SOCKS
# pip install aiohttp-socks
import aiohttp
from aiohttp_socks import ProxyConnector
async def fetch_with_socks():
connector = ProxyConnector.from_url('socks5://proxy_ip:1080')
async with aiohttp.ClientSession(connector=connector) as session:
async with session.get('http://httpbin.org/ip') as response:
return await response.json()
Telegram bot qua HTTP
Nếu thư viện Telegram yêu cầu SOCKS5, nhưng bạn có HTTP:
# python-telegram-bot với proxy HTTP
from telegram.ext import ApplicationBuilder
application = (
ApplicationBuilder()
.token("YOUR_TOKEN")
.proxy_url("http://proxy_ip:8080") # Hoạt động với HTTP
.build()
)
Mẹo: Nhiều thư viện hiện đại hỗ trợ cả hai giao thức. Hãy kiểm tra tài liệu — có thể bạn chỉ cần thay đổi lược đồ URL từ
socks5://thànhhttp://.
Cách chọn proxy với giao thức cần thiết
Để tránh các vấn đề về giao thức, hãy xác định yêu cầu trước.
Ma trận tương thích
| Nhiệm vụ | Giao thức khuyến nghị | Lý do |
|---|---|---|
| Web scraping | HTTP/HTTPS | Hỗ trợ rộng rãi, thiết lập đơn giản |
| Tự động hóa trình duyệt | HTTP hoặc SOCKS5 | Phụ thuộc vào trình duyệt và framework |
| Telegram, Discord bot | SOCKS5 | Yêu cầu của các thư viện |
| Torrent | SOCKS5 với UDP | DHT và PEX sử dụng UDP |
| Trò chơi, VoIP | SOCKS5 với UDP | Độ trễ thấp, lưu lượng UDP |
| Yêu cầu API | HTTP/HTTPS | REST API hoạt động qua HTTP |
Những điều cần xem xét khi chọn nhà cung cấp
- Danh sách các giao thức được hỗ trợ — phải được nêu rõ ràng
- Khả năng chuyển đổi — một số nhà cung cấp cho phép truy cập cùng một IP thông qua các cổng/giao thức khác nhau
- Hỗ trợ UDP cho SOCKS5 — không phải tất cả proxy SOCKS5 đều hỗ trợ UDP
- Tài liệu hướng dẫn thiết lập — ví dụ cho các ngôn ngữ và công cụ khác nhau
Proxy dân cư (Residential proxies) thường hỗ trợ HTTP/HTTPS và SOCKS5 đồng thời, loại bỏ hầu hết các vấn đề tương thích. Proxy trung tâm dữ liệu (Datacenter proxies) thường bị giới hạn ở HTTP/HTTPS.
Danh sách kiểm tra trước khi mua
- Xác định giao thức mà phần mềm của bạn yêu cầu
- Kiểm tra xem có cần UDP không (trò chơi, torrent, VoIP)
- Hỏi nhà cung cấp về việc hỗ trợ giao thức cần thiết
- Yêu cầu quyền truy cập thử nghiệm để kiểm tra khả năng tương thích
- Chuẩn bị kế hoạch dự phòng — bộ chuyển đổi cục bộ
Kết luận
Vấn đề không tương thích giao thức là một vấn đề có thể giải quyết được. Trong hầu hết các trường hợp, chỉ cần một bộ chuyển đổi cục bộ như Privoxy hoặc Gost là đủ. Đối với các dự án dài hạn, việc chọn proxy hỗ trợ giao thức cần thiết ngay từ đầu sẽ kinh tế hơn.
Đối với các tác vụ đòi hỏi sự linh hoạt trong lựa chọn giao thức, proxy dân cư với quyền truy cập đa giao thức là phù hợp — tìm hiểu thêm tại proxycove.com.