本文にスキップ

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 証明書の検証は有効なままにしてください。例は認証情報を含むエラーを出力しません。調査ログも伏せ字にします。よくある質問を参照してください。