diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index 10f4d33f..2d8a4e81 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -74,7 +74,7 @@ func (c *Client) Process(ctx context.Context, link *transport.Link, dialer inter if err != nil { return newError("failed to find an available destination").AtWarning().Base(err) } - newError("tunneling request to ", destination, " via ", server.Destination()).WriteToLog(session.ExportIDToError(ctx)) + newError("tunneling request to ", destination, " via ", network, ":", server.Destination().NetAddr()).WriteToLog(session.ExportIDToError(ctx)) defer conn.Close() diff --git a/proxy/trojan/client.go b/proxy/trojan/client.go index 7094554f..9f0bc7fb 100644 --- a/proxy/trojan/client.go +++ b/proxy/trojan/client.go @@ -77,7 +77,7 @@ func (c *Client) Process(ctx context.Context, link *transport.Link, dialer inter if err != nil { return newError("failed to find an available destination").AtWarning().Base(err) } - newError("tunneling request to ", destination, " via ", server.Destination()).WriteToLog(session.ExportIDToError(ctx)) + newError("tunneling request to ", destination, " via ", server.Destination().NetAddr()).WriteToLog(session.ExportIDToError(ctx)) defer conn.Close() diff --git a/proxy/vless/outbound/outbound.go b/proxy/vless/outbound/outbound.go index 68995cd6..e114c3c4 100644 --- a/proxy/vless/outbound/outbound.go +++ b/proxy/vless/outbound/outbound.go @@ -103,7 +103,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte } target := outbound.Target - newError("tunneling request to ", target, " via ", rec.Destination()).AtInfo().WriteToLog(session.ExportIDToError(ctx)) + newError("tunneling request to ", target, " via ", rec.Destination().NetAddr()).AtInfo().WriteToLog(session.ExportIDToError(ctx)) command := protocol.RequestCommandTCP if target.Network == net.Network_UDP { diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index ce6e12a1..5cf654ba 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -84,7 +84,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte } target := outbound.Target - newError("tunneling request to ", target, " via ", rec.Destination()).WriteToLog(session.ExportIDToError(ctx)) + newError("tunneling request to ", target, " via ", rec.Destination().NetAddr()).WriteToLog(session.ExportIDToError(ctx)) command := protocol.RequestCommandTCP if target.Network == net.Network_UDP { diff --git a/transport/internet/quic/dialer.go b/transport/internet/quic/dialer.go index 42b4ac00..bc8d8fab 100644 --- a/transport/internet/quic/dialer.go +++ b/transport/internet/quic/dialer.go @@ -58,11 +58,13 @@ func isActive(s quic.Session) bool { func removeInactiveSessions(sessions []*sessionContext) []*sessionContext { activeSessions := make([]*sessionContext, 0, len(sessions)) - for _, s := range sessions { + for i, s := range sessions { if isActive(s.session) { activeSessions = append(activeSessions, s) continue } + + newError("closing quic session at index: ", i).WriteToLog() if err := s.session.CloseWithError(0, ""); err != nil { newError("failed to close session").Base(err).WriteToLog() } @@ -72,29 +74,13 @@ func removeInactiveSessions(sessions []*sessionContext) []*sessionContext { } if len(activeSessions) < len(sessions) { + newError("active quic session reduced from ", len(sessions), " to ", len(activeSessions)).WriteToLog() return activeSessions } return sessions } -func openStream(sessions []*sessionContext, destAddr net.Addr) *interConn { - for _, s := range sessions { - if !isActive(s.session) { - continue - } - - conn, err := s.openStream(destAddr) - if err != nil { - continue - } - - return conn - } - - return nil -} - func (s *clientSessions) cleanSessions() error { s.access.Lock() defer s.access.Unlock() @@ -116,7 +102,7 @@ func (s *clientSessions) cleanSessions() error { return nil } -func (s *clientSessions) openConnection(destAddr net.Addr, config *Config, tlsConfig *tls.Config, sockopt *internet.SocketConfig) (stat.Connection, error) { +func (s *clientSessions) openConnection(ctx context.Context, destAddr net.Addr, config *Config, tlsConfig *tls.Config, sockopt *internet.SocketConfig) (stat.Connection, error) { s.access.Lock() defer s.access.Unlock() @@ -131,29 +117,36 @@ func (s *clientSessions) openConnection(destAddr net.Addr, config *Config, tlsCo sessions = s } - if true { - conn := openStream(sessions, destAddr) - if conn != nil { - return conn, nil + if len(sessions) > 0 { + s := sessions[len(sessions)-1] + if isActive(s.session) { + conn, err := s.openStream(destAddr) + if err == nil { + return conn, nil + } + newError("failed to openStream: ").Base(err).WriteToLog() + } else { + newError("current quic session is not active!").WriteToLog() } } sessions = removeInactiveSessions(sessions) - - rawConn, err := internet.ListenSystemPacket(context.Background(), &net.UDPAddr{ - IP: []byte{0, 0, 0, 0}, - Port: 0, - }, sockopt) + newError("dialing quic to ", dest).WriteToLog() + rawConn, err := internet.DialSystem(ctx, dest, sockopt) if err != nil { - return nil, err + return nil, newError("failed to dial to dest: ", err).AtWarning().Base(err) } quicConfig := &quic.Config{ ConnectionIDLength: 12, - KeepAlive: true, + KeepAlive: false, } - conn, err := wrapSysConn(rawConn.(*net.UDPConn), config) + udpConn, _ := rawConn.(*net.UDPConn) + if udpConn == nil { + udpConn = rawConn.(*internet.PacketConnWrapper).Conn.(*net.UDPConn) + } + conn, err := wrapSysConn(udpConn, config) if err != nil { rawConn.Close() return nil, err @@ -209,7 +202,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me config := streamSettings.ProtocolSettings.(*Config) - return client.openConnection(destAddr, config, tlsConfig, streamSettings.SocketSettings) + return client.openConnection(ctx, destAddr, config, tlsConfig, streamSettings.SocketSettings) } func init() { diff --git a/transport/internet/quic/hub.go b/transport/internet/quic/hub.go index d8524721..d5fe5aeb 100644 --- a/transport/internet/quic/hub.go +++ b/transport/internet/quic/hub.go @@ -103,7 +103,7 @@ func Listen(ctx context.Context, address net.Address, port net.Port, streamSetti quicConfig := &quic.Config{ ConnectionIDLength: 12, - KeepAlive: true, + KeepAlive: false, MaxIncomingStreams: 32, MaxIncomingUniStreams: -1, }