0

Proxy dân cư tĩnh (ISP): khi nào nên thuê IP cố định thay vì xoay?

Hướng dẫn chọn IP cố định: whitelist với đối tác, tài khoản được phép quản lý, QA bản địa hoá, checkout, và thuê theo IP/tháng hay trả theo GB.


Công khai: Mình đang làm việc tại ipvora, một dịch vụ residential proxy. Toàn bộ code trong bài là code chung, chạy được với bất kỳ nhà cung cấp nào hỗ trợ HTTP/HTTPS/SOCKS5.

Proxy xoay phù hợp với thu thập dữ liệu công khai hay nghiên cứu thị trường: mỗi request có thể ra IP khác. Nhưng một số việc sẽ hỏng nếu IP thay đổi — đối tác chỉ nhận địa chỉ đã khai báo, tài khoản bạn được phép quản lý cần ổn định nhiều ngày, QA bản địa hoá chạy suốt sprint, hoặc cổng thanh toán xem việc đổi IP như tín hiệu bất thường.

Bài này trả lời: khi nào nên thuê proxy dân cư tĩnh (static residential / ISP proxy), tức một IP cố định, thay vì xoay? Mình so sánh rotating, sticky session và static, nêu khác biệt cách tính phí, rồi đưa ví dụ Python (requests và tuỳ chọn httpx) dùng biến môi trường.

1. Xoay, sticky session và IP cố định

  • Proxy dân cư xoay (rotating): mỗi request hoặc kết nối có thể ra IP khác. Thường tính phí theo GB. Phù hợp khi các trang bạn gọi độc lập với nhau.
  • Sticky session: vẫn thuộc nhóm xoay, nhưng nhà cung cấp giữ bạn trên cùng một IP trong cửa sổ ngắn. Với ipvora, phiên sticky giữ từ 1 đến 120 phút — đủ cho đăng nhập hay giỏ hàng trong một buổi, không phủ được việc kéo dài nhiều ngày.
  • Proxy dân cư tĩnh / ISP proxy (IP cố định): bạn thuê một IP dân dụng và giữ suốt kỳ thuê, thường theo tháng. IP không đổi trừ khi bạn đổi gói hoặc hết hạn.

Datacenter proxy (IP trung tâm dữ liệu) nhanh và thường rẻ hơn, nhưng nhiều website nhận ra đây là IP máy chủ nên nội dung có thể khác người dùng dân dụng.

2. Bốn tình huống nên chọn IP cố định

2.1 Whitelist IP với đối tác

Nhiều đối tác B2B — cổng thanh toán, API ngân hàng hoặc ví điện tử, nền tảng quảng cáo, hệ thống kho — chỉ nhận kết nối từ IP đã khai báo (whitelist). Rotating buộc bạn nhờ đối tác cập nhật mỗi lần IP đổi; sticky hết hạn sau cửa sổ phiên, trong khi duyệt whitelist thường mất hàng ngày. Với proxy tĩnh, bạn gửi một lần địa chỉ rồi giữ nguyên nhiều tuần.

2.2 Vận hành tài khoản bạn được phép quản lý

Gian hàng thương mại điện tử, tài khoản quảng cáo hay trang mạng xã hội của khách hàng thường theo dõi độ ổn định của IP. Cùng một tài khoản xuất hiện từ nhiều quốc gia, hoặc đổi IP liên tục trong ngày, có thể bị xem là chia sẻ tài khoản hay đăng nhập bất thường. Chỉ quản lý tài khoản bạn được phép quản lý — tài khoản công ty, khách đã ủy quyền, hoặc tài khoản thử nghiệm do đội ngũ bạn tạo.

2.3 QA bản địa hoá chạy dài ngày

Kiểm thử theo khu vực — tiếng Việt và giá VND khi ra IP Việt Nam, hoặc phiên bản tại Mỹ, Nhật Bản, châu Âu — ít khi xong trong một buổi. Đội QA thường chạy cùng bộ kịch bản suốt sprint để so sánh ảnh chụp, cookie và nội dung CDN theo vùng. Mỗi ngày một IP khác thêm biến số (nhà mạng, ASN, thành phố). ipvora có IP tại Việt Nam, Mỹ, Nhật Bản và các thị trường châu Âu; hãy xác nhận quốc gia đầu ra trước khi gắn kịch bản vào CI.

2.4 Luồng thanh toán / checkout khi IP đổi

Nhiều cổng thanh toán xem IP đổi giữa các bước (xem giỏ → điền địa chỉ → chọn phương thức → xác nhận) như tín hiệu gian lận, và có thể đối chiếu IP khi người dùng mở lại đơn vào ngày hôm sau. Sticky đủ cho một lần thanh toán trong cửa sổ phiên; nếu QA tạm dừng rồi chạy lại ngày mai, bạn cần IP cố định. Chỉ chạy trên staging, sandbox, hoặc production khi chủ hệ thống đã đồng ý — không dùng proxy để che vị trí nhằm vượt kiểm soát chống gian lận mà bạn không được phép kiểm thử.

3. So sánh rotating, sticky và static

Tiêu chí Rotating Sticky session Static / ISP
Thời gian giữ IP Có thể đổi mỗi request 1–120 phút (ví dụ ipvora) Nhiều ngày / tuần, suốt kỳ thuê
Cách tính phí Theo GB đã dùng Theo GB (cùng gói xoay) Theo IP mỗi tháng
Phù hợp khi Trang công khai độc lập Luồng ngắn nhiều bước trong một buổi Whitelist; tài khoản được phép quản lý lâu dài; QA bản địa hoá dài ngày; checkout nhạy cảm khi đổi IP
Lưu lượng (ví dụ ipvora) Tính theo GB; 10 gói từ 1 GB đến 5 TB Như cột rotating Không giới hạn trong thời hạn thuê
Băng thông (ví dụ ipvora) Không nêu riêng trên trang sản phẩm Không nêu riêng 5 Mbps mỗi IP
Giao thức HTTP, HTTPS, SOCKS5 HTTP, HTTPS, SOCKS5 HTTP, HTTPS, SOCKS5

Sticky không phải sản phẩm tách riêng, mà là cách dùng proxy xoay khi cần IP ổn định trong thời gian ngắn. Nếu nhu cầu đã vượt cửa sổ phiên, hãy thuê IP cố định thay vì cố kéo dài sticky.

4. Thuê theo IP/tháng hay trả theo GB?

Proxy xoay tính theo từng GB, hợp khi lưu lượng biến động và bạn cần nhiều IP. Proxy tĩnh trả mức cố định mỗi IP mỗi tháng; với ipvora, lưu lượng không giới hạn trong kỳ thuê. Nếu một IP phải bật cả ngày cho QA, hoặc vài người cùng dùng địa chỉ đã whitelist, tính theo tháng thường dễ dự toán hơn cộng từng GB.

Để dễ hình dung sự khác biệt, mình lấy bảng giá công khai của proxy dân cư tĩnh dành cho khách hàng Việt Nam làm mốc tham chiếu — nhà cung cấp khác sẽ có mức giá riêng, nhưng mô hình tính phí thường tương tự.

Với ipvora, proxy dân cư xoay tính phí theo dung lượng, gồm 10 gói từ 1 GB đến 5 TB: gói 1 GB giá $2.09 (thời hạn 30 ngày), gói 5 TB còn $1.39/GB. Từ các gói 100 GB trở lên, dung lượng còn lại không hết hạn. Thời gian giữ phiên (sticky) là 1–120 phút. Proxy dân cư tĩnh thuê theo tháng, khởi điểm từ $3.18/IP/tháng (một số khu vực có giá khác, ví dụ Hà Lan $4.88/IP/tháng), 5 Mbps mỗi IP và không giới hạn lưu lượng trong thời hạn thuê.

Chọn nhanh: nhiều trang độc lập, lưu lượng khó đoán → xoay, trả theo GB; luồng 15–90 phút cần cùng IP → sticky trên gói xoay; một hoặc vài IP phải giữ hàng tuần hay gắn whitelist → tĩnh, thuê theo IP/tháng.

5. HTTP, HTTPS và SOCKS5

Cả proxy xoay và proxy tĩnh của ipvora đều hỗ trợ HTTP, HTTPS và SOCKS5. Cách xác thực — user/password trong URL, cổng riêng, hay whitelist IP máy bạn — khác nhau giữa từng dashboard. Đừng đoán hostname hay cú pháp gateway; hãy lấy đúng giá trị từ trang quản trị bạn đang dùng.

Các ví dụ dưới đây chỉ dùng placeholder PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS từ biến môi trường. Với SOCKS5 trong requests, nên dùng scheme socks5h:// để DNS phân giải phía proxy (quan trọng khi kiểm thử theo vùng). Ký tự đặc biệt trong mật khẩu (@, :, #, …) cần urllib.parse.quote(..., safe="") trước khi ghép URL.

6. Python: xác nhận IP thật sự cố định

Trước khi gửi địa chỉ cho đối tác whitelist hoặc gắn vào bộ QA nhiều ngày, hãy kiểm tra IP không đổi qua nhiều lần gọi.

pip install "requests[socks]" "httpx[socks]"

export PROXY_USER="USERNAME"
export PROXY_PASS="PASSWORD"
export PROXY_HOST="PROXY_HOST"
export PROXY_PORT="PORT"

requests[socks] cài PySocks để hiểu URL socks5h://; httpx[socks] cài socksio nếu dùng SOCKS5 với httpx.

requests: kiểm tra IP giữ nguyên

import os
import time
from urllib.parse import quote

import requests


def proxy_url(scheme: str = "http") -> str:
    user = quote(os.environ["PROXY_USER"], safe="")
    password = quote(os.environ["PROXY_PASS"], safe="")
    host = os.environ["PROXY_HOST"]
    port = os.environ["PROXY_PORT"]
    return f"{scheme}://{user}:{password}@{host}:{port}"


def make_proxies() -> dict[str, str]:
    # Đổi scheme thành "socks5h" nếu bạn dùng SOCKS5
    url = proxy_url("http")
    return {"http": url, "https": url}


def get_exit_ip(session: requests.Session) -> str:
    resp = session.get("https://httpbin.org/ip", timeout=(5, 20))
    resp.raise_for_status()
    return resp.json()["origin"].split(",")[0].strip()


def verify_stable_ip(checks: int = 5, pause_s: float = 2.0) -> str:
    session = requests.Session()
    session.proxies.update(make_proxies())
    session.headers["User-Agent"] = "qa-static-check/1.0 (+mailto:you@example.com)"

    first_ip = get_exit_ip(session)
    for i in range(1, checks):
        time.sleep(pause_s)
        current = get_exit_ip(session)
        if current != first_ip:
            raise SystemExit(
                f"IP đã đổi ở lần kiểm tra {i + 1}: {first_ip} -> {current}. "
                "Đây không phải hành vi kỳ vọng của proxy tĩnh."
            )
    print(f"IP giữ nguyên sau {checks} lần kiểm tra: {first_ip}")
    return first_ip


if __name__ == "__main__":
    verify_stable_ip()

Nếu script báo IP đã đổi, đừng gửi địa chỉ đó cho đối tác: có thể bạn đang trỏ nhầm endpoint xoay hoặc lấy sai thông tin từ dashboard.

requests: mô phỏng các bước checkout trên cùng session

import os
from urllib.parse import quote

import requests


def proxy_url() -> str:
    user = quote(os.environ["PROXY_USER"], safe="")
    password = quote(os.environ["PROXY_PASS"], safe="")
    host = os.environ["PROXY_HOST"]
    port = os.environ["PROXY_PORT"]
    return f"http://{user}:{password}@{host}:{port}"


def run_checkout_qa() -> None:
    session = requests.Session()
    proxy = proxy_url()
    session.proxies = {"http": proxy, "https": proxy}
    session.headers["User-Agent"] = "checkout-qa/1.0 (+mailto:you@example.com)"
    timeout = (5, 20)

    # URL công khai chỉ để minh họa thứ tự bước, không phải cổng thanh toán thật.
    steps = [
        ("xem trang", "https://httpbin.org/html"),
        ("thêm vào giỏ (mô phỏng)", "https://httpbin.org/post"),
        ("trang thanh toán (mô phỏng)", "https://httpbin.org/headers"),
    ]

    for name, url in steps:
        if "giỏ" in name:
            resp = session.post(url, data={"item": "demo", "qty": "1"}, timeout=timeout)
        else:
            resp = session.get(url, timeout=timeout)
        resp.raise_for_status()
        print(name, resp.status_code, len(resp.content))


