Gắn proxy tĩnh vào Go net/http Transport để gọi API từ IP dân cư VN cố định

Service Go trên VPS nước ngoài thường cần gọi API Việt Nam với IP nguồn cố định. Bài ngắn này gắn proxy tĩnh vào http.Transport, verify exit IP, rồi tái sử dụng client.

Đơn giá đã xác nhận (ProxyViet): proxy tĩnh dân cư Việt Nam 1.000đ/ngày hoặc gói 30 ngày 30.000đ; Viettel / VNPT / FPT; HTTP hoặc SOCKS5; mạng dân cư thật, IP sạch. Xem proxy tĩnh Việt Nam. Kiểm tra: check-proxy.

Env

bash
export PROXY_URL=http://USER:PASS@HOST:PORT export EXPECTED_EXIT_IP=x.x.x.x

Smoke-test: curl -x "$PROXY_URL" https://api.ipify.org

HTTP proxy với net/http

go
package main import ( "fmt" "io" "net/http" "net/url" "os" "time" ) func clientViaProxy() (*http.Client, error) { raw := os.Getenv("PROXY_URL") u, err := url.Parse(raw) if err != nil { return nil, err } tr := &http.Transport{ Proxy: http.ProxyURL(u), } return &http.Client{Transport: tr, Timeout: 25 * time.Second}, nil } func assertExitIP(c *http.Client) (string, error) { res, err := c.Get("https://api.ipify.org") if err != nil { return "", err } defer res.Body.Close() b, _ := io.ReadAll(res.Body) ip := string(b) if want := os.Getenv("EXPECTED_EXIT_IP"); want != "" && ip != want { return "", fmt.Errorf("exit IP lệch: got %s want %s", ip, want) } return ip, nil } func main() { c, err := clientViaProxy() if err != nil { panic(err) } ip, err := assertExitIP(c) if err != nil { panic(err) } fmt.Println("exit IP", ip) res, err := c.Get("https://example.vn/api/ping") if err != nil { panic(err) } defer res.Body.Close() fmt.Println(res.StatusCode) }

SOCKS5 (tùy chọn)

Dùng golang.org/x/net/proxy tạo dialer SOCKS5, gắn vào http.Transport.DialContext. Nhiều gói tĩnh có cả cổng HTTP — ưu tiên HTTP nếu stack chưa sẵn SOCKS.

Checklist

  1. curl khớp IP panel / check-proxy.
  2. Không hard-code user/pass — chỉ env.
  3. Timeout 20–30s; reuse một http.Client.
  4. Sau đổi IP proxy: cập nhật EXPECTED_EXIT_IP.

Chi tiết gói: proxy tĩnh Việt Nam — check-proxy.