Website được thiết kế tối ưu cho thành viên chính thức. Hãy Đăng nhập hoặc Đăng ký để truy cập đầy đủ nội dung và chức năng. Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "KSNK" các nội dung bạn quan tâm.

Tạo proxy trên máy chủ có sẵn bằng Tinyproxy

ICT

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 đến
 

Thêm đoạn dưới (tùy chọn, để log nhỏ gọn):

LogLevel Info
MaxClients 50
 

Lưu lại rồi restart:

sudo systemctl restart tinyproxy
sudo systemctl enable tinyproxy

3. 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-pager
sudo ss -ltnp | grep tinyproxy
tail -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

Việc mở proxy ra ngoài rất rủi ro cho máy chủ. Trong khi máy chủ đang chạy các dịch vụ khác. Do đó chúng ta chỉ cho phép duy nhất Crawl PC được phép sử dụng Proxy.
Nhưng IP của Crawl PC thường không cố định, dù chúng ta thường dùng máy bàn, wifi nhà để dùng.
Do đó cần cập nhật IP này và gửi IP này đến máy chủ proxy. Và khi có cập nhật IP thì máy chủ proxy cần tự cập nhật file cấu hình cho phép (thay) IP mới này.
Đây là định hướng:
  • 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 WSL
sudo apt-get update
sudo 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ác
Proxy_HOST=[IP của máy chủ proxy]   # IP/hostname của máy chủ Proxy
ssh-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_PC
sudo 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 bash
set -euo pipefail

# ======= CẤU HÌNH =======
Proxy_USER="${Proxy_USER:-root}"           # export Proxy_USER nếu cần
Proxy_HOST="${Proxy_HOST:-[IP máy chủ proxy]}"    # export Proxy_HOST nếu cần
REMOTE_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ại
CUR_IP="$(curl -fsS https://api.ipify.org || true)"

# Kiểm tra hợp lệ IPv4
if [[ ! "${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 0
fi

# Đọ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.sh

 

1.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.1
Allow 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 443
ConnectPort 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 tinyproxy
sudo systemctl status tinyproxy --no-pager

2.2. Tạo script đồng bộ ACL từ file IP

Tạo file: /usr/local/bin/sync-tinyproxy-acl.sh

 

#!/usr/bin/env bash
set -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ừ file
if [[ ! -f "${ACL_FILE}" ]]; then
 echo "[sync-acl] Không thấy ${ACL_FILE} — bỏ qua."
 exit 0
fi
NEW_IP="$(tr -d '\r\n' < "${ACL_FILE}")"

# Validate IPv4
if [[ ! "${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 0
fi

# 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ới
NEW_BLOCK="$(cat <<EOF
${MARK_BEGIN}
#Allow 127.0.0.1
Allow ${NEW_IP}
${MARK_END}
EOF
)"

# Nếu giống nhau thì thôi
if [[ "${CURRENT_BLOCK}" == "${NEW_BLOCK}" ]]; then
 echo "[sync-acl] ACL không đổi (IP=${NEW_IP}) — không restart."
 exit 0
fi

# Backup và ghi file mới
TS="$(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/null
else
 # append block
 { cat "${CONF}"; echo ""; echo "${NEW_BLOCK}"; } | sudo tee "${CONF}.tmp" >/dev/null
fi

sudo mv "${CONF}.tmp" "${CONF}"

# Restart Tinyproxy
sudo systemctl restart tinyproxy
sleep 1
if 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 1
fi
 

 

Cấp quyền chạy:

sudo chmod +x /usr/local/bin/sync-tinyproxy-acl.sh

 

2.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.org
Kết quả sẽ ra [IP máy chủ proxy]
 

2.4. Xem log /var/log/tinyproxy/tinyproxy.log

Sửa quyền và tạo thư mục/file đúng owner 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 tinyproxy
sudo 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 restart
sudo systemctl restart tinyproxy
sudo systemctl status tinyproxy --no-pager

 

Xem log realtime:

sudo tail -f /var/log/tinyproxy/tinyproxy.log
Sẽ thấy được log
 
Các test khác:

curl -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.log
sudo ss -ant '( sport = :8888 )' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head
 

NẾ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/tinyproxy

Mở file cấu hình:

 
sudo nano /etc/tinyproxy/tinyproxy.conf

Tì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 Info

Thoát và lưu lại (Ctrl+O, Enter, Ctrl+X).


🧩 2. Khởi động lại dịch vụ

 
sudo systemctl restart tinyproxy
sudo systemctl status tinyproxy --no-pager
 

Xem log realtime:

sudo tail -f /var/log/tinyproxy/tinyproxy.log
Sẽ thấy được log