0

我正在尝试在 Golang 中实现一个 HTTP 服务器,该服务器接收来自使用代理协议的 Amazon ELB 的请求。现在我想知道原始 IP 地址是什么,所以我正在考虑使用这个包。

现在,据我所知,这个包谈论原始 HTTP,但我的服务器使用路由器实现了更高级别的 HTTP 服务器。

我在他们之间翻译时遇到了麻烦。我的问题是:我如何使用这个库并且仍然使用像 gorilla/mux 这样的路由器?现在这个包没有什么特别之处,它只是在比 HTTP 更低的级别上进行通信。

例子:

// Listen on TCP port 2000 on all interfaces.
l, err := net.Listen("tcp", ":2000")
// proxyproxy is the library that maintains the source ip address for me
proxyList := &proxyproto.Listener{Listener: list}
if err != nil {
    log.Fatal(err)
}
defer proxyList.Close()

for {
    // Wait for a connection.
    conn, err := proxyList.Accept()
    if err != nil {
        log.Fatal(err)
    }
    // Handle the connection in a new goroutine.
    // The loop then returns to accepting, so that
    // multiple connections may be served concurrently.
    go func(c net.Conn) {

        // how do I connect my router

    }(conn)
}
4

1 回答 1

1

通过 HTTP 找出实际客户端 IP 的常用方法是使用一些 HTTP 标头,例如:

  • X-Forwarded-For
  • X-Real-IP

实际上,Amazon ELB 似乎支持 X-Forwarded-For 标头:

http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html

如果您使用的是 Gorilla,他们有一个似乎可以为您处理的中间件:

https://godoc.org/github.com/gorilla/handlers#ProxyHeaders

于 2017-05-10T02:36:35.320 回答