TL;DR

Surf (github.com/enetx/surf, MIT, v1.0.199 — 24/04/2026) là HTTP client cho Go gói toàn bộ kỹ thuật anti-detection vào một fluent API: impersonate Chrome v145 / Firefox v148, fingerprint JA3/JA4 cho ~14 phiên bản Chrome và 9 Firefox, full HTTP/3 over QUIC với QUIC fingerprinting, SOCKS5-UDP proxy, DNS-over-TLS với 11 provider sẵn, và quan trọng nhất — .Std() trả về *net/http.Client chuẩn để mọi lib khác (gocolly, OAuth2, …) tự động hưởng lợi. Yêu cầu Go 1.25+.

Cái mới đáng chú ý

Cardinal sin của hầu hết Go scraper là dùng net/http mặc định: TLS ClientHello của Go runtime khác Chrome rõ rệt, HTTP/2 SETTINGS frame có ordering không giống browser, và header order bị Go map shuffle. Cloudflare, Akamai Bot Manager, DataDome chỉ cần một trong ba dấu hiệu là chặn.

Surf giải quyết cả ba lớp đồng thời, và bổ sung lớp thứ tư mà ít thư viện nào chạm: HTTP/3 QUIC fingerprinting. Lib backend là enetx/uquic — một fork của quic-go cho phép tuỳ biến Initial Packet để tránh QUIC fingerprint từ DPI hiện đại.

Vì sao nó quan trọng

Trong 12 tháng qua các anti-bot vendor đã chuyển trọng tâm từ JA3 (đã loud) sang JA4, JA4H, HTTP/2 priority frames và QUIC Initial Packet. Một fingerprint match Chrome ở tầng TLS nhưng "Go" ở tầng QUIC là red flag rõ. Surf đóng cả stack: TLS ClientHello (qua uTLS) + HTTP/2 SETTINGS + WebKit multipart boundary + QUIC Initial Packet — tức là toàn bộ "giọng nói" của Chrome trên dây.

Với red team, đây là transport layer rất khó flag: traffic blend thẳng vào HTTP/3 thật. Với scraper, đây là cứu cánh đỡ phải bật headless Chrome (đắt RAM/CPU gấp 50–100 lần một Go client).

Sự thật kỹ thuật

Hạng mụcThông số
Phiên bảnv1.0.199 (24/04/2026)
LicenseMIT
Go tối thiểu1.25+
Browser presetChrome v145, Firefox v148; OS: Windows / macOS / Linux / Android / iOS / RandomOS
JA3/JA4 preset14 Chrome (Chrome58…Chrome145, kèm Chrome120PQ post-quantum), 9 Firefox, 3 Edge, Safari, IOS11–14, Android, plus Randomized() / RandomizedALPN() / RandomizedNoALPN()
HTTP/2Custom SETTINGS frame, priority frames, NoRFC7540Priorities
HTTP/3ForceHTTP3(), QPACK, GREASE, H3 Datagram, WebTransport, CONNECT
DNS-over-TLSCloudflare, Google, Quad9, Quad101, AdGuard, CIRA Shield, Switch, LibreDNS, Forge, Ali, SB + custom
ProxyHTTP / HTTPS / SOCKS4 / SOCKS5 + SOCKS5-UDP cho HTTP/3
Stdlib interopclient.Std() trả về *net/http.Client chuẩn

Code mẫu

client := surf.NewClient().
    Builder().
    Impersonate().Chrome().
    Build().
    Unwrap()

resp := client.Get("https://example.com").Do()

// Force HTTP/3 với SOCKS5-UDP proxy
client = surf.NewClient().
    Builder().
    Proxy("socks5://127.0.0.1:1080").
    Impersonate().Chrome().
    ForceHTTP3().
    HTTP3Settings().
        QpackMaxTableCapacity(65536).
        MaxFieldSectionSize(262144).
        Grease().
        Set().
    DNSOverTLS().Cloudflare().
    Build().
    Unwrap()

So với CycleTLS & azuretls

Tính năngSurfCycleTLSazuretls-client
JA3/JA4 spoof✅ ~14 Chrome + 9 Firefox preset✅ JA3 chính✅ JA3/JA4
HTTP/2 fingerprint✅ SETTINGS + priority tuỳ biến⚠️ giới hạn
HTTP/3 + QUIC fingerprint✅ full, qua enetx/uquic✅ cơ bản
SOCKS5-UDP cho HTTP/3⚠️ một phần
DNS-over-TLS sẵn✅ 11 provider
Stdlib *http.Client interop.Std()⚠️⚠️

Use case thực tế

  • Stealth scraping qua Cloudflare / Akamai / DataDome / PerimeterX — fingerprint khớp Chrome thật ở mọi tầng.
  • Red team C2 transport — blend HTTP/3 traffic, khó flag hơn UA Go-http-client/1.1.
  • Synthetic monitoring — kiểm tra edge config khác nhau theo browser fingerprint.
  • Anti-bot research — randomized JA3/JA4 để bench detection heuristics.
  • Multi-homed fan-outInterfaceAddr() bind theo NIC cho residential proxy.

Limitations & pricing

Surf miễn phí (MIT) nhưng có vài chỗ cần biết trước khi đẩy production:

  • Cần Go 1.25+ — toolchain khá mới.
  • HTTP/3 chỉ chạy với SOCKS5-UDP proxy. Đặt proxy HTTP/HTTPS rồi ForceHTTP3() sẽ silently fallback HTTP/2 (kiểm bằng ErrHTTP2Fallback).
  • Upstream không công bố benchmark so với net/http — nếu bạn chạy hàng triệu request/giờ, hãy tự đo.
  • Fingerprint hoàn hảo ở network layer không cứu được behavioural signals (mouse, canvas, sensor APIs). Site nào yêu cầu hành vi browser thật vẫn cần headless Chrome.
  • Pháp lý & ToS: impersonate browser để vượt anti-bot là vùng xám với hầu hết public site. Repo không có disclaimer — trách nhiệm hoàn toàn ở caller. Đối chiếu CFAA, GDPR, ToS từng site trước khi triển khai.

Tiếp theo có gì

Tag mới nhất là v1.0.199 ra ngày 24/04/2026, refresh đồng bộ với Chrome 145 và Firefox 148 stable. Project pattern cho thấy preset browser sẽ tiếp tục update theo từng release Chrome/Firefox lớn, và enetx/uquic sẽ track quic-go upstream — kỳ vọng thêm QUIC profile preset cho Edge và Safari trong các tag tới.

Nguồn: github.com/enetx/surf, pkg.go.dev/surf, enetx/uquic, @VivekIntel.