mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2025-10-30 19:46:26 +08:00
add dialer conn in stats
This commit is contained in:
@@ -56,17 +56,18 @@ func (s *simpleSessionStater) Start() error {
|
|||||||
})
|
})
|
||||||
|
|
||||||
_, _ = fmt.Fprintf(w, "<table style=\"border=4px solid\">")
|
_, _ = fmt.Fprintf(w, "<table style=\"border=4px solid\">")
|
||||||
_, _ = fmt.Fprintf(w, "<tr><td>Process Name</td><td>Network</td><td>Duration</td><td>Local Addr</td><td>Remote Addr</td><td>Upload Bytes</td><td>Download Bytes</td></tr>")
|
_, _ = fmt.Fprintf(w, "<tr><td>Process Name</td><td>Network</td><td>Duration</td><td>Dialer Addr</td><td>Client Addr</td><td>Target Addr</td><td>Upload Bytes</td><td>Download Bytes</td></tr>")
|
||||||
sort.Slice(sessions, func(i, j int) bool {
|
sort.Slice(sessions, func(i, j int) bool {
|
||||||
return sessions[i].SessionStart.After(sessions[j].SessionStart)
|
return sessions[i].SessionStart.After(sessions[j].SessionStart)
|
||||||
})
|
})
|
||||||
for _, sess := range sessions {
|
for _, sess := range sessions {
|
||||||
_, _ = fmt.Fprintf(w, "<tr><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td></tr>",
|
_, _ = fmt.Fprintf(w, "<tr><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td></tr>",
|
||||||
sess.ProcessName,
|
sess.ProcessName,
|
||||||
sess.Network,
|
sess.Network,
|
||||||
time.Now().Sub(sess.SessionStart).Round(time.Second),
|
time.Now().Sub(sess.SessionStart).Round(time.Second),
|
||||||
sess.LocalAddr,
|
sess.DialerAddr,
|
||||||
sess.RemoteAddr,
|
sess.ClientAddr,
|
||||||
|
sess.TargetAddr,
|
||||||
p.Sprintf("%d", atomic.LoadInt64(&sess.UploadBytes)),
|
p.Sprintf("%d", atomic.LoadInt64(&sess.UploadBytes)),
|
||||||
p.Sprintf("%d", atomic.LoadInt64(&sess.DownloadBytes)),
|
p.Sprintf("%d", atomic.LoadInt64(&sess.DownloadBytes)),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -16,8 +16,9 @@ type SessionStater interface {
|
|||||||
type Session struct {
|
type Session struct {
|
||||||
ProcessName string
|
ProcessName string
|
||||||
Network string
|
Network string
|
||||||
LocalAddr string
|
DialerAddr string
|
||||||
RemoteAddr string
|
ClientAddr string
|
||||||
|
TargetAddr string
|
||||||
UploadBytes int64
|
UploadBytes int64
|
||||||
DownloadBytes int64
|
DownloadBytes int64
|
||||||
SessionStart time.Time
|
SessionStart time.Time
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ func (h *tcpHandler) relay(localConn, remoteConn net.Conn, sess *stats.Session)
|
|||||||
remoteConn.Close()
|
remoteConn.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Uplink
|
// UpLink
|
||||||
go func() {
|
go func() {
|
||||||
var err error
|
var err error
|
||||||
if h.sessionStater != nil && sess != nil {
|
if h.sessionStater != nil && sess != nil {
|
||||||
@@ -98,7 +98,7 @@ func (h *tcpHandler) relay(localConn, remoteConn net.Conn, sess *stats.Session)
|
|||||||
upCh <- err
|
upCh <- err
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Downlink
|
// DownLink
|
||||||
if h.sessionStater != nil && sess != nil {
|
if h.sessionStater != nil && sess != nil {
|
||||||
statsCopy(localConn, remoteConn, sess, dirDownlink)
|
statsCopy(localConn, remoteConn, sess, dirDownlink)
|
||||||
} else {
|
} else {
|
||||||
@@ -147,8 +147,9 @@ func (h *tcpHandler) Handle(localConn net.Conn, target *net.TCPAddr) error {
|
|||||||
sess = &stats.Session{
|
sess = &stats.Session{
|
||||||
ProcessName: process,
|
ProcessName: process,
|
||||||
Network: target.Network(),
|
Network: target.Network(),
|
||||||
LocalAddr: localConn.LocalAddr().String(),
|
DialerAddr: remoteConn.LocalAddr().String(),
|
||||||
RemoteAddr: targetAddr,
|
ClientAddr: localConn.LocalAddr().String(),
|
||||||
|
TargetAddr: targetAddr,
|
||||||
UploadBytes: 0,
|
UploadBytes: 0,
|
||||||
DownloadBytes: 0,
|
DownloadBytes: 0,
|
||||||
SessionStart: time.Now(),
|
SessionStart: time.Now(),
|
||||||
|
|||||||
@@ -118,31 +118,31 @@ func (h *udpHandler) Connect(conn core.UDPConn, target *net.UDPAddr) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (h *udpHandler) connectInternal(conn core.UDPConn, targetAddr string) error {
|
func (h *udpHandler) connectInternal(conn core.UDPConn, targetAddr string) error {
|
||||||
c, err := net.DialTimeout("tcp", core.ParseTCPAddr(h.proxyHost, h.proxyPort).String(), 4*time.Second)
|
remoteConn, err := net.DialTimeout("tcp", core.ParseTCPAddr(h.proxyHost, h.proxyPort).String(), 4*time.Second)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_ = c.SetDeadline(time.Now().Add(4 * time.Second))
|
_ = remoteConn.SetDeadline(time.Now().Add(4 * time.Second))
|
||||||
|
|
||||||
// send VER, NMETHODS, METHODS
|
// send VER, NMETHODS, METHODS
|
||||||
_, _ = c.Write([]byte{5, 1, 0})
|
_, _ = remoteConn.Write([]byte{5, 1, 0})
|
||||||
|
|
||||||
buf := make([]byte, MaxAddrLen)
|
buf := make([]byte, MaxAddrLen)
|
||||||
// read VER METHOD
|
// read VER METHOD
|
||||||
if _, err := io.ReadFull(c, buf[:2]); err != nil {
|
if _, err := io.ReadFull(remoteConn, buf[:2]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(targetAddr) != 0 {
|
if len(targetAddr) != 0 {
|
||||||
targetAddr := ParseAddr(targetAddr)
|
targetAddr := ParseAddr(targetAddr)
|
||||||
// write VER CMD RSV ATYP DST.ADDR DST.PORT
|
// write VER CMD RSV ATYP DST.ADDR DST.PORT
|
||||||
_, _ = c.Write(append([]byte{5, socks5UDPAssociate, 0}, targetAddr...))
|
_, _ = remoteConn.Write(append([]byte{5, socks5UDPAssociate, 0}, targetAddr...))
|
||||||
} else {
|
} else {
|
||||||
_, _ = c.Write(append([]byte{5, socks5UDPAssociate, 0}, []byte{1, 0, 0, 0, 0, 0, 0}...))
|
_, _ = remoteConn.Write(append([]byte{5, socks5UDPAssociate, 0}, []byte{1, 0, 0, 0, 0, 0, 0}...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// read VER REP RSV ATYP BND.ADDR BND.PORT
|
// read VER REP RSV ATYP BND.ADDR BND.PORT
|
||||||
if _, err := io.ReadFull(c, buf[:3]); err != nil {
|
if _, err := io.ReadFull(remoteConn, buf[:3]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,7 +151,7 @@ func (h *udpHandler) connectInternal(conn core.UDPConn, targetAddr string) error
|
|||||||
return errors.New("SOCKS handshake failed")
|
return errors.New("SOCKS handshake failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
remoteAddr, err := readAddr(c, buf)
|
remoteAddr, err := readAddr(remoteConn, buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -161,20 +161,20 @@ func (h *udpHandler) connectInternal(conn core.UDPConn, targetAddr string) error
|
|||||||
return errors.New("failed to resolve remote address")
|
return errors.New("failed to resolve remote address")
|
||||||
}
|
}
|
||||||
|
|
||||||
go h.handleTCP(conn, c)
|
go h.handleTCP(conn, remoteConn)
|
||||||
|
|
||||||
pc, err := net.ListenPacket("udp", "")
|
remoteUDPConn, err := net.ListenPacket("udp", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
h.Lock()
|
h.Lock()
|
||||||
h.tcpConns[conn] = c
|
h.tcpConns[conn] = remoteConn
|
||||||
h.udpConns[conn] = pc
|
h.udpConns[conn] = remoteUDPConn
|
||||||
h.remoteAddrs[conn] = resolvedRemoteAddr
|
h.remoteAddrs[conn] = resolvedRemoteAddr
|
||||||
h.Unlock()
|
h.Unlock()
|
||||||
|
|
||||||
go h.fetchUDPInput(conn, pc)
|
go h.fetchUDPInput(conn, remoteUDPConn)
|
||||||
|
|
||||||
if len(targetAddr) != 0 {
|
if len(targetAddr) != 0 {
|
||||||
var process string
|
var process string
|
||||||
@@ -190,8 +190,9 @@ func (h *udpHandler) connectInternal(conn core.UDPConn, targetAddr string) error
|
|||||||
sess := &stats.Session{
|
sess := &stats.Session{
|
||||||
ProcessName: process,
|
ProcessName: process,
|
||||||
Network: conn.LocalAddr().Network(),
|
Network: conn.LocalAddr().Network(),
|
||||||
LocalAddr: conn.LocalAddr().String(),
|
DialerAddr: remoteConn.LocalAddr().String(),
|
||||||
RemoteAddr: targetAddr,
|
ClientAddr: conn.LocalAddr().String(),
|
||||||
|
TargetAddr: targetAddr,
|
||||||
UploadBytes: 0,
|
UploadBytes: 0,
|
||||||
DownloadBytes: 0,
|
DownloadBytes: 0,
|
||||||
SessionStart: time.Now(),
|
SessionStart: time.Now(),
|
||||||
|
|||||||
Reference in New Issue
Block a user