diff --git a/internal/net/dialer/dialer_linux.go b/internal/net/dialer/dialer_linux.go index bf5f863e..29ce583b 100644 --- a/internal/net/dialer/dialer_linux.go +++ b/internal/net/dialer/dialer_linux.go @@ -11,6 +11,14 @@ func bindDevice(network, address string, fd uintptr, ifceName string) error { return nil } + // Skip SO_BINDTODEVICE for loopback interface — it prevents + // outbound traffic from reaching non-local destinations. + // Source IP binding via LocalAddr is sufficient for policy routing + // when using IP aliases on loopback (e.g. ip addr add 10.1.1.1/32 dev lo). + if ifce, err := net.InterfaceByName(ifceName); err == nil && ifce.Flags&net.FlagLoopback != 0 { + return nil + } + host, _, _ := net.SplitHostPort(address) if ip := net.ParseIP(host); ip != nil && !ip.IsGlobalUnicast() { return nil