Skip to content

Instantly share code, notes, and snippets.

@bacher09
Created August 24, 2021 12:22
Show Gist options
  • Save bacher09/51ce161105a9e1f49b8b917f8eccd3c5 to your computer and use it in GitHub Desktop.
Save bacher09/51ce161105a9e1f49b8b917f8eccd3c5 to your computer and use it in GitHub Desktop.
Golang, http with SO_BINDTOINTERFACE
package main
import (
"fmt"
"io"
"net"
"net/http"
"syscall"
)
func HTTPClientOnInterface(iface string) *http.Client {
return &http.Client{
Transport: &http.Transport{
DialContext: (&net.Dialer{
Control: func(network, address string, c syscall.RawConn) error {
var errSock error
err := c.Control((func(fd uintptr) {
errSock = syscall.SetsockoptString(int(fd), syscall.SOL_SOCKET, syscall.SO_BINDTODEVICE, iface)
return
}))
if err != nil {
return err
}
return errSock
},
}).DialContext,
},
}
}
func main() {
client := HTTPClientOnInterface("eth0")
resp, err := client.Get("https://ifconfig.me/")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(body))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment