【问题标题】:How to set which IP to use for a HTTP request?如何设置用于 HTTP 请求的 IP?
【发布时间】:2015-05-30 23:44:23
【问题描述】:

我不知道这是否可能,因为 std lib 没有说明当前正在使用的地址:

http://golang.org/pkg/net/http/

resp, err := http.Get("http://example.com/")
if err != nil {
    // handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)

我正在尝试为该 http 请求设置源地址,为什么?因为我不想将我的主 IP 地址用于那种东西......

【问题讨论】:

  • 你想要代理(或代理本身)之类的东西吗?
  • 有很多服务可以混淆您的 IP 地址(例如代理、VPN、Tor)。我怀疑您需要做类似的事情而不是欺骗您的 IP,否则您将永远看不到该页面,因为它会被提供给不属于您的 IP 地址。
  • 我的服务器上有几个公共 ip,我想做的是选择哪一个用于网络请求,例如:commandliners.com/2010/03/… 但我不想依赖外部二进制文件...我也不想欺骗我的 IP 地址...
  • 查看net.DialerLocalAddr 字段。大多数标准包都有一种方法来指定您自己的拨号程序而不是默认值。
  • 可以做到,我会检查一下,我也会尝试 go-curl.. 我想知道为什么不赞成?

标签: go


【解决方案1】:

您可以在客户端的传输中设置自定义拨号器。

// Create a transport like http.DefaultTransport, but with a specified localAddr
transport := &http.Transport{
    Proxy: http.ProxyFromEnvironment,
    DialContext: (&net.Dialer{
        Timeout:   30 * time.Second,
        KeepAlive: 30 * time.Second,
        LocalAddr: localAddr,
        DualStack: true,
    }).DialContext,
    MaxIdleConns:          100,
    IdleConnTimeout:       90 * time.Second,
    TLSHandshakeTimeout:   10 * time.Second,
    ExpectContinueTimeout: 1 * time.Second,
}

client := &http.Client{
    Transport: transport,
}

【讨论】:

  • 就像一个魅力,这是作为我的开发机器上的 vpn 实验的结果代码...play.golang.org/p/Bh8gfggLK- go-curl 也适用于 easy.Setopt(curl.OPT_INTERFACE, " 10.9.8.2").. 谢谢:)
  • @kainlite 你确定这有效吗?我从 ResolveTCPAddr 收到一个错误(你忽略了它): dial tcp 10.9.8.2:8080->54.221.194.87:80: bind: can't assign requested address(我不得不在上面添加一个端口,因为以前的“找不到端口”错误)。
  • 您需要使用您网络中的 ip 地址,我使用该 ip 作为 vpn
  • @JimB 默认Go http.Client会选择哪个IP地址?
  • @alex:Go 客户端不选择地址,它就像任何其他 connect 调用一样工作,如果没有地址,则让系统为套接字分配一个地址。跨度>
猜你喜欢
  • 2016-09-28
  • 2013-11-08
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
相关资源
最近更新 更多