curl và Python là hai công cụ thuận tiện để kiểm tra Proxy, gọi API của bạn và tự động hóa tác vụ được phép. Phần khó không chỉ nằm ở cú pháp: bạn còn cần chọn đúng giao thức, kiểm soát DNS, quản lý session và tránh để username/password xuất hiện trong mã nguồn hoặc log.
Phạm vi sử dụng: chỉ gửi yêu cầu tới hệ thống bạn có quyền truy cập, tôn trọng robots.txt, điều khoản dịch vụ, giới hạn tốc độ và quy định về dữ liệu.
Chuẩn bị thông tin Proxy
- Host và port.
- Giao thức: HTTP, HTTPS CONNECT hoặc SOCKS5.
- Username/password hoặc whitelist IP.
- Quy tắc IP tĩnh, xoay theo yêu cầu hoặc sticky session.
- Giới hạn kết nối và băng thông.
Nếu chưa rõ loại giao thức, xem Proxy HTTP, HTTPS và SOCKS5 khác nhau thế nào.
Dùng HTTP Proxy với curl
curl --proxy http://HOST:PORT --proxy-user "USERNAME:PASSWORD" https://api.ipify.org
Tùy chọn --proxy đặt địa chỉ Proxy; --proxy-user tách thông tin xác thực khỏi URL, giảm lỗi do ký tự đặc biệt. Tuy vậy lệnh vẫn có thể xuất hiện trong lịch sử shell hoặc danh sách tiến trình trên một số hệ thống, nên không dùng mật khẩu thật trong tài liệu chia sẻ.
Dùng SOCKS5 với curl
curl --proxy socks5h://HOST:PORT --proxy-user "USERNAME:PASSWORD" https://api.ipify.org
Chữ h trong socks5h yêu cầu Proxy phân giải hostname. Với socks5://, curl có thể phân giải tên miền cục bộ rồi gửi địa chỉ IP tới Proxy. Chọn socks5h khi bạn muốn giảm khả năng DNS đi ngoài tuyến dự kiến.
Đo thời gian phản hồi bằng curl
curl --proxy http://HOST:PORT --proxy-user "USERNAME:PASSWORD" -o NUL -s -w "connect=%{time_connect} start=%{time_starttransfer} total=%{time_total} code=%{http_code}
" https://example.com/
Trên macOS và Linux, thay NUL bằng /dev/null. Chạy nhiều lần và so sánh với kết nối trực tiếp. Xem bài đo tốc độ và độ ổn định Proxy để hiểu cách đọc kết quả.
Dùng Proxy với Python Requests
Cài thư viện theo môi trường dự án, sau đó cấu hình cả khóa http và https. URL Proxy http vẫn có thể được dùng để tạo đường hầm CONNECT tới website HTTPS:
import requests
proxies = {
"http": "http://USERNAME:PASSWORD@HOST:PORT",
"https": "http://USERNAME:PASSWORD@HOST:PORT",
}
response = requests.get(
"https://api.ipify.org?format=json",
proxies=proxies,
timeout=(5, 20),
)
response.raise_for_status()
print(response.json())
Không đưa mật khẩu thật vào repository. Ví dụ trên chỉ minh họa cấu trúc. Trong ứng dụng thật, đọc bí mật từ biến môi trường hoặc trình quản lý bí mật.
Đọc cấu hình từ biến môi trường
import os
import requests
proxy_url = os.environ["PROXY_URL"]
proxies = {"http": proxy_url, "https": proxy_url}
response = requests.get(
"https://api.ipify.org?format=json",
proxies=proxies,
timeout=(5, 20),
)
response.raise_for_status()
print(response.json())
Đặt biến môi trường ở nơi chạy chương trình, không ghi giá trị vào file được commit. Khi ghi log, chỉ báo tên Proxy hoặc mã nội bộ; không in nguyên URL có tài khoản.
Dùng Session để tái sử dụng kết nối
import os
import requests
session = requests.Session()
session.proxies.update({
"http": os.environ["PROXY_URL"],
"https": os.environ["PROXY_URL"],
})
for url in ["https://example.com/", "https://api.ipify.org/"]:
response = session.get(url, timeout=(5, 20))
response.raise_for_status()
print(url, response.status_code)
Session tái sử dụng kết nối và cookie. Điều này tăng hiệu quả nhưng cũng có nghĩa trạng thái được chia sẻ giữa yêu cầu. Không dùng cùng Session cho các người dùng hoặc ngữ cảnh cần cô lập.
Dùng SOCKS5 với Python
Requests cần phần phụ thuộc SOCKS, thường được cài bằng biến thể requests[socks]. Sau đó dùng socks5h để phân giải hostname qua Proxy:
import os
import requests
proxy_url = os.environ["SOCKS_PROXY_URL"]
proxies = {"http": proxy_url, "https": proxy_url}
response = requests.get(
"https://api.ipify.org?format=json",
proxies=proxies,
timeout=(5, 20),
)
response.raise_for_status()
print(response.json())
Giá trị biến có dạng socks5h://USERNAME:PASSWORD@HOST:PORT. Xác nhận thư viện và phiên bản đang dùng hỗ trợ đúng scheme.
Timeout và retry an toàn
Luôn đặt timeout. Không có timeout, chương trình có thể treo lâu khi Proxy hoặc website đích không phản hồi. Nên tách timeout kết nối và timeout đọc. Retry chỉ áp dụng có giới hạn, khoảng chờ tăng dần và ưu tiên yêu cầu idempotent.
- Không retry vô hạn.
- Không retry nhanh khi website trả 429.
- Không tự động gửi lại POST nếu thao tác có thể tạo bản ghi trùng.
- Ghi log mã lỗi, thời gian và mã Proxy nội bộ, không ghi bí mật.
Xử lý lỗi thường gặp
| Lỗi | Nguyên nhân thường gặp | Cách kiểm tra |
|---|---|---|
| 407 | Sai xác thực hoặc whitelist | Xem hướng dẫn lỗi 407 |
| Timeout kết nối | Host/port sai, tường lửa hoặc Proxy quá tải | Thử curl, kiểm tra mạng nền |
| DNS error | Phân giải cục bộ thất bại | Dùng socks5h, kiểm tra DNS |
| TLS error | Chứng chỉ, thời gian máy hoặc chặn trung gian | Không tắt verify; kiểm tra chứng chỉ |
| 429 | Website đích giới hạn tần suất | Giảm tốc độ, tôn trọng Retry-After |
Không tắt xác minh TLS
Việc đặt verify=False không phải cách sửa Proxy. Nó làm ứng dụng không xác minh danh tính website và có thể cho phép tấn công trung gian. Nếu có lỗi chứng chỉ, kiểm tra đồng hồ hệ thống, CA bundle, môi trường doanh nghiệp và cấu hình Proxy. Chỉ dùng CA tùy chỉnh khi được quản trị viên tin cậy cung cấp.
Checklist bảo vệ thông tin đăng nhập
- Không commit URL Proxy có username/password.
- Không in biến Proxy ra log.
- Không gửi ảnh màn hình terminal chứa bí mật.
- Dùng quyền tối thiểu và xoay mật khẩu khi nghi ngờ lộ.
- Giới hạn whitelist IP ở phạm vi cần thiết.
- Tách Proxy cho môi trường phát triển và sản xuất.
- Kiểm tra dependency và cập nhật bản vá bảo mật.
Kết luận
curl phù hợp kiểm tra nhanh và tách lỗi cấu hình; Python Requests phù hợp tích hợp vào ứng dụng. Hãy chọn đúng HTTP hoặc SOCKS5, dùng socks5h khi cần Proxy phân giải DNS, đặt timeout, retry có giới hạn và bảo vệ thông tin đăng nhập. Quan trọng nhất, chỉ tự động hóa trên hệ thống được phép và tuân thủ giới hạn của dịch vụ đích.