if __name__ == "__main__":
    run_checkout_qa()

requests.Session() giữ cookie giữa các bước, gần trình duyệt hơn là gọi requests.get rời. Khi kiểm thử hệ thống thật, thay URL bằng môi trường staging và tôn trọng robots.txt cùng điều khoản sử dụng.

httpx (tuỳ chọn): cùng bài kiểm tra IP ổn định

import os
from urllib.parse import quote

import httpx


def proxy_url() -> str:
    user = quote(os.environ["PROXY_USER"], safe="")
    password = quote(os.environ["PROXY_PASS"], safe="")
    host = os.environ["PROXY_HOST"]
    port = os.environ["PROXY_PORT"]
    return f"http://{user}:{password}@{host}:{port}"


def verify_stable_ip_httpx(checks: int = 5) -> str:
    timeout = httpx.Timeout(20.0, connect=5.0)
    headers = {"User-Agent": "qa-static-check/1.0 (+mailto:you@example.com)"}
    # httpx >= 0.26 dùng tham số `proxy`; bản cũ hơn dùng `proxies`
    with httpx.Client(proxy=proxy_url(), timeout=timeout, headers=headers) as client:
        first = client.get("https://httpbin.org/ip").json()["origin"].split(",")[0].strip()
        for i in range(1, checks):
            current = client.get("https://httpbin.org/ip").json()["origin"].split(",")[0].strip()
            if current != first:
                raise SystemExit(f"IP đã đổi ở lần {i + 1}: {first} -> {current}")
    print(f"IP giữ nguyên sau {checks} lần kiểm tra: {first}")
    return first


if __name__ == "__main__":
    verify_stable_ip_httpx()

Muốn dùng SOCKS5 với httpx, đổi scheme trong proxy_url() thành socks5:// (cần đã cài httpx[socks]).

7. Dùng proxy có trách nhiệm

Thuê IP cố định không thay đổi nghĩa vụ khi bạn gửi request nhân danh mình:

  1. Đọc robots.txt và điều khoản sử dụng (ToS) trước khi thu thập hoặc kiểm thử hàng loạt.
  2. Chỉ thu thập dữ liệu công khai. Không lấy dữ liệu cá nhân, không vượt tường đăng nhập hay paywall khi không được phép.
  3. Tuân thủ pháp luật về dữ liệu: tại Việt Nam, lưu ý Nghị định 13/2023/NĐ-CP về bảo vệ dữ liệu cá nhân; nếu dữ liệu liên quan người dùng ở EU thì xem thêm GDPR. Khi không chắc, hỏi bộ phận pháp lý.
  4. Chỉ quản lý những tài khoản bạn được phép quản lý.
  5. Không dùng IP tĩnh để né chặn, giả vị trí nhằm gian lận thanh toán, hay vượt rate limit.
  6. Đặt User-Agent có thông tin liên hệ để quản trị website có thể trao đổi với bạn.
from urllib.robotparser import RobotFileParser

rp = RobotFileParser()
rp.set_url("https://example.com/robots.txt")
rp.read()
user_agent = "checkout-qa/1.0"
url = "https://example.com/checkout"
if not rp.can_fetch(user_agent, url):
    raise SystemExit(f"robots.txt không cho phép: {url}")
print("Được phép theo robots.txt:", url)
print("Crawl-delay:", rp.crawl_delay(user_agent))

Tổng kết

  • Rotating khi các request độc lập và bạn cần nhiều IP; sticky khi một luồng ngắn cần cùng IP trong 1–120 phút; static/ISP khi phải giữ địa chỉ nhiều ngày hoặc nhiều tuần.
  • Bốn tín hiệu nên thuê IP cố định: whitelist với đối tác; tài khoản được phép quản lý lâu dài; QA bản địa hoá suốt chu kỳ kiểm thử; checkout bị gắn vân tay khi IP đổi giữa chừng.
  • Trước khi khai báo whitelist, hãy chạy đoạn kiểm tra IP ổn định. Dùng biến môi trường, đặt timeout, và tôn trọng robots.txt, ToS cùng pháp luật.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí