Skip to content

Commit d8a4721

Browse files
authored
feat: try IPv6 when dialing IPv4 loopback (#49)
1 parent f586aa4 commit d8a4721

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

wgengine/netstack/netstack.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,8 +1000,24 @@ func (ns *Impl) forwardTCP(getClient func(...tcpip.SettableSocketOption) *gonet.
10001000
var stdDialer net.Dialer
10011001
server, err := stdDialer.DialContext(ctx, "tcp", dialAddrStr)
10021002
if err != nil {
1003-
ns.logf("netstack: could not connect to local server at %s: %v", dialAddr.String(), err)
1004-
return
1003+
// Coder: Retry with loopback IPv6 if the dial was for 127.0.0.1.
1004+
if dialAddr.Addr().Is4() && dialAddr.Addr().String() == "127.0.0.1" {
1005+
ipv6DialAddr := netip.AddrPortFrom(netip.IPv6Loopback(), dialAddr.Port())
1006+
server, err = stdDialer.DialContext(ctx, "tcp", ipv6DialAddr.String())
1007+
if err == nil {
1008+
if debugNetstack() {
1009+
ns.logf("[coder] netstack: successful IPv4 loopback => IPv6 loopback redirect: original = %s, new = %s", dialAddrStr, ipv6DialAddr.String())
1010+
}
1011+
dialAddr = ipv6DialAddr
1012+
dialAddrStr = ipv6DialAddr.String()
1013+
} else {
1014+
ns.logf("netstack: could not connect to local server at %s (or %s)", dialAddrStr, ipv6DialAddr.String(), err)
1015+
return
1016+
}
1017+
} else {
1018+
ns.logf("netstack: could not connect to local server at %s: %v", dialAddr.String(), err)
1019+
return
1020+
}
10051021
}
10061022
defer server.Close()
10071023

0 commit comments

Comments
 (0)