Привязка http.Client к IP-адресу в Go
В сфере распределенных вычислений часто необходимо контролировать исходный IP-адрес адрес, с которого исходят HTTP-запросы. При наличии нескольких сетевых карт на клиентском компьютере такая детализация может оказаться существенной.
Рассмотрим следующий базовый клиентский код HTTP:
package main
import "net/http"
func main() {
webclient := &http.Client{}
req, _ := http.NewRequest("GET", "http://www.google.com", nil)
httpResponse, _ := webclient.Do(req)
defer httpResponse.Body.Close()
}
Чтобы привязать этого клиента к определенному сетевому адаптеру или IP-адресу, нам нужно изменить его поле Transport. Мы будем использовать собственный net.Transport, который использует собственный net.Dialer. net.Dialer, в свою очередь, позволяет нам указать локальный адрес для исходящих соединений.
import (
"net"
"net/http"
)
func main() {
localAddr, err := net.ResolveIPAddr("ip", "")
if err != nil {
panic(err)
}
localTCPAddr := net.TCPAddr{
IP: localAddr.IP,
}
webclient := &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{LocalAddr: &localTCPAddr}).DialContext,
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
},
}
}
Благодаря этой модификации наш HTTP-клиент теперь привязан к указанному IP-адресу, гарантируя, что все исходящие запросы исходят от нужного сетевого адаптера.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3