Ubuntu 下 Go 网络配置实用指南
一 代理与环境变量配置
- 为 Go 工具链与程序设置代理,常用变量包含:HTTP_PROXY/HTTPS_PROXY/NO_PROXY(大小写均可用,程序内常用大写)。在 Ubuntu 中可写入 ~/.bashrc 或 ~/.zshrc 使其持久化:
- 临时生效(当前终端):
- export http_proxy=http://your-proxy:port
- export https_proxy=https://your-proxy:port
- export no_proxy=localhost,127.0.0.1,.yourdomain.com
- 永久生效(写入配置文件后执行 source 使其立即生效):
- echo ‘export http_proxy=http://your-proxy:port’ >> ~/.bashrc
- echo ‘export https_proxy=https://your-proxy:port’ >> ~/.bashrc
- echo ‘export no_proxy=localhost,127.0.0.1,.yourdomain.com’ >> ~/.bashrc
- source ~/.bashrc
- Go 模块与拉取依赖专用变量:
- 启用模块:go env -w GO111MODULE=on
- 设置模块代理(任选其一,国内推荐前两个):
- go env -w GOPROXY=https://goproxy.cn,direct
- go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
- go env -w GOPROXY=https://goproxy.io,direct
- 验证:go env | grep -E ‘GOPROXY|HTTP_PROXY|HTTPS_PROXY|NO_PROXY’
- 如需为系统 APT 单独配置代理(不影响 Go):
- 临时:sudo apt -o Acquire::http::Proxy=“http://127.0.0.1:8080/” update
- 永久:在 /etc/apt/apt.conf.d/proxy 中添加:Acquire::http::Proxy “http://user:pass@proxy:port/”;
- 若使用 SOCKS5 本地代理(如 127.0.0.1:1080),可在 shell 配置别名:
- alias setproxy=‘export ALL_PROXY=socks5://127.0.0.1:1080’
- alias unsetproxy=‘unset ALL_PROXY’
二 在程序中自定义 HTTP 客户端代理
- 当环境变量不满足需求或需按目标地址分流时,可在代码中显式设置 http.Transport.Proxy:
- 示例:
- package main
import (
“fmt”
“net/http”
“net/url”
)
func main() {
proxyURL, _ := url.Parse(“http://127.0.0.1:8080”)
client := &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(proxyURL),
},
}
resp, err := client.Get(“https://httpbin.org/get”)
if err != nil { panic(err) }
defer resp.Body.Close()
fmt.Println(“Status:”, resp.Status)
}
- 如需对部分域名直连,可在 Transport 上实现 Proxy 函数,按 Host 返回不同的 url.URL 或 nil(直连)。
三 系统层面网络与防火墙放行
- 若 Go 程序监听端口(如 8080/TCP),需确保防火墙放行:
- UFW:sudo ufw allow 8080/tcp
- iptables:sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
- 云服务器还需在云平台安全组放行对应端口与来源网段。
四 在 Go 中编程管理网络接口与路由 Linux 专用
- 使用 github.com/vishvananda/netlink 可在 Go 中配置接口、地址与路由(需 root 权限,仅适用于 Linux):
- 典型步骤:
- 通过名称获取接口:lnk, _ := netlink.LinkByName(“eth0”)
- 构造地址:ipNet := &net.IPNet{IP: net.ParseIP(“192.168.1.100”), Mask: net.CIDRMask(24, 32)}
- 添加地址:netlink.AddrAdd(lnk, &netlink.Addr{IPNet: ipNet})
- 启停接口:netlink.LinkSetUp(lnk) / netlink.LinkSetDown(lnk)
- 路由管理:netlink.RouteAdd(&netlink.Route{LinkIndex: lnk.Attrs().Index, Dst: &net.IPNet{IP: net.ParseIP(“10.0.0.0”), Mask: net.CIDRMask(24, 32)}})
- 注意:权限、平台限制、幂等性与错误处理(如重复添加地址需先删除或忽略已存在错误)。
五 快速自检与常见问题
- 基础连通性测试(Go 程序):
- package main
import (“fmt”; “net/http”)
func main() {
resp, err := http.Get(“http://example.com”)
if err != nil { panic(err) }
defer resp.Body.Close()
fmt.Println(“Status:”, resp.StatusCode)
}
- 诊断网络问题可开启 Go 网络调试:export GODEBUG=net=1
- 常见要点:
- 代理变量名可用大小写,很多库遵循 HTTP_PROXY/HTTPS_PROXY/NO_PROXY 约定;命令行工具与程序行为可能不同,必要时在程序中显式设置 Transport.Proxy。
- 使用 GOPROXY 可显著改善模块拉取成功率与速度;遇到内网域名直连需求,使用 NO_PROXY 或在代码中分流。
- 监听端口被拒绝时,优先检查 UFW/iptables/云安全组 是否放行对应端口。