Nhu cầu:
- Chỉ cần thêm vài proxy cho mục đích crawl hay vượt qua chống bot.
- Muốn ổn định, tin cậy, làm chủ hoàn toàn.
Nói chung là chu cầu ít, đơn giản thì có thể tham khảo bài này. Nếu cần lượng lớn proxy để spam thì cân nhắc đi thuê, rất rẻ và linh hoạt.
Mình lựa chọn Tinyproxy nhé.
Thực tế:
- Thường các máy chủ đang chạy sẵn cách dịch vụ rồi: webserver, AI, database, backup, ...
Proxy chỉ là phụ, tuyệt đối không ảnh hưởng đến dịch vụ có sẵn.
Do đó lựa chọn sử dụng Tinyproxy tách biệt hoàn toàn apache hay nginx (nếu có).
A. CÀI ĐẶT TINYPROXY
1. Trên máy chủ
sudo apt update
sudo apt install tinyproxy -y
2. Cấu hình /etc/tinyproxy/tinyproxy.conf
Mở file:
sudo nano /etc/tinyproxy/tinyproxy.conf
Tìm và chỉnh:
Port 8888 # cổng proxy#Allow <IP_PC_CRAWL> # chỉ cho phép IP của PC crawl (ví dụ: 113.23.x.x)Allow 0.0.0.0/0 #Nếu bạn không biết IP nhà, tạm thời để tất cả để test.# Allow 127.0.0.1 bỏ luôn vì chỉ dùng proxy từ máy khác đếnThêm đoạn dưới (tùy chọn, để log nhỏ gọn):
LogLevel InfoMaxClients 50Lưu lại rồi restart:
sudo systemctl restart tinyproxysudo systemctl enable tinyproxy3. Mở port firewall
sudo ufw allow 8888/tcp
4. Mở port trên modem internet
Hình dưới là giao diện vào modem wifi và chỉnh sửa.

Application chọn HTTP_Server
Protocol ALL
Start Port: 8080
End Port: 8080
Local IP: 192.168.1.5
Start Port (Local): 3128
End Port (Local): 3128

5. Trên Crawl PC (ví dụ Windows)
#Không qua proxy --> lấy địa chỉ IP của Crawl PC để so sánh với bên dưới
curl https://api.ipify.org
#Qua proxy để check proxy
curl -x http://[IP của máy chủ]:8888 https://api.ipify.org -s
Nếu trả về IP public của Máy chủ cài proxy → tinyproxy OK.
6. Kiểm tra tiniproxy có đang chạy và truy cập không
sudo systemctl status tinyproxy --no-pagersudo ss -ltnp | grep tinyproxytail -n 50 /var/log/tinyproxy/tinyproxy.log
B. TỰ ĐỘNG CẬP NHẬT IP CỦA CRAWL PC VÀ GỬI MÁY CHỦ ĐỂ MÁY CHỦ TỰ CHỈ CẤP PHÉP CHO CRAWL PC
- Trên crawl PC, trong WSL ubuntu, tạo script để update lấy IP thật của CrawPC định kỳ "curl https://api.ipify.org"
- Nếu ip đã thay đổi Lưu ip này trong file IP_public_Crawl_PC.txt
- Nếu có update, gửi file này lên Máy chủ proxy /home/IP_public_Crawl_PC/IP_public_Crawl_PC.txt
- Tại Máy chủ proxy: định kỳ kiểm tra file /home/IP_public_Crawl_PC/IP_public_Crawl_PC.txt Nếu có thay đổi, cập nhật IP này vào file /etc/tinyproxy/tinyproxy.conf
- Sau đó chạy sudo systemctl restart tinyproxy
1. Trên Crawl PC (WSL Ubuntu)
1.1. Chuẩn bị SSH key để gửi file lên Máy chủ proxy
# Trong WSLsudo apt-get updatesudo apt-get install -y curl openssh-client
# Tạo key (nếu chưa có)test -f ~/.ssh/id_ed25519 || ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
# THÊM PUBLIC KEY LÊN Proxy (chạy lệnh này trong WSL, thay user/host cho đúng)Proxy_USER=root # đổi nếu Máy chủ proxy dùng user khácProxy_HOST=[IP của máy chủ proxy] # IP/hostname của máy chủ Proxyssh-copy-id -i ~/.ssh/id_ed25519.pub ${Proxy_USER}@${Proxy_HOST}
Trên Proxy đảm bảo đã có thư mục nhận file:
# Chạy trên Proxy (một lần)sudo mkdir -p /home/IP_public_Crawl_PCsudo chown ${USER:-root}:${USER:-root} /home/IP_public_Crawl_PC
1.2. Tạo script cập nhật IP & đẩy lên Proxy
Tạo file: /usr/local/bin/update-public-ip.sh
#!/usr/bin/env bashset -euo pipefail
# ======= CẤU HÌNH =======Proxy_USER="${Proxy_USER:-root}" # export Proxy_USER nếu cầnProxy_HOST="${Proxy_HOST:-[IP máy chủ proxy]}" # export Proxy_HOST nếu cầnREMOTE_DIR="/home/IP_public_Crawl_PC"LOCAL_DIR="${HOME}/.public_ip_cache"LOCAL_FILE="${LOCAL_DIR}/IP_public_Crawl_PC.txt"TMP_FILE="$(mktemp)"
mkdir -p "${LOCAL_DIR}"
# Lấy IP public hiện tạiCUR_IP="$(curl -fsS https://api.ipify.org || true)"
# Kiểm tra hợp lệ IPv4if [[ ! "${CUR_IP}" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then echo "[update-public-ip] IP không hợp lệ: '${CUR_IP}'" >&2 exit 0fi
# Đọc IP cũ (nếu có)OLD_IP=""[[ -f "${LOCAL_FILE}" ]] && OLD_IP="$(tr -d '\r\n' < "${LOCAL_FILE}")"
if [[ "${CUR_IP}" != "${OLD_IP}" ]]; then echo "${CUR_IP}" > "${TMP_FILE}" mv "${TMP_FILE}" "${LOCAL_FILE}" echo "[update-public-ip] IP thay đổi: ${OLD_IP:-<none>} -> ${CUR_IP}"
# Gửi lên Máy chủ Proxy scp -i "${HOME}/.ssh/id_ed25519" -q "${LOCAL_FILE}" \ "${Proxy_USER}@${Proxy_HOST}:${REMOTE_DIR}/IP_public_Crawl_PC.txt" && \ echo "[update-public-ip] Đã upload lên Máy chủ proxy: ${Proxy_HOST}:${REMOTE_DIR}/IP_public_Crawl_PC.txt"else echo "[update-public-ip] IP không đổi: ${CUR_IP}"fi
Cấp quyền chạy:
sudo chmod +x /usr/local/bin/update-public-ip.sh1.3. Đặt lịch chạy định kỳ (cron, 5 phút/lần)
( crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/update-public-ip.sh >> ${HOME}/update-public-ip.log 2>&1" ) | crontab -Kiểm tra log:
tail -f ~/update-public-ip.log
2. Trên máy chủ Proxy (Debian)
2.1. Thiết lập “khối ACL được quản lý” trong tinyproxy.conf (một lần)
Mở cấu hình:
sudo nano /etc/tinyproxy/tinyproxy.conf
Chèn (hoặc sửa) khối đánh dấu như dưới (đặt gần các dòng cấu hình Allow hiện có). Toàn bộ quyền truy cập sẽ chỉ dùng block này:
# ==== BEGIN MANAGED ACL (DO NOT EDIT MANUALLY) ====# Dòng này sẽ được script cập nhật tự động dựa trên /home/IP_public_Crawl_PC/IP_public_Crawl_PC.txt #Allow 127.0.0.1Allow 0.0.0.0 # placeholder initial, sẽ bị thay thế khi có IP thực# ==== END MANAGED ACL ====Nếu trong file đang có nhiều
Allow ...rải rác, bạn có thể comment chúng lại để tránh nhầm.
Giữ nguyên các cấu hình khác (Port/Listen…).
Gợi ý: để Tinyproxy chỉ cho IP crawl. Không cho ngay cả IP máy chủ Proxy: đã comment
#Allow 127.0.0.1.Listen 0.0.0.0(nếu expose trực tiếp). ACL vẫn do block trên quyết định.
Chỉnh sửa/thêm:
ConnectPort 443ConnectPort 80
# Ẩn dấu vết proxy (không cần AddHeader rỗng)
DisableViaHeader Yes
Restart để đảm bảo file hợp lệ:
sudo systemctl restart tinyproxysudo systemctl status tinyproxy --no-pager2.2. Tạo script đồng bộ ACL từ file IP
Tạo file: /usr/local/bin/sync-tinyproxy-acl.sh
#!/usr/bin/env bashset -euo pipefail
ACL_FILE="/home/IP_public_Crawl_PC/IP_public_Crawl_PC.txt"CONF="/etc/tinyproxy/tinyproxy.conf"BACKUP_DIR="/etc/tinyproxy/backup"MARK_BEGIN="# ==== BEGIN MANAGED ACL (DO NOT EDIT MANUALLY) ===="MARK_END="# ==== END MANAGED ACL ===="
mkdir -p "${BACKUP_DIR}"
# Đọc IP từ fileif [[ ! -f "${ACL_FILE}" ]]; then echo "[sync-acl] Không thấy ${ACL_FILE} — bỏ qua." exit 0fiNEW_IP="$(tr -d '\r\n' < "${ACL_FILE}")"
# Validate IPv4if [[ ! "${NEW_IP}" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then echo "[sync-acl] IP không hợp lệ: '${NEW_IP}' — bỏ qua." exit 0fi
# Lấy khối ACL hiện tại trong conf để so sánh (nếu có)CURRENT_BLOCK="$(awk -v s="${MARK_BEGIN}" -v e="${MARK_END}" ' $0==s {flag=1; print; next} $0==e {print; flag=0; next} flag {print}' "${CONF}" || true)"
# Tạo khối ACL mớiNEW_BLOCK="$(cat <<EOF${MARK_BEGIN}
#Allow 127.0.0.1Allow ${NEW_IP}${MARK_END}EOF)"
# Nếu giống nhau thì thôiif [[ "${CURRENT_BLOCK}" == "${NEW_BLOCK}" ]]; then echo "[sync-acl] ACL không đổi (IP=${NEW_IP}) — không restart." exit 0fi
# Backup và ghi file mớiTS="$(date +%Y%m%d-%H%M%S)"sudo cp -a "${CONF}" "${BACKUP_DIR}/tinyproxy.conf.${TS}.bak"
# Dựng file cấu hình mới với block ACL mới (thay thế giữa MARK_BEGIN..MARK_END; nếu chưa có, sẽ append)if grep -qF "${MARK_BEGIN}" "${CONF}"; then # thay thế block sudo awk -v s="${MARK_BEGIN}" -v e="${MARK_END}" -v repl="${NEW_BLOCK}" ' BEGIN{printed=0} $0==s {print repl; skip=1; next} $0==e {skip=0; next} skip==1 {next} {print} ' "${CONF}" | sudo tee "${CONF}.tmp" >/dev/nullelse # append block { cat "${CONF}"; echo ""; echo "${NEW_BLOCK}"; } | sudo tee "${CONF}.tmp" >/dev/nullfi
sudo mv "${CONF}.tmp" "${CONF}"
# Restart Tinyproxysudo systemctl restart tinyproxysleep 1if systemctl is-active --quiet tinyproxy; then echo "[sync-acl] Đã cập nhật ACL -> Allow ${NEW_IP}, restart tinyproxy OK."else echo "[sync-acl] CẢNH BÁO: tinyproxy không active sau restart! Khôi phục backup..." sudo cp -a "${BACKUP_DIR}/tinyproxy.conf.${TS}.bak" "${CONF}" sudo systemctl restart tinyproxy || true exit 1fi
Cấp quyền chạy:
sudo chmod +x /usr/local/bin/sync-tinyproxy-acl.sh2.3. Cron trên Máy chủ Proxy (5 phút/lần)
( sudo crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/sync-tinyproxy-acl.sh >> /var/log/sync-tinyproxy-acl.log 2>&1" ) | sudo crontab -Xem log:
sudo tail -f /var/log/sync-tinyproxy-acl.log
Giờ bạn chỉ cần chờ 5 phút thôi, và kiểm tra.
Sau đó Test từ Crawl PC:
curl -v -x http://[IP máy chủ proxy]:8888 https://api.ipify.org2.4. Xem log /var/log/tinyproxy/tinyproxy.log
tinyproxy:# tạo thư mục log nếu chưa có, cấp quyền cho user 'tinyproxy'sudo install -o tinyproxy -g tinyproxy -m 750 -d /var/log/tinyproxy# tạo file log rỗng, cấp quyền ghi cho tinyproxysudo install -o tinyproxy -g tinyproxy -m 640 /dev/null /var/log/tinyproxy/tinyproxy.log# (tuỳ) đảm bảo trong /etc/tinyproxy/tinyproxy.conf có:# LogFile "/var/log/tinyproxy/tinyproxy.log"# LogLevel Info# Syslog Off# rồi restartsudo systemctl restart tinyproxysudo systemctl status tinyproxy --no-pager
Xem log realtime:
sudo tail -f /var/log/tinyproxy/tinyproxy.logcurl -s -x http://<IP_MayChuProxy>:8888 https://httpbin.org/ip
curl -s -x http://<IP_MayChuProxy>:8888 https://httpbin.org/headers
Giám sát:
sudo tail -f /var/log/tinyproxy/tinyproxy.logsudo ss -ant '( sport = :8888 )' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | headNẾU KHÔNG THẤY LOG?
Log chưa có nghĩa là Tinyproxy chưa ghi log ra file, chứ không phải lỗi proxy đâu.
Ta có thể xử lý gọn bằng 2 bước để bật và kiểm tra log:
🧩 1. Tạo thư mục log và cấu hình lại Tinyproxy
sudo mkdir -p /var/log/tinyproxy sudo chown tinyproxy:tinyproxy /var/log/tinyproxyMở file cấu hình:
sudo nano /etc/tinyproxy/tinyproxy.confTìm và đảm bảo có các dòng sau (nếu thiếu thì thêm vào, không để dấu # phía trước):
LogFile "/var/log/tinyproxy/tinyproxy.log" LogLevel InfoThoát và lưu lại (Ctrl+O, Enter, Ctrl+X).
🧩 2. Khởi động lại dịch vụ
sudo systemctl restart tinyproxysudo systemctl status tinyproxy --no-pagerXem log realtime:
sudo tail -f /var/log/tinyproxy/tinyproxy.log- Đăng nhập để gửi ý kiến