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
bashexport 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
gopackage 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
- curl khớp IP panel / check-proxy.
- Không hard-code user/pass — chỉ env.
- Timeout 20–30s; reuse một
http.Client. - Sau đổi IP proxy: cập nhật
EXPECTED_EXIT_IP.
Chi tiết gói: proxy tĩnh Việt Nam — check-proxy.