mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
chore: upgrade tailscale (#7207)
This commit is contained in:
+17
-56
@@ -4,12 +4,10 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/netip"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
@@ -273,8 +271,7 @@ func NewConn(options *Options) (conn *Conn, err error) {
|
||||
server.lastMutex.Unlock()
|
||||
server.sendNode()
|
||||
})
|
||||
netStack.ForwardTCPIn = server.forwardTCP
|
||||
netStack.ForwardTCPSockOpts = server.forwardTCPSockOpts
|
||||
netStack.GetTCPHandlerForFlow = server.forwardTCP
|
||||
|
||||
err = netStack.Start(nil)
|
||||
if err != nil {
|
||||
@@ -735,68 +732,32 @@ func (c *Conn) DialContextUDP(ctx context.Context, ipp netip.AddrPort) (*gonet.U
|
||||
return c.netStack.DialContextUDP(ctx, ipp)
|
||||
}
|
||||
|
||||
func (c *Conn) forwardTCP(conn net.Conn, port uint16) {
|
||||
func (c *Conn) forwardTCP(_, dst netip.AddrPort) (handler func(net.Conn), opts []tcpip.SettableSocketOption, intercept bool) {
|
||||
c.mutex.Lock()
|
||||
ln, ok := c.listeners[listenKey{"tcp", "", fmt.Sprint(port)}]
|
||||
ln, ok := c.listeners[listenKey{"tcp", "", fmt.Sprint(dst.Port())}]
|
||||
c.mutex.Unlock()
|
||||
if !ok {
|
||||
c.forwardTCPToLocal(conn, port)
|
||||
return
|
||||
return nil, nil, false
|
||||
}
|
||||
|
||||
t := time.NewTimer(time.Second)
|
||||
defer t.Stop()
|
||||
select {
|
||||
case ln.conn <- conn:
|
||||
return
|
||||
case <-ln.closed:
|
||||
case <-c.closed:
|
||||
case <-t.C:
|
||||
}
|
||||
_ = conn.Close()
|
||||
}
|
||||
|
||||
func (*Conn) forwardTCPSockOpts(port uint16) []tcpip.SettableSocketOption {
|
||||
opts := []tcpip.SettableSocketOption{}
|
||||
|
||||
// See: https://github.com/tailscale/tailscale/blob/c7cea825aea39a00aca71ea02bab7266afc03e7c/wgengine/netstack/netstack.go#L888
|
||||
if port == WorkspaceAgentSSHPort || port == 22 {
|
||||
if dst.Port() == WorkspaceAgentSSHPort || dst.Port() == 22 {
|
||||
opt := tcpip.KeepaliveIdleOption(72 * time.Hour)
|
||||
opts = append(opts, &opt)
|
||||
}
|
||||
|
||||
return opts
|
||||
}
|
||||
|
||||
func (c *Conn) forwardTCPToLocal(conn net.Conn, port uint16) {
|
||||
defer conn.Close()
|
||||
dialAddrStr := net.JoinHostPort("127.0.0.1", strconv.Itoa(int(port)))
|
||||
var stdDialer net.Dialer
|
||||
server, err := stdDialer.DialContext(c.dialContext, "tcp", dialAddrStr)
|
||||
if err != nil {
|
||||
c.logger.Debug(c.dialContext, "dial local port", slog.F("port", port), slog.Error(err))
|
||||
return
|
||||
}
|
||||
defer server.Close()
|
||||
|
||||
connClosed := make(chan error, 2)
|
||||
go func() {
|
||||
_, err := io.Copy(server, conn)
|
||||
connClosed <- err
|
||||
}()
|
||||
go func() {
|
||||
_, err := io.Copy(conn, server)
|
||||
connClosed <- err
|
||||
}()
|
||||
select {
|
||||
case err = <-connClosed:
|
||||
case <-c.closed:
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
c.logger.Debug(c.dialContext, "proxy connection closed with error", slog.Error(err))
|
||||
}
|
||||
c.logger.Debug(c.dialContext, "forwarded connection closed", slog.F("local_addr", dialAddrStr))
|
||||
return func(conn net.Conn) {
|
||||
t := time.NewTimer(time.Second)
|
||||
defer t.Stop()
|
||||
select {
|
||||
case ln.conn <- conn:
|
||||
return
|
||||
case <-ln.closed:
|
||||
case <-c.closed:
|
||||
case <-t.C:
|
||||
}
|
||||
_ = conn.Close()
|
||||
}, opts, true
|
||||
}
|
||||
|
||||
// SetConnStatsCallback sets a callback to be called after maxPeriod or
|
||||
|
||||
Reference in New Issue
Block a user