Hướng dẫn
Cách dùng proxy với cURL: ví dụ lệnh cho HTTP, HTTPS và SOCKS5
Trong cURL, proxy được khai báo bằng tham số -x, thông tin đăng nhập ghi trong URL hoặc đưa riêng bằng -U. Request HTTPS qua HTTP proxy, khác biệt giữa socks5 và socks5h, biến môi trường và .curlrc, kiểm tra IP đầu ra và đo thời gian, lệnh trên Windows và các lỗi proxy thường gặp trong cURL.
Tóm tắt nhanh
- Trong cURL, proxy được đưa bằng tham số -x (--proxy): curl -x "http://USER:[email protected]:8989" https://api.ipify.org; thông tin đăng nhập có thể ghi trong URL hoặc đưa riêng bằng -U "USER:PASSWORD".
- Dù site đích là HTTPS, địa chỉ HTTP proxy vẫn viết bằng http://; cURL gửi CONNECT tới proxy và TLS được thiết lập bên trong tunnel. Scheme https:// nghĩa là nói chuyện TLS với cả proxy server.
- Với SOCKS5, socks5:// phân giải tên miền trên máy cục bộ, socks5h:// phân giải phía proxy; để truy vấn DNS không đi ra từ mạng nội bộ, hãy dùng socks5h:// hoặc --socks5-hostname.
- Với HTTP, cURL chỉ đọc biến http_proxy viết thường; HTTPS_PROXY, ALL_PROXY và NO_PROXY cũng được hỗ trợ. -x trên dòng lệnh ghi đè biến môi trường.
- Trong Windows PowerShell 5.1, curl là bí danh của Invoke-WebRequest; trong lệnh proxy hãy gõ curl.exe, còn trong cmd.exe địa chỉ được viết trong dấu ngoặc kép.
Để dùng proxy trong cURL, bạn thêm tham số -x (tên dài là --proxy) kèm địa chỉ proxy vào request: curl -x "http://USER:[email protected]:8989" https://api.ipify.org. Với HTTP proxy, địa chỉ được viết bằng scheme http://, với SOCKS5 proxy là socks5h://; việc site đích dùng HTTPS không làm thay đổi địa chỉ proxy.
Cùng một lệnh chạy được trên Linux, macOS và Windows. Nếu địa chỉ IP trả về là IP đầu ra của proxy, nghĩa là kết nối, xác thực và tunnel đã được thiết lập đúng. Các ví dụ dùng địa chỉ gateway của WeProxy là gw.weproxy.com.tr:8989; USER và PASSWORD là thông tin đăng nhập trong bảng điều khiển của bạn.
Cách cấu hình proxy trong cURL? Tham số -x và -U
Tham số -x nhận địa chỉ proxy theo dạng [scheme://][tên_đăng_nhập:mật_khẩu@]host[:port]. Bạn có thể ghi thông tin đăng nhập ngay trong địa chỉ hoặc đưa riêng bằng -U (--proxy-user):
curl -x "http://USER:[email protected]:8989" https://api.ipify.org
curl -x "http://gw.weproxy.com.tr:8989" -U "USER:PASSWORD" https://api.ipify.org
Hai lệnh gửi cùng một request. Khác biệt chỉ lộ ra khi mật khẩu có ký tự đặc biệt. Trong URL, mật khẩu chứa @, :, # hoặc % phải được viết bằng percent-encoding (@ → %40). Còn -U tách giá trị tại ký tự : đầu tiên; miễn là tên đăng nhập không chứa :, bạn có thể ghi mật khẩu nguyên dạng, không cần mã hóa. Quy tắc mã hóa và các dạng dòng khác được giải thích trong hướng dẫn định dạng proxy.
Theo tài liệu cURL, nếu giá trị -x không có scheme thì địa chỉ được coi là HTTP proxy, và nếu không ghi port thì cURL dùng 1080. Gateway của WeProxy chờ kết nối ở port khác, vì vậy hãy ghi port rõ ràng trong mọi lệnh. Nếu proxy cấp quyền bằng whitelist IP thì không cần thông tin đăng nhập: chỉ curl -x "http://gw.weproxy.com.tr:8989" https://api.ipify.org là đủ. Sản phẩm WeProxy nào hỗ trợ phương thức nào được liệt kê theo từng sản phẩm trong hướng dẫn xác thực proxy.
Mật khẩu gõ trên dòng lệnh có thể bị lưu vào lịch sử shell và hiện trong danh sách tiến trình của hệ thống. Trên server dùng chung, hãy đọc mật khẩu từ biến môi trường:
export PROXY_PASS='PASSWORD'
curl -x "http://gw.weproxy.com.tr:8989" -U "USER:$PROXY_PASS" https://api.ipify.org
Cách gửi request HTTPS qua HTTP proxy bằng cURL?
Khi truy cập một site HTTPS qua HTTP proxy, địa chỉ proxy vẫn được viết bằng http://. Trước tiên cURL gửi tới proxy request CONNECT api.ipify.org:443. Nếu proxy trả về 200, kết nối TLS được thiết lập trực tiếp với site đích bên trong tunnel này. Proxy không thấy chứng chỉ của site đích hay nội dung trang; nó chỉ biết bạn kết nối tới host và port nào.
Nếu đích bắt đầu bằng http://, cURL không mở tunnel. Nó gửi request kèm URL đầy đủ tới proxy, và proxy tự đi tới đích. Muốn request HTTP thường cũng đi qua tunnel, hãy thêm -p (--proxytunnel):
curl -p -x "http://USER:[email protected]:8989" http://example.com
Dùng -v để xem những gì được gửi đi. Dòng bắt đầu bằng > là dữ liệu gửi đi, dòng bắt đầu bằng < là dữ liệu nhận về. Một ví dụ rút gọn (chi tiết thay đổi theo phiên bản cURL):
> CONNECT api.ipify.org:443 HTTP/1.1
> Proxy-Authorization: Basic ...
< HTTP/1.1 200 Connection established
* CONNECT tunnel established, response 200
> GET / HTTP/2
< HTTP/2 200
Dòng < đầu tiên là phản hồi của proxy, các dòng < sau đó là phản hồi của site đích. Nếu phản hồi CONNECT là 407, vấn đề nằm ở thông tin đăng nhập. Nếu tunnel được thiết lập với 200 mà site đích trả về 403 hoặc 429, proxy vẫn hoạt động và lệnh từ chối đến từ site đích.
Viết địa chỉ proxy bằng https:// nghĩa là cURL sẽ nói chuyện TLS với cả proxy server (HTTPS proxy). Nếu proxy không hỗ trợ, bước bắt tay thất bại và bạn nhận curl: (35). Khi cần gửi một header riêng cho proxy, hãy dùng --proxy-header thay cho -H; header của -H đi tới site đích.
Cách dùng SOCKS5 proxy với cURL? Khác biệt giữa socks5 và socks5h
Với SOCKS5, chỉ có scheme thay đổi. cURL nhận hai scheme:
curl -x "socks5://USER:[email protected]:8989" https://api.ipify.org
curl -x "socks5h://USER:[email protected]:8989" https://api.ipify.org
socks5:// phân giải tên miền đích trên máy của bạn rồi gửi địa chỉ IP cho proxy. socks5h:// chuyển nguyên tên miền cho proxy, và việc phân giải DNS diễn ra phía proxy. Với scheme thứ hai, truy vấn DNS của bạn không đi ra từ mạng nội bộ, và tên miền đích được phân giải theo quốc gia nơi đặt proxy. Nếu bạn thấy nội dung theo vùng địa lý hoặc muốn chặn rò rỉ DNS, hãy dùng socks5h://. Cách đo rò rỉ được trình bày trong hướng dẫn về rò rỉ DNS.
Trong các lệnh cũ, bạn sẽ gặp những tham số riêng làm cùng việc này: --socks5 tương đương socks5:// phân giải cục bộ, còn --socks5-hostname tương đương socks5h://. Với các tham số này, hãy đưa thông tin đăng nhập bằng -U:
curl --socks5-hostname "gw.weproxy.com.tr:8989" -U "USER:PASSWORD" https://api.ipify.org
Phần lớn sản phẩm WeProxy hỗ trợ cả HTTP lẫn SOCKS5. Endpoint của mobile proxy chỉ hỗ trợ HTTP; nếu viết sản phẩm này bằng socks5://, kết nối sẽ không thiết lập được. Giao thức nào hợp với việc nào được so sánh trong bài HTTP vs SOCKS5.
So sánh các tham số proxy của cURL
| Tham số | Chức năng | Ví dụ |
|---|---|---|
-x, --proxy | Đưa địa chỉ và giao thức của proxy | -x "http://gw.weproxy.com.tr:8989" |
-U, --proxy-user | Tên đăng nhập và mật khẩu proxy | -U "USER:PASSWORD" |
-p, --proxytunnel | Gửi cả request HTTP thường qua tunnel CONNECT | -p -x ... http://example.com |
--socks5-hostname | SOCKS5, DNS ở phía proxy (giống socks5h://) | --socks5-hostname gw.weproxy.com.tr:8989 |
--socks5 | SOCKS5, DNS ở máy cục bộ (giống socks5://) | --socks5 gw.weproxy.com.tr:8989 |
--proxy-header | Header chỉ gửi tới proxy | --proxy-header "X-Test: 1" |
--noproxy | Các host đi thẳng, không qua proxy | --noproxy "localhost,127.0.0.1" |
--connect-timeout | Giới hạn thời gian thiết lập kết nối (giây) | --connect-timeout 10 |
-m, --max-time | Giới hạn thời gian cho toàn bộ thao tác (giây) | -m 30 |
Nếu trong một lệnh bạn đưa cả -x lẫn --socks5, tham số cuối cùng sẽ có hiệu lực. Để tránh nhầm lẫn, hãy chọn một cách duy nhất; trong script, -x với URL có scheme là cách dễ đọc nhất.
Thiết lập proxy cố định bằng biến môi trường và .curlrc
Nếu không muốn ghi -x vào từng lệnh, hãy khai báo các biến môi trường mà cURL đọc:
export http_proxy="http://USER:[email protected]:8989"
export HTTPS_PROXY="http://USER:[email protected]:8989"
export NO_PROXY="localhost,127.0.0.1"
curl https://api.ipify.org
Với request HTTP, cURL chỉ đọc biến http_proxy viết thường; HTTP_PROXY viết hoa bị bỏ qua vì lý do bảo mật. Với HTTPS có thể dùng HTTPS_PROXY hoặc https_proxy, với mọi giao thức là ALL_PROXY. Các host trong danh sách NO_PROXY đi thẳng, không qua proxy. -x trên dòng lệnh ghi đè biến môi trường; còn --noproxy "*" tắt hẳn proxy cho request đó.
Thiết lập tương tự cũng có thể ghi vào file cấu hình riêng của từng người dùng. Trên Linux và macOS là ~/.curlrc:
proxy = "http://gw.weproxy.com.tr:8989"
proxy-user = "USER:PASSWORD"
Trên Windows, cURL tìm file với tên .curlrc hoặc _curlrc trong thư mục người dùng (%USERPROFILE% hoặc %APPDATA%). Nếu bạn đặt -q làm đối số đầu tiên của lệnh, cURL sẽ không đọc file này. Khi thấy một script đi ra qua proxy mà bạn không ngờ tới, hãy kiểm tra biến môi trường và file .curlrc trước.
Kiểm tra IP đầu ra của proxy bằng cURL như thế nào?
Cách kiểm tra nhanh nhất là gửi request qua proxy tới một dịch vụ trả về địa chỉ IP của bạn dưới dạng văn bản thuần:
curl -s -x "http://USER:[email protected]:8989" "https://api.ipify.org?format=json"
Nếu địa chỉ trả về là IP của chính bạn, request đã không đi qua proxy. Khi đó hãy xem giá trị NO_PROXY, địa chỉ -x và kiểm tra xem dòng lệnh bạn đang nhìn có đúng là dòng thực sự được chạy không. Để xem quốc gia, thành phố và mạng của IP, hãy dán địa chỉ vào công cụ IP lookup; còn My IP hiển thị IP đầu ra qua proxy của trình duyệt.
Để kiểm tra cách một gateway rotating đổi IP, hãy chạy cùng một lệnh nhiều lần liên tiếp. Mỗi lần gọi curl mở một kết nối mới, nên với pool đổi IP theo từng request, mỗi dòng sẽ cho một IP khác:
for i in 1 2 3 4 5; do
curl -s -x "http://USER:[email protected]:8989" https://api.ipify.org
echo
done
Nếu bạn có danh sách dạng host:port:user:pass lấy từ bảng điều khiển, một vòng lặp Bash ngắn thử từng dòng sẽ cho biết proxy nào đang chạy:
while IFS=: read -r host port user pass; do
printf '%s:%s -> ' "$host" "$port"
curl -s -m 15 -x "http://$host:$port" -U "$user:$pass" https://api.ipify.org || printf 'LOI'
echo
done < proxies.txt
read đưa phần còn lại của dòng vào biến cuối cùng; dù mật khẩu có :, nó vẫn nằm trọn trong pass. Vì dùng -U nên bạn cũng không phải percent-encode mật khẩu. -m 15 ngăn một dòng không phản hồi làm treo cả vòng lặp.
Nếu cần giữ nguyên một IP trong một khoảng thời gian (đăng nhập, giỏ hàng, form nhiều bước), trong pool residential và mobile của WeProxy bạn thêm một session ID vào tên đăng nhập. Ở pool residential, IP đầu ra có thể được giữ cố định tới 24 giờ, ở pool mobile tới 60 phút. Dạng đầy đủ của tên đăng nhập khác nhau theo sản phẩm, nên hãy sao chép nó từ bảng điều khiển rồi kiểm tra bằng vòng lặp ở trên xem IP có giữ nguyên không. Việc nào cần IP cố định, việc nào cần IP xoay được giải thích theo từng tình huống trong hướng dẫn sticky và rotating proxy.
Để biết kết nối mất thời gian ở bước nào, hãy in các số đo thời gian bằng -w:
curl -s -o /dev/null -x "http://USER:[email protected]:8989" \
-w "connect=%{http_connect} http=%{http_code} tcp=%{time_connect}s tls=%{time_appconnect}s ttfb=%{time_starttransfer}s total=%{time_total}s\n" \
https://api.ipify.org
%{http_connect} cho phản hồi CONNECT của proxy, %{http_code} cho phản hồi của site đích. time_connect là thời điểm kết nối TCP tới proxy hoàn tất, time_appconnect là thời điểm bắt tay TLS với site đích hoàn tất. Nếu tổng thời gian cao mà time_connect thấp, bạn tới được proxy nhanh; độ trễ nằm ở phía sau tunnel hoặc ở site đích. Để kiểm tra riêng một dòng mà không phụ thuộc vào code, bạn cũng có thể dùng proxy checker.
Dùng proxy với cURL trên Windows
Trên Windows 10 và 11, curl.exe có sẵn cùng hệ thống. Nhưng trong Windows PowerShell 5.1, gõ curl sẽ chạy Invoke-WebRequest, một lệnh khác hẳn cURL với bộ tham số riêng. Trong PowerShell, hãy luôn gõ curl.exe:
curl.exe -x "http://USER:[email protected]:8989" https://api.ipify.org
Trong Command Prompt (cmd.exe), dấu nháy đơn không được tính là dấu ngoặc kép. Hãy viết địa chỉ trong dấu ngoặc kép. Ký tự nối dòng ở cmd.exe là ^, ở PowerShell là dấu backtick (trong Bash là \). Biến môi trường cũng được khai báo khác nhau tùy shell:
# PowerShell
$env:HTTPS_PROXY = "http://USER:[email protected]:8989"
curl.exe https://api.ipify.org
:: cmd.exe
set HTTPS_PROXY=http://USER:[email protected]:8989
curl https://api.ipify.org
Trong cmd.exe, nếu mật khẩu chứa %, ^ hoặc &, shell sẽ diễn giải các ký tự này. Hãy đưa mật khẩu như vậy bằng -U trong dấu ngoặc kép, hoặc ghi vào URL bằng percent-encoding. cURL không đọc thiết lập proxy hệ thống của Windows; để cài đặt cho toàn hệ thống, hãy xem trang tích hợp Windows.
Lỗi proxy trong cURL và cách khắc phục
Khi cURL báo lỗi, con số ở đầu dòng (mã thoát) cho biết vấn đề nằm ở bước nào:
| Lỗi | Ý nghĩa | Cách khắc phục |
|---|---|---|
curl: (5) Could not resolve proxy | Không phân giải được tên host của proxy | Kiểm tra tên gateway và DNS cục bộ |
curl: (7) Failed to connect | Không kết nối được tới port của proxy | Ghi port rõ ràng, kiểm tra tường lửa |
curl: (56) CONNECT tunnel failed, response 407 | Proxy không chấp nhận thông tin đăng nhập | Kiểm tra tên đăng nhập, mật khẩu và percent-encoding |
curl: (35) lỗi TLS | Proxy được viết bằng https:// hoặc tunnel không thiết lập được | Đổi scheme của proxy thành http:// |
curl: (97) | Bắt tay SOCKS thất bại | Kiểm tra sản phẩm có hỗ trợ SOCKS5 không và thông tin đăng nhập |
curl: (28) | Hết thời gian chờ | Tách riêng thời gian --connect-timeout và -m, thử lại |
| Vẫn trả về IP của bạn | Request không đi tới proxy | Kiểm tra NO_PROXY, .curlrc và giá trị -x |
Với lỗi mạng tạm thời, bạn có thể thêm --retry 3 --retry-delay 2 để cURL tự gửi lại request. --retry chỉ hoạt động với những lỗi được coi là tạm thời; thử lại một lỗi cố định như 407 không thay đổi kết quả. Mã trạng thái đến từ tầng nào và với từng mã nên kiểm tra gì trước được giải thích chi tiết trong hướng dẫn mã lỗi proxy. Khi chuyển sang gửi cùng các request bằng code, ví dụ trong bài dùng proxy trong Python dùng đúng dạng địa chỉ này.
Khi gửi request hàng loạt bằng cURL, hãy tuân thủ điều khoản sử dụng của site đích và file robots.txt; nếu bạn thu thập dữ liệu cá nhân, các nghĩa vụ theo GDPR và quy định bảo vệ dữ liệu cá nhân tại địa phương vẫn áp dụng. Những cách sử dụng được phép với dịch vụ WeProxy được ghi trên trang chính sách sử dụng chấp nhận được. Nếu cần IP mới ở mỗi request, hãy xem các gói trên trang rotating residential proxy; nếu cần một địa chỉ đầu ra cố định, xem trang IPv4 datacenter tĩnh.
Câu hỏi thường gặp
Cấu hình proxy trong cURL như thế nào?
Thêm địa chỉ proxy vào request bằng tham số -x: curl -x "http://USER:[email protected]:8989" https://api.ipify.org. Nếu muốn đưa thông tin đăng nhập riêng, hãy viết -x "http://gw.weproxy.com.tr:8989" -U "USER:PASSWORD". Khi không có scheme, cURL coi địa chỉ là HTTP proxy, và khi không ghi port thì dùng 1080; vì vậy hãy luôn ghi port rõ ràng. Nếu IP trả về là IP đầu ra của proxy, thiết lập đã đúng.
Với site HTTPS, địa chỉ proxy có phải viết bằng https:// không?
Không, trong đa số trường hợp vẫn viết bằng http://. Scheme mô tả giao thức của proxy server, không phải của site đích. Với đích HTTPS, cURL gửi request CONNECT tới proxy và thiết lập kết nối TLS với site đích bên trong tunnel này. Viết địa chỉ proxy bằng https:// nghĩa là cURL sẽ nói chuyện TLS với cả chính proxy; nếu proxy không hỗ trợ, bạn sẽ nhận lỗi curl: (35).
Khác biệt giữa socks5 và socks5h trong cURL là gì?
Cả hai đều kết nối tới cùng một SOCKS5 proxy; khác biệt nằm ở việc phân giải DNS. socks5:// hoặc --socks5 phân giải tên miền đích trên máy của bạn rồi gửi địa chỉ IP cho proxy. socks5h:// hoặc --socks5-hostname chuyển tên miền cho proxy, và việc phân giải diễn ra phía proxy. Cách thứ hai giữ cho truy vấn DNS không đi ra từ mạng nội bộ và để tên miền đích được phân giải theo vị trí của proxy.
Vì sao cURL báo lỗi 407?
Thông báo curl: (56) CONNECT tunnel failed, response 407 cho thấy proxy không chấp nhận thông tin đăng nhập. Hãy sao chép lại tên đăng nhập và mật khẩu từ bảng điều khiển. Nếu mật khẩu có các ký tự như @, : hoặc %, hãy viết chúng bằng percent-encoding trong URL, hoặc đưa thông tin đăng nhập riêng bằng -U "USER:PASSWORD". Nếu dùng whitelist IP, hãy kiểm tra IP mà request đi ra đã được đăng ký trong bảng điều khiển chưa.
Làm sao dùng proxy mà không phải ghi vào từng lệnh cURL?
Hãy khai báo biến môi trường: trên Linux và macOS là export HTTPS_PROXY="http://USER:[email protected]:8989", trong PowerShell là $env:HTTPS_PROXY. Với request HTTP cần biến http_proxy viết thường. Để thiết lập cố định, bạn có thể thêm các dòng proxy và proxy-user vào file ~/.curlrc. Dùng NO_PROXY để loại trừ một số host, và --noproxy "*" để tắt proxy cho một request.









