Получить исходный IP-адрес от Go HTTP-сервера
Я пытаюсь реализовать 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)
}
1 ответ
Обычный способ узнать фактический IP-адрес клиента по HTTP - использовать некоторые заголовки 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, у них есть промежуточное ПО, которое, кажется, позаботится об этом за вас: