Sử dụng Tor để làm proxy server miễn phí cho crawler

Nội dung

Tạo proxy server với Tor và Privoxy để crawl website mà không lo bị chặn

Mở đầu

Cuộc chiến giữa những người quản trị website và những web crawler là những cuộc chiến không hồi kết. Một website chặn web crawler bằng cách chặn địa chỉ IP của nó. Vậy thì nếu crawler có thật nhiều IP là sẽ không lo bị chặn rồi đúng không? Thực tế mỗi mạng chỉ được cấp một public IP mà thôi nên muốn đổi địa chỉ IP thì chúng ta phải tìm tới proxy hoặc VPN. Có rất nhiều website cung cấp proxy miễn phí nhưng thường các proxy này có giới hạn và có thể dừng hoạt động giữa chừng. Trong bài viết này mình chọn Tor để tạo một proxy server.

Tại sao lại là Tor?

Tor hoạt động qua nhiều máy chủ trung gian, sau đó “đi ra” tại một exit node (ra từ exit node nào thì IP của bạn sẽ là IP của exit node đó) và thay đổi liên tục các máy chủ này nên chúng ta có thể thay đổi được địa chỉ IP liên tục. Chúng ta sẽ sử dụng thêm Privoxy để tạo web proxy và sử dụng Docker để việc cài đặt diễn ra nhanh nhất.

Tạo proxy server

Đã có sẵn nhiều docker image của tor và privoxy. Trong bài mình sẽ sử dụng image dockage/tor-privoxy.

Mở terminal và chạy câu lệnh sau:

docker run –name='tor-privoxy' -d \
-p 9050:9050 \
-p 9051:9051 \
-p 8118:8118 \
dockage/tor-privoxy:latest

Như vậy là bạn có đã có một proxy server, chỉ cần truy cập qua port 8118 (Privoxy – HTTP Proxy) hoặc port 9050 (Tor proxy – SOCKS5).

Tối ưu Tor khi sử dụng ở Việt Nam

Tuy nhiên vì muốn cải thiện tốc độ mạng của proxy server nên mình sẽ chỉnh sửa một chút để chỉ đi qua các entry node và đi ra từ các exit node của Việt Nam và các nước lận cận. Nếu bạn cần crawl rất nhiều dữ liệu thì tốc độ mạng là điều cần chú ý, do đặc điểm của mạng Tor là chậm do đi qua các node trung gian. Để làm điều đó thì. hãy tạo một Dockerfile với nội dung như sau:

FROM dockage/tor-privoxy:latest
LABEL maintainer="trandatdt"
RUN echo "EntryNodes {vn},{jp},{sg},{tw},{hk},{kr},{th}" >> /etc/tor/torrc \
&& echo "ExitNodes {vn},{jp},{sg},{tw},{hk},{kr},{th}" >> /etc/tor/torrc \
&& echo "MaxCircuitDirtiness 30" >> /etc/tor/torrc

Mở terminal tại thư mục lưu Dockerfile và build image bằng lệnh sau (chú ý dấu chấm ở cuối):

docker build -t my-tor-proxy .

trong đó:

  • EntryNodes {vn},{jp},{sg},{tw},{hk},{kr},{th}: chỉ sử dụng entry node tại Việt Nam (vn), Nhật Bản (jp), Singapore (sg), Đài Loan (tw), Hồng Kông (hk), Hàn Quốc (kr) và Thái Lan (th).
  • ExitNodes {vn},{jp},{sg},{tw},{hk},{kr},{th}: chỉ sử dụng các exit node tại các nước giống bên trên.
  • MaxCircuitDirtiness 30: thay đổi IP sau 30 giây. Bạn có thể set giá trị nhỏ hơn nhưng tối thiểu là 10 giây.

Bạn có thể tự thêm các config khác, đọc thêm tại đây.

  • Lưu ý là sử dụng config bên trên có thể làm mất anonymity (sự ẩn danh) của mạng Tor nhưng vấn đề mà bài viết này giải quyết là tạo một proxy server để crawler không bị chặn.

Chạy một docker container bằng lệnh sau:

docker run –name='my-tor-proxy-server' -d \
 -p 9050:9050 \
 -p 9051:9051 \
 -p 8118:8118 \
my-tor-proxy:latest

Như vậy chúng ta đã có 1 proxy server với các config như trên. Thử xem proxy server hoạt động hay chưa bằng lệnh sau (nhớ thay 192.168.1.45 bằng IP của bạn, không phải 127.0.0.1 nếu chạy trên local vì chúng ta đang chạy proxy server thông qua Docker):

curl -Lx http://192.168.1.45:8118 http://jsonip.com/

Kết quả sẽ giống như sau:

với 103.208.220.226 chính là IP sau khi bạn đi qua proxy server.

Kết luận

Qua bài các bạn đã có thể tạo được 1 proxy server sử dụng Tor + Privoxy + Docker. Hãy crawl văn minh, không nên request quá nhanh tránh ảnh hưởng tới server người ta.

Anthony Nguyễn

Cây bút chính tại VietnamTutor

Bài viết cùng chuyên mục

Git commit nhầm file: bỏ file khỏi commit an toàn

Bài viết hướng dẫn xử lý git commit nhầm file theo từng tình huống: chưa commit, đã commit chưa push, đã push lên remote, hoặc lỡ

Git reflog: khôi phục commit đã mất an toàn

Bài viết hướng dẫn dùng git reflog để khôi phục commit đã mất sau reset, rebase, amend hoặc xóa nhánh. Bạn sẽ biết cách đọc reflog,

Git pull bị conflict: cách sửa không mất code

Bài viết hướng dẫn cách xử lý git pull bị conflict theo từng bước: kiểm tra trạng thái, sửa file xung đột, test lại và hoàn

Next.js production performance: chọn SSR, SSG, ISR hay Edge

Bài viết giúp developer và tech lead chọn cách render phù hợp để tối ưu Next.js production performance mà không làm kiến trúc phức tạp quá

Nâng cấp Laravel 13: Checklist 10 bước cần kiểm tra

Hướng dẫn nâng cấp Laravel 13 chi tiết với checklist 10 bước. Từ kiểm tra PHP 8.3, cập nhật dependencies, đến xử lý lỗi thường gặp

Hardening Laravel production: Checklist bảo mật cần làm

Checklist hardening Laravel production toàn diện. Từ cấu hình server, database, SSL đến security headers, rate limiting và monitoring.

Authentication và authorization trong Laravel: Cách phân biệt

Hướng dẫn chi tiết cách xây dựng hệ thống Authentication (xác thực) và Authorization (phân quyền) trong Laravel với Breeze, Fortify, Sanctum, Policies và Gates.

Bảo mật Laravel: 10 lỗi phổ biến và cách phòng tránh

Hướng dẫn 10 lỗi bảo mật phổ biến nhất trong Laravel và cách phòng tránh hiệu quả. Từ XSS, SQL injection đến authentication vulnerabilities.

Migration PHP Attributes Laravel 13: Hướng Dẫn Chi Tiết

Cách chuyển đổi từ protected properties sang PHP Attributes trong Laravel 13 với hướng dẫn từng bước và code examples chi tiết.

Laravel 13 có gì mới? Các thay đổi cần biết

Laravel 13 ra mắt ngày 17/3/2026 với PHP 8.3, PHP Attributes, AI SDK và nhiều cải tiến. Khám phá chi tiết các tính năng mới của

Kubernetes cho người mới: Hướng dẫn nhập môn

Kubernetes (K8s) là nền tảng container orchestration phổ biến nhất hiện nay. Bài hướng dẫn này sẽ giúp bạn hiểu Kubernetes là gì, kiến trúc cơ

Docker Compose best practices: 10 cách cấu hình tốt hơn

Docker Compose giúp bạn quản lý multi-container applications dễ dàng hơn. Bài viết này tổng hợp 10 best practices quan trọng nhất để sử dụng Docker