---
title: "Gắn proxy tĩnh vào Go net/http Transport để gọi API từ IP dân cư VN cố định"
url: https://memory.wiki/VRi2VQlT
updated: 2026-09-28T16:30:26.151Z
source: "memory.wiki"
---
# 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](https://proxyviet.org/proxy-tinh). Kiểm tra: [check-proxy](https://proxyviet.org/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](https://proxyviet.org/proxy-tinh) — [check-proxy](https://proxyviet.org/check-proxy).
