feat: Implement core tunnel server with client management, authentication, and SOCKS5/HTTP proxy capabilities.

This commit is contained in:
2026-02-03 21:59:55 +08:00
parent ba9edd3c02
commit 50733e5c8b
4 changed files with 33 additions and 20 deletions

View File

@@ -50,8 +50,8 @@ func generateClientID() string {
// Server 隧道服务端 // Server 隧道服务端
type Server struct { type Server struct {
clientStore db.ClientStore clientStore db.ClientStore
jsPluginStore db.JSPluginStore // JS 插件存储 jsPluginStore db.JSPluginStore // JS 插件存储
trafficStore db.TrafficStore // 流量存储 trafficStore db.TrafficStore // 流量存储
bindAddr string bindAddr string
bindPort int bindPort int
token string token string
@@ -514,8 +514,8 @@ func (s *Server) acceptProxyConns(cs *ClientSession, ln net.Listener, rule proto
func (s *Server) acceptProxyServerConns(cs *ClientSession, ln net.Listener, rule protocol.ProxyRule) { func (s *Server) acceptProxyServerConns(cs *ClientSession, ln net.Listener, rule protocol.ProxyRule) {
dialer := proxy.NewTunnelDialer(cs.Session) dialer := proxy.NewTunnelDialer(cs.Session)
// 使用内置 proxy 实现 // 使用内置 proxy 实现 (带流量统计)
proxyServer := proxy.NewServer(rule.Type, dialer) proxyServer := proxy.NewServer(rule.Type, dialer, s.recordTraffic)
for { for {
conn, err := ln.Accept() conn, err := ln.Accept()
if err != nil { if err != nil {
@@ -963,6 +963,9 @@ func (s *Server) sendUDPPacket(cs *ClientSession, conn *net.UDPConn, clientAddr
return return
} }
// 记录入站流量 (从外部接收的数据)
s.recordTraffic(int64(len(packet.Data)), 0)
// 等待客户端响应 // 等待客户端响应
respMsg, err := protocol.ReadMessage(stream) respMsg, err := protocol.ReadMessage(stream)
if err != nil { if err != nil {
@@ -975,6 +978,8 @@ func (s *Server) sendUDPPacket(cs *ClientSession, conn *net.UDPConn, clientAddr
return return
} }
conn.WriteToUDP(respPacket.Data, clientAddr) conn.WriteToUDP(respPacket.Data, clientAddr)
// 记录出站流量 (发送回外部的数据)
s.recordTraffic(0, int64(len(respPacket.Data)))
} }
} }

View File

@@ -6,16 +6,19 @@ import (
"net" "net"
"net/http" "net/http"
"strings" "strings"
"github.com/gotunnel/pkg/relay"
) )
// HTTPServer HTTP 代理服务 // HTTPServer HTTP 代理服务
type HTTPServer struct { type HTTPServer struct {
dialer Dialer dialer Dialer
onStats func(in, out int64) // 流量统计回调
} }
// NewHTTPServer 创建 HTTP 代理服务 // NewHTTPServer 创建 HTTP 代理服务
func NewHTTPServer(dialer Dialer) *HTTPServer { func NewHTTPServer(dialer Dialer, onStats func(in, out int64)) *HTTPServer {
return &HTTPServer{dialer: dialer} return &HTTPServer{dialer: dialer, onStats: onStats}
} }
// HandleConn 处理 HTTP 代理连接 // HandleConn 处理 HTTP 代理连接
@@ -50,8 +53,8 @@ func (h *HTTPServer) handleConnect(conn net.Conn, req *http.Request) error {
conn.Write([]byte("HTTP/1.1 200 Connection Established\r\n\r\n")) conn.Write([]byte("HTTP/1.1 200 Connection Established\r\n\r\n"))
go io.Copy(remote, conn) // 双向转发 (带流量统计)
io.Copy(conn, remote) relay.RelayWithStats(conn, remote, h.onStats)
return nil return nil
} }
@@ -82,7 +85,10 @@ func (h *HTTPServer) handleHTTP(conn net.Conn, req *http.Request, reader *bufio.
return err return err
} }
// 转发响应 // 转发响应 (带流量统计)
_, err = io.Copy(conn, remote) n, err := io.Copy(conn, remote)
if h.onStats != nil && n > 0 {
h.onStats(0, n) // 响应数据为出站流量
}
return err return err
} }

View File

@@ -14,10 +14,10 @@ type Server struct {
} }
// NewServer 创建代理服务器 // NewServer 创建代理服务器
func NewServer(typ string, dialer Dialer) *Server { func NewServer(typ string, dialer Dialer, onStats func(in, out int64)) *Server {
return &Server{ return &Server{
socks5: NewSOCKS5Server(dialer), socks5: NewSOCKS5Server(dialer, onStats),
http: NewHTTPServer(dialer), http: NewHTTPServer(dialer, onStats),
typ: typ, typ: typ,
} }
} }

View File

@@ -6,6 +6,8 @@ import (
"fmt" "fmt"
"io" "io"
"net" "net"
"github.com/gotunnel/pkg/relay"
) )
const ( const (
@@ -19,7 +21,8 @@ const (
// SOCKS5Server SOCKS5 代理服务 // SOCKS5Server SOCKS5 代理服务
type SOCKS5Server struct { type SOCKS5Server struct {
dialer Dialer dialer Dialer
onStats func(in, out int64) // 流量统计回调
} }
// Dialer 连接拨号器接口 // Dialer 连接拨号器接口
@@ -28,8 +31,8 @@ type Dialer interface {
} }
// NewSOCKS5Server 创建 SOCKS5 服务 // NewSOCKS5Server 创建 SOCKS5 服务
func NewSOCKS5Server(dialer Dialer) *SOCKS5Server { func NewSOCKS5Server(dialer Dialer, onStats func(in, out int64)) *SOCKS5Server {
return &SOCKS5Server{dialer: dialer} return &SOCKS5Server{dialer: dialer, onStats: onStats}
} }
// HandleConn 处理 SOCKS5 连接 // HandleConn 处理 SOCKS5 连接
@@ -60,9 +63,8 @@ func (s *SOCKS5Server) HandleConn(conn net.Conn) error {
return err return err
} }
// 双向转发 // 双向转发 (带流量统计)
go io.Copy(remote, conn) relay.RelayWithStats(conn, remote, s.onStats)
io.Copy(conn, remote)
return nil return nil
} }