Chuyển đến nội dung
Tất cả bài viết
Blog & hướng dẫn/Hướng dẫn sử dụng
Hướng dẫn sử dụng

Cách dùng Proxy với curl và Python an toàn

Ví dụ cấu hình HTTP và SOCKS5 Proxy với curl, Python Requests, biến môi trường và session; kèm cách bảo vệ mật khẩu và xử lý lỗi thường gặp.

Cách dùng Proxy với curl và Python an toàn
NỘI DUNG BÀI VIẾTHướng dẫn chi tiết từ ProxySmart

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ỗiNguyên nhân thường gặpCách kiểm tra
407Sai xác thực hoặc whitelistXem hướng dẫn lỗi 407
Timeout kết nốiHost/port sai, tường lửa hoặc Proxy quá tảiThử curl, kiểm tra mạng nền
DNS errorPhân giải cục bộ thất bạiDùng socks5h, kiểm tra DNS
TLS errorChứng chỉ, thời gian máy hoặc chặn trung gianKhông tắt verify; kiểm tra chứng chỉ
429Website đích giới hạn tần suấtGiả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.