Proxy

Cách Dùng Proxy Với cURL (-x, Xác Thực, SOCKS5 và Xoay Vòng)

24 thg 8, 202612 phút đọc

Bạn đang ở terminal và cần đúng một câu lệnh để định tuyến một yêu cầu cURL qua proxy, ngay bây giờ, chỉ việc copy-paste. Hướng dẫn này cho bạn chính xác điều đó: các cờ proxy của curl, cả ba giao thức, xác thực, biến môi trường, một cấu hình vĩnh viễn, xoay vòng, và một bảng lỗi-đến-cách-sửa thực tế - được kiểm tra trên curl 8.x vào tháng 8 năm 2026. Không lan man và không phễu bán hàng của nhà cung cấp. Nếu bạn đã biết cURL và chỉ muốn cú pháp proxy cùng những cái bẫy mà các trang khác bỏ qua, thì bạn đang ở đúng nơi.

Cập nhật lần cuối: 24 tháng 8 năm 2026. Được kiểm tra trên curl 8.x; các cờ này ổn định qua các bản phát hành curl gần đây, nhưng hãy chạy curl --version để xác nhận phiên bản của bạn.

TL;DR: câu lệnh một dòng

Truyền proxy cho cURL bằng -x (hoặc bản sinh đôi giống hệt của nó là --proxy):

curl -x http://USER:PASS@HOST:PORT https://example.com

-x--proxy là cùng một cờ. Nếu bạn bỏ qua scheme, cURL mặc định là http://; nếu bạn bỏ qua cổng, nó mặc định là 1080. Mọi câu lệnh bên dưới đều là một biến thể của dòng đó.

Những gì bạn cần trước khi bắt đầu

Để chạy bất kỳ câu lệnh nào ở đây, bạn cần bốn giá trị mà mọi nhà cung cấp proxy đều trao cho bạn trong bảng điều khiển của họ:

HOST:PORT            # the endpoint, e.g. p.webshare.io:80
USERNAME:PASSWORD    # your proxy credentials

Bốn giá trị đó là tất cả những gì cURL cần. Nếu bạn không có một endpoint hoạt động để kiểm tra, hãy lấy một cái trước khi đọc tiếp - các câu lệnh vô giá trị nếu không có một proxy thật đứng sau. Webshare có một gói miễn phí thực sự (10 proxy, không cần thẻ) rất nhanh để đăng ký cho đúng kiểu kiểm tra này, và nó trao cho bạn một chuỗi host:port:user:pass đơn giản, thả thẳng vào -x. Bạn có thể lấy proxy miễn phí để kiểm tra trong vài phút. (Webshare là một đối tác liên kết; xem tuyên bố liên kết của chúng tôi. Điều đó không thay đổi mức giá bạn phải trả hay các câu lệnh bên dưới.)

Trong quá trình test curl của riêng mình, tôi dán endpoint sticky-session thẳng từ bảng điều khiển Webshare thay vì tự tay dựng một dòng gateway xoay vòng, nên host, cổng và thông tin đăng nhập đến dưới dạng một chuỗi sẵn sàng thả vào -x. Tôi không cố định điều này vào một phiên bản curl cụ thể - bất kỳ curl nào tương đối gần đây đều xử lý các cờ này theo cùng một cách - nên hãy dùng bản đi kèm hệ thống của bạn.

Cú pháp proxy cURL cơ bản: cờ -x / --proxy

Hai dạng có thể thay thế cho nhau, nên hãy chọn dạng nào bạn nhớ được:

# These two lines are identical
curl -x http://HOST:PORT https://example.com
curl --proxy http://HOST:PORT https://example.com

cURL điền vào hai giá trị mặc định khiến nhiều người bất ngờ. Bỏ qua scheme và nó mặc định là proxy HTTP; bỏ qua cổng và nó mặc định là 1080:

# No scheme -> HTTP proxy is assumed
curl -x HOST:PORT https://example.com

# No port -> 1080 is assumed (so this targets HOST:1080)
curl -x http://HOST https://example.com

Hãy rõ ràng trong script. Viết đầy đủ http://HOST:PORT tránh được cú bất ngờ "sao nó lại truy cập cổng 1080?" sau này.

Proxy HTTP, HTTPS và SOCKS5 với cURL

Scheme đứng trước HOST:PORT cho cURL biết cách nói chuyện với proxy. Điều này tách biệt với việc URL đích của bạn có phải https hay không.

Loại proxyVí dụ cờ
Proxy HTTP-x http://HOST:PORT
Proxy HTTPS (TLS đến proxy)-x https://HOST:PORT
SOCKS5, DNS cục bộ-x socks5://HOST:PORT
SOCKS5, DNS từ xa-x socks5h://HOST:PORT

Proxy HTTP và HTTPS

# Reach an https site through a plain HTTP proxy - this is normal
curl -x http://HOST:PORT https://example.com

# Proxy that itself speaks TLS
curl -x https://HOST:PORT https://example.com

Lưu ý hai tầng TLS. http:// so với https:// trong giá trị -x mô tả chặng từ bạn đến proxy; còn https:// trong URL đích là chặng từ proxy đến site. Hầu hết datacenter proxy dùng scheme http:// ngay cả khi bạn đang tải các trang https, nên hãy bắt đầu từ đó.

SOCKS5 và sự phân biệt giữa socks5:// và socks5h://

curl -x socks5://HOST:PORT https://example.com
curl --socks5 HOST:PORT https://example.com     # same thing

# Let the PROXY resolve the hostname (remote DNS)
curl -x socks5h://HOST:PORT https://example.com

Đây là chi tiết mà hầu hết hướng dẫn bỏ qua. Với socks5://, cURL phân giải hostname đích trên máy của bạn và gửi cho proxy một địa chỉ IP. Với socks5h://, cURL gửi hostname và proxy thực hiện tra cứu DNS. Hãy dùng socks5h:// bất cứ khi nào bạn muốn DNS diễn ra ở điểm thoát, chẳng hạn để tránh rò rỉ DNS cục bộ hoặc để phân giải một tên chỉ tồn tại trong mạng của proxy.

Xác thực proxy cURL (-U / --proxy-user)

Hầu hết proxy trả phí yêu cầu tên người dùng và mật khẩu. Có hai cách để cung cấp chúng:

# Dedicated flag (-U is short for --proxy-user)
curl -x http://HOST:PORT -U USER:PASS https://example.com
curl -x http://HOST:PORT --proxy-user USER:PASS https://example.com

# Credentials embedded in the proxy URL
curl -x http://USER:PASS@HOST:PORT https://example.com

Cái bẫy gây ra hầu hết lỗi 407: khi bạn nhúng thông tin đăng nhập vào URL, mọi ký tự đặc biệt trong mật khẩu phải được mã hóa URL, nếu không cURL sẽ đọc sai chuỗi và proxy sẽ từ chối bạn. Mã hóa @ thành %40, : thành %3A, # thành %23, và cứ thế:

# Password is  p@ss:word  ->  encode it in the URL
curl -x "http://user:p%40ss%3Aword@HOST:PORT" https://example.com

# Or sidestep encoding entirely with -U (quote it for the shell)
curl -x http://HOST:PORT -U 'user:p@ss:word' https://example.com

Dạng -U chỉ tách ở dấu hai chấm đầu tiên, nên một dấu hai chấm bên trong mật khẩu không sao ở đó. --proxy-user cũng hoạt động với xác thực SOCKS5, không chỉ HTTP.

Đặt proxy bằng biến môi trường (HTTP_PROXY / HTTPS_PROXY)

Đặt proxy một lần trong shell của bạn và mọi lệnh gọi cURL trong phiên đó đều dùng nó. Cú pháp khác nhau tùy shell, và đó là chỗ mà các hướng dẫn đa nền tảng thường sai.

# Unix / macOS (bash, zsh)
export http_proxy="http://USER:PASS@HOST:PORT"
export https_proxy="http://USER:PASS@HOST:PORT"
export NO_PROXY="localhost,127.0.0.1,.internal.example.com"
curl https://example.com
# Windows PowerShell (curl is an alias here - call curl.exe)
$env:HTTP_PROXY = "http://USER:PASS@HOST:PORT"
$env:HTTPS_PROXY = "http://USER:PASS@HOST:PORT"
curl.exe https://example.com
:: Windows cmd.exe
set HTTP_PROXY=http://USER:PASS@HOST:PORT
set HTTPS_PROXY=http://USER:PASS@HOST:PORT
curl https://example.com

Hai điều cần biết. Với biến HTTP thuần, cURL chỉ đọc dạng chữ thường http_proxy (một lựa chọn bảo mật có chủ đích); HTTPS_PROXYNO_PROXY hoạt động ở cả hai dạng chữ. Và NO_PROXY (hoặc cờ --noproxy theo từng lệnh) liệt kê các host nên bỏ qua proxy. Một -x theo từng yêu cầu luôn ghi đè bất cứ thứ gì môi trường đã đặt:

# Ignore the env proxy for these hosts
curl --noproxy example.com,localhost https://example.com

# -x wins over the environment variables for this one call
curl -x http://OTHER_HOST:PORT https://example.com

Buộc cURL luôn dùng một proxy (.curlrc)

Với một proxy bạn dùng liên tục, hãy đặt nó vào tệp cấu hình của cURL để không bao giờ phải gõ cờ nữa. Trên Unix và macOS đó là ~/.curlrc; trên Windows đó là _curlrc trong thư mục home của bạn hoặc tại %APPDATA%\_curlrc. Thêm một dòng:

# ~/.curlrc  (or  %APPDATA%\_curlrc  on Windows)
proxy = "http://USER:PASS@HOST:PORT"

Giờ mọi câu lệnh cURL đều tự động đi qua proxy đó. Để bỏ qua nó cho một lệnh gọi duy nhất mà không cần sửa tệp, hãy tắt proxy ngay trên dòng lệnh:

curl --noproxy '*' https://example.com   # ignore the config proxy
curl -x '' https://example.com           # empty proxy = direct connection

Xoay vòng proxy theo từng yêu cầu

Hai mô hình trung thực bao quát gần như mọi nhu cầu xoay vòng. Mô hình đầu dùng gateway xoay vòng của nhà cung cấp - một endpoint duy nhất trao cho bạn một IP thoát mới ở mỗi yêu cầu, nên bạn chỉ việc gọi nó trong một vòng lặp:

# Rotating gateway endpoint (Webshare exposes one at p.webshare.io:80;
# check your dashboard for the exact host and rotation setting)
for i in $(seq 1 5); do
  curl -s -x http://USER:[email protected]:80 https://ipinfo.io/ip
done

Mô hình thứ hai cho bạn toàn quyền kiểm soát bằng cách lặp qua tệp danh sách proxy của riêng bạn, mỗi dòng một -x. Webshare và hầu hết nhà cung cấp cho phép bạn xuất danh sách ở định dạng host:port:user:pass, vốn phân tích rất gọn:

# proxies.txt: one  host:port:user:pass  per line
while IFS=: read -r host port user pass; do
  curl -s -x "http://$user:$pass@$host:$port" https://ipinfo.io/ip
done < proxies.txt

Hãy scrape có trách nhiệm. Chỉ lấy dữ liệu công khai, tôn trọng robots.txt và điều khoản dịch vụ của từng site, điều tiết tốc độ yêu cầu, và tránh xa bất cứ thứ gì nằm sau đăng nhập. Đó là thông lệ tốt, không phải tư vấn pháp lý - hãy kiểm tra các quy định cho dự án và khu vực pháp lý của riêng bạn. Nếu xoay vòng là trọng tâm quy trình của bạn, các hướng dẫn của chúng tôi về proxy xoay vòngproxy cho web scraping đi sâu hơn những gì một đoạn mã có thể.

Xác minh cURL đang dùng proxy (kiểm tra IP của bạn)

Đừng bao giờ cho rằng proxy đã có hiệu lực. Hãy hỏi một dịch vụ echo xem site thực sự thấy IP nào:

# Should print the proxy's exit IP, not yours
curl -x http://USER:PASS@HOST:PORT https://ipinfo.io/ip
curl -x http://USER:PASS@HOST:PORT http://httpbin.org/ip

# See the proxy handshake and CONNECT line
curl -v -x http://USER:PASS@HOST:PORT https://example.com

So sánh kết quả với một lệnh gọi trực tiếp (curl https://ipinfo.io/ip không có proxy). Nếu hai IP khác nhau, proxy đang hoạt động; nếu chúng giống nhau, cURL vẫn đi ra trực tiếp và -x hoặc biến môi trường của bạn không được áp dụng. Đầu ra -v hiển thị dòng CONNECT đến proxy, đây là cách nhanh nhất để xác nhận tuyến đường.

Các lỗi proxy cURL thường gặp và cách sửa

LỗiNguyên nhân có thểCách sửa
407 Proxy Authentication RequiredThiếu hoặc sai thông tin đăng nhập, hoặc một ký tự đặc biệt trong mật khẩu nhúng vào URL chưa được mã hóaThêm -U 'user:pass', hoặc mã hóa URL cho mật khẩu (@ -> %40, : -> %3A)
curl: (7) Couldn't connect to proxySai host, cổng, hoặc schemeKiểm tra lại HOST:PORT; thử http:// so với socks5://; xác nhận proxy đang hoạt động và có thể kết nối
curl: (56) / lỗi chứng chỉ SSL qua một proxy HTTPSChứng chỉ TLS của proxy không được tin cậyChỉ để kiểm tra, thêm --proxy-insecure hoặc trỏ --proxy-cacert đến CA; hãy sửa chứng chỉ đúng cách cho môi trường production
Site được phân giải bằng DNS cục bộ của bạn trên SOCKS5Dùng socks5:// trong khi bạn muốn DNS từ xaChuyển sang socks5h:// để proxy phân giải hostname
Yêu cầu treo hoặc không bao giờ trả vềProxy chết hoặc mục tiêu chậmThêm --connect-timeout 10--max-time 30 để thất bại nhanh

Chín trên mười báo cáo "curl proxy không hoạt động" là hàng đầu tiên: một lỗi 407 từ mật khẩu chưa được mã hóa. Hãy dùng -U trước khi thử bất cứ thứ gì khác.

Bạn nên dùng loại proxy nào với cURL?

cURL đối xử với mọi proxy như nhau, nên lựa chọn là về mục tiêu, không phải về công cụ. Định hướng trung thực trong ba dòng:

  • Datacenter proxy - nhanh nhất và rẻ nhất, nhưng dễ bị phát hiện hơn, nên tốt nhất cho việc scraping khối lượng lớn các site công khai phòng thủ yếu.
  • Residential proxy - khó chặn hơn vì chúng trông như người dùng gia đình thật, nhưng đắt hơn và thường tính phí theo GB.
  • ISP (residential tĩnh) proxy - điểm trung gian: tốc độ của datacenter với một IP ổn định, trông như residential.

Với một lập trình viên chỉ muốn một endpoint đơn giản thả thẳng vào curl -x và một gói miễn phí để test, Webshare là lựa chọn đáng giá dễ dàng - chi phí thấp, thân thiện với lập trình viên, và một chuỗi host:port:user:pass không có lớp bọc nào để phải vật lộn. Nó không phải lựa chọn duy nhất: Bright Data, Oxylabs, và IPRoyal đều vận hành các mạng residential lớn hơn hoặc chuyên biệt hơn nếu bạn cần (lưu ý rằng Oxylabs sở hữu Webshare, nên hãy xem chúng như có liên quan, không phải đối thủ độc lập). Bạn có thể bắt đầu với proxy miễn phí của Webshare, hoặc so sánh toàn thị trường trong trung tâm dịch vụ proxy tốt nhất của chúng tôi.

Câu hỏi thường gặp

cURL có hỗ trợ proxy SOCKS5 không?

Có. Dùng -x socks5://HOST:PORT hoặc --socks5 HOST:PORT. Chuyển sang socks5h:// khi bạn muốn proxy, chứ không phải máy của bạn, phân giải hostname đích (DNS từ xa).

Làm sao để đặt proxy chỉ cho các yêu cầu HTTPS?

Đặt biến môi trường https_proxy (hoặc HTTPS_PROXY) và để trống http_proxy, để chỉ lưu lượng https được định tuyến. Với một lệnh gọi đơn lẻ, chỉ cần thêm -x vào lệnh https và không gì khác.

Làm sao để cURL bỏ qua proxy cho một yêu cầu?

Dùng curl --noproxy '*' URL hoặc curl -x '' URL. Cả hai đều ghi đè một biến môi trường hoặc một proxy trong .curlrc cho lệnh gọi đó và kết nối trực tiếp.

Tại sao proxy cURL của tôi trả về 407?

Lỗi 407 nghĩa là proxy đã từ chối thông tin đăng nhập của bạn. Hoặc bạn không truyền tên người dùng và mật khẩu, hoặc một ký tự đặc biệt trong mật khẩu nhúng vào URL chưa được mã hóa URL. Thêm -U 'user:pass', hoặc mã hóa mật khẩu (@ trở thành %40).

Tôi có thể xoay vòng IP với cURL không?

Có, hai cách: gọi endpoint gateway xoay vòng của nhà cung cấp trong một vòng lặp để có một IP mới ở mỗi yêu cầu, hoặc lặp qua tệp danh sách proxy của riêng bạn với mỗi dòng một -x. Với cùng công việc đó trong Python, xem dùng proxy với Python requests.

J

Jasmine

Tác giả · Jasmine Daily

Người viết nên Jasmine Daily - ghi lại những suy nghĩ, trải nghiệm và những khoảnh khắc đời thường. Thật lòng, không vội vàng, không hoàn hảo.

Jasmine Daily

Vẫn còn nhiều điều đang chờ được đọc.

Nếu bài viết này chạm đến bạn, hãy ghé xem thêm vài trang khác trong cuốn nhật ký này.

Đọc tiếp

Bài viết liên quan