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

tor-proxy

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 thường 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 nào? (Không đúng lắm, thử nghĩ xem nếu 1 tài khoản được truy cập liên tục từ nhiều IP thì có bị chặn không. Nhưng trong bài viết này mình chỉ đề cập tới khía cạnh chặn IP ?). 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. 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). 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ị tùy ý 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 https://2019.www.torproject.org/docs/tor-manual.html.en. * 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:

check current ip address with command line

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

ip location

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 khác. ✌

#tor #privoxy #proxy