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ục | Thông số |
|---|---|
| Phiên bản | v1.0.199 (24/04/2026) |
| License | MIT |
| Go tối thiểu | 1.25+ |
| Browser preset | Chrome v145, Firefox v148; OS: Windows / macOS / Linux / Android / iOS / RandomOS |
| JA3/JA4 preset | 14 Chrome (Chrome58…Chrome145, kèm Chrome120PQ post-quantum), 9 Firefox, 3 Edge, Safari, IOS11–14, Android, plus Randomized() / RandomizedALPN() / RandomizedNoALPN() |
| HTTP/2 | Custom SETTINGS frame, priority frames, NoRFC7540Priorities |
| HTTP/3 | ForceHTTP3(), QPACK, GREASE, H3 Datagram, WebTransport, CONNECT |
| DNS-over-TLS | Cloudflare, Google, Quad9, Quad101, AdGuard, CIRA Shield, Switch, LibreDNS, Forge, Ali, SB + custom |
| Proxy | HTTP / HTTPS / SOCKS4 / SOCKS5 + SOCKS5-UDP cho HTTP/3 |
| Stdlib interop | client.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ăng | Surf | CycleTLS | azuretls-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-out —
InterfaceAddr()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ằngErrHTTP2Fallback). - 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.

