@@ -186,17 +186,18 @@ func (h *tcpHandler) Proxy(gconn *netstack.GTCPConn, src, target netip.AddrPort)
186186 return deny
187187 }
188188
189- // handshake; since we assume a duplex-stream from here on
190- if open , err = gconn .Establish (); ! open {
191- log .E ("tcp: %s connect err %v; %s => %s for %s" , cid , err , src , target , uid )
192- clos (gconn )
193- h .queueSummary (smm .done (err ))
194- return deny // == !open
195- }
196-
197189 if isAnyBasePid (pids ) { // see udp.go:Connect
198- if h . dnsOverride ( gconn , target , uid ) {
190+ if target . IsValid () && h . resolver . IsDnsAddr ( target ) {
199191 // SocketSummary not sent; x.DNSSummary supercedes it
192+ if _ , err := gconn .Establish (); err != nil {
193+ clos (gconn )
194+ h .queueSummary (smm .done (err ))
195+ return deny // == !open
196+ }
197+ // conn closed by the resolver
198+ core .Gx (h .proto + ".dns" , func () {
199+ h .resolver .Serve (h .proto , gconn , uid )
200+ })
200201 return allow
201202 } // else not a dns request
202203 } // if ipn.Exit then let it connect as-is (aka exit)
@@ -288,6 +289,12 @@ func (h *tcpHandler) handle(px ipn.Proxy, src net.Conn, boundSrc, target netip.A
288289 return err
289290 }
290291
292+ gconn := src .(* netstack.GTCPConn )
293+ if _ , err := gconn .Establish (); err != nil {
294+ clos (pc )
295+ return err
296+ }
297+
291298 core .Go ("tcp.forward." + smm .ID , func () {
292299 h .listener .PostFlow (smm .postMark ())
293300 h .forward (src , rwext {dst , tcptimeout }, smm ) // src always *gonet.TCPConn
0 commit comments