Golang应用/工具当前无法通过Socks5或任意代理连接的问题

Golang应用/工具当前无法通过Socks5或任意代理连接的问题 Golang 应用程序/工具目前无法与 Socks5 或任何代理连接一起工作。即使在配置网络使用代理后,Go 语言应用程序/工具也没有使用任何代理/Socks5 连接,而之前它工作正常。

我遇到了这个相同的问题,我也看到了该问题的答案,但我应该在哪里实现这个呢?

预期行为: 在配置网络使用代理后,Go 语言应用程序应通过代理提供服务。


更多关于Golang应用/工具当前无法通过Socks5或任意代理连接的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang应用/工具当前无法通过Socks5或任意代理连接的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个问题通常是由于Go 1.13之后默认禁用了HTTP_PROXY环境变量导致的。你需要在代码中显式配置代理设置。

以下是两种解决方案:

方案1:使用http.Transport配置代理(推荐)

package main

import (
    "crypto/tls"
    "fmt"
    "net/http"
    "net/url"
    "os"
)

func main() {
    // 设置代理地址
    proxyURL, err := url.Parse("socks5://127.0.0.1:1080")
    if err != nil {
        panic(err)
    }

    // 创建Transport配置
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true, // 仅用于测试,生产环境应使用有效证书
        },
    }

    // 创建HTTP客户端
    client := &http.Client{
        Transport: transport,
        Timeout:   30 * time.Second,
    }

    // 使用代理发送请求
    resp, err := client.Get("https://api.ipify.org?format=json")
    if err != nil {
        fmt.Printf("请求失败: %v\n", err)
        return
    }
    defer resp.Body.Close()

    // 读取响应
    body, err := io.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("读取响应失败: %v\n", err)
        return
    }

    fmt.Printf("响应: %s\n", body)
}

方案2:使用全局默认Transport

package main

import (
    "net/http"
    "net/url"
    "os"
    "time"
)

func init() {
    // 从环境变量读取代理设置
    proxyURL := os.Getenv("HTTP_PROXY")
    if proxyURL == "" {
        proxyURL = os.Getenv("ALL_PROXY")
    }

    if proxyURL != "" {
        proxy, err := url.Parse(proxyURL)
        if err != nil {
            panic(err)
        }

        // 设置全局默认Transport
        http.DefaultTransport = &http.Transport{
            Proxy: http.ProxyURL(proxy),
        }
    }
}

func main() {
    // 现在所有使用http.DefaultClient的请求都会走代理
    client := &http.Client{
        Timeout: 30 * time.Second,
    }

    resp, err := client.Get("https://example.com")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
}

方案3:使用环境变量和自定义Transport

package main

import (
    "net/http"
    "net/url"
    "os"
)

func createProxyClient() *http.Client {
    // 支持多种环境变量格式
    proxyEnvVars := []string{
        "HTTP_PROXY",
        "HTTPS_PROXY",
        "ALL_PROXY",
        "http_proxy",
        "https_proxy",
        "all_proxy",
    }

    var proxyURL *url.URL
    var err error

    for _, envVar := range proxyEnvVars {
        if proxyStr := os.Getenv(envVar); proxyStr != "" {
            proxyURL, err = url.Parse(proxyStr)
            if err == nil {
                break
            }
        }
    }

    if proxyURL == nil {
        return http.DefaultClient
    }

    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }

    return &http.Client{
        Transport: transport,
    }
}

func main() {
    client := createProxyClient()
    
    // 使用配置了代理的客户端
    resp, err := client.Get("https://api.example.com/data")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
}

对于命令行工具,可以在启动时设置环境变量:

# Linux/macOS
export HTTP_PROXY=socks5://127.0.0.1:1080
export HTTPS_PROXY=socks5://127.0.0.1:1080
./your-go-app

# Windows (PowerShell)
$env:HTTP_PROXY="socks5://127.0.0.1:1080"
$env:HTTPS_PROXY="socks5://127.0.0.1:1080"
.\your-go-app.exe

选择哪种方案取决于你的具体需求。如果是在开发通用工具,建议使用方案3,因为它会检查所有常见的代理环境变量。如果是在特定应用中,方案1提供了最细粒度的控制。

回到顶部