Go での接続
割り当て済みの静的エンドポイントから通信します。環境変数で認証情報を読み込み、既定では HTTP プロキシサーバー経由で HTTPS にアクセスします。IP の取得や切り替え処理は含みません。
接続前の準備
実行するターミナル・コンテナー・配備先で PROXY_HOST、PROXY_PORT、PROXY_USERNAME、PROXY_PASSWORD を設定します。管理画面の現在の情報と対応ポートを使い、実際のパスワードをリポジトリー、ログ、フロントエンドへ含めないでください。
実行環境と依存関係
サポート中の Go を使います。標準ライブラリーのみで動作します。proxy_example.go に保存してください。
sh
go run proxy_example.go設定手順
go
package main
import (
"context"
"fmt"
"io"
"net"
"net/http"
"net/url"
"os"
"strconv"
"strings"
"time"
)
func required(name string) string {
value := os.Getenv(name)
if value == "" {
fmt.Fprintln(os.Stderr, "Missing environment variable:", name)
os.Exit(1)
}
return value
}
func main() {
host := strings.Trim(required("PROXY_HOST"), "[]")
port := required("PROXY_PORT")
number, err := strconv.Atoi(port)
if err != nil || number < 1 || number > 65535 {
fmt.Fprintln(os.Stderr, "Invalid PROXY_PORT")
os.Exit(1)
}
scheme := os.Getenv("PROXY_SCHEME")
if scheme == "" { scheme = "http" }
if scheme != "http" && scheme != "socks5h" {
fmt.Fprintln(os.Stderr, "PROXY_SCHEME must be http or socks5h")
os.Exit(1)
}
endpoint := &url.URL{
Scheme: scheme,
Host: net.JoinHostPort(host, port),
User: url.UserPassword(required("PROXY_USERNAME"), required("PROXY_PASSWORD")),
}
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(endpoint)
defer transport.CloseIdleConnections()
client := &http.Client{Transport: transport, Timeout: 30 * time.Second}
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
request, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://ip123.in/ip.json", nil)
if err != nil { fmt.Fprintln(os.Stderr, "Invalid request"); os.Exit(1) }
response, err := client.Do(request)
if err != nil { fmt.Fprintln(os.Stderr, "Proxy request failed; check network and credentials"); os.Exit(1) }
defer response.Body.Close()
if response.StatusCode < 200 || response.StatusCode >= 300 {
fmt.Fprintln(os.Stderr, "HTTP status:", response.StatusCode)
os.Exit(1)
}
body, err := io.ReadAll(io.LimitReader(response.Body, 1<<20))
if err != nil { fmt.Fprintln(os.Stderr, "Cannot read response"); os.Exit(1) }
fmt.Println(string(body))
}PROXY_SCHEME の既定は http です。SOCKS5 では socks5h と対応ポートを指定し、接続先の名前をリモートで解決します。プロトコル変更による静的出口の切り替えはありません。
うまく接続できない場合
例だけ成功する場合は、実際の通信プロセス、SDK の設定、タイムアウト、再試行を確認します。TLS 証明書の検証は有効なままにしてください。例は認証情報を含むエラーを出力しません。調査ログも伏せ字にします。よくある質問を参照してください。