diff --git a/.gitignore b/.gitignore index 8048ff2..71ffac9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ proxy.log -proxy-2025-01-10T06-26-50.064.log \ No newline at end of file +proxy-2025-01-10T06-26-50.064.log +proxy-2025-01-10T06-35-54.143.log \ No newline at end of file diff --git a/direct.txt- b/direct.txt- deleted file mode 100644 index 3f551a1..0000000 --- a/direct.txt- +++ /dev/null @@ -1,30 +0,0 @@ -# 直连域名列表 -# 每行一个域名,支持通配符 * -# 以 # 开头的行为注释 - -# 自定义域名 -*.19year.cn - - - -# 常用国内网站 -*.baidu.com -*.qq.com -*.163.com -*.taobao.com -*.tmall.com -*.jd.com -*.aliyun.com -*.weibo.com -*.bilibili.com - -# 常用开发网站 -*.gitee.com -*.coding.net -*.aliyuncs.com - -# 特殊域名 -localhost -*.local -*.test -*.example \ No newline at end of file diff --git a/pkg/proxy/proxylist.go b/pkg/proxy/proxylist.go deleted file mode 100644 index f0b8002..0000000 --- a/pkg/proxy/proxylist.go +++ /dev/null @@ -1,215 +0,0 @@ -package proxy - -import ( - "bufio" - "net" - "os" - "path/filepath" - "strings" - "sync" - - "s5/pkg/logger" -) - -// ProxyList 直连域名管理器 -type ProxyList struct { - patterns []string // 域名匹配模式 - mu sync.RWMutex // 读写锁 -} - -// NewProxyList 创建新的直连域名管理器 -func NewProxyList(filename string) *ProxyList { - dl := &ProxyList{} - if err := dl.Load(filename); err != nil { - log := logger.Get() - log.Errorf("[PROXY] 加载直连域名列表失败: %v", err) - } - return dl -} - -// Load 加载直连域名列表 -func (dl *ProxyList) Load(filename string) error { - log := logger.Get() - log.Debugf("[PROXY] =====================================================") - log.Debugf("[PROXY] 开始加载代理域名列表...") - log.Debugf("[PROXY] 配置文件: %s", filename) - - // 获取绝对路径 - absPath, err := filepath.Abs(filename) - if err != nil { - log.Errorf("[PROXY] 解析文件路径失败: %v", err) - log.Debugf("[PROXY] =====================================================") - return err - } - log.Debugf("[PROXY] 绝对路径: %s", absPath) - - // 检查文件是否存在 - if _, err := os.Stat(absPath); os.IsNotExist(err) { - log.Errorf("[PROXY] 文件不存在: %s", absPath) - log.Debugf("[PROXY] 将创建默认配置文件") - - // 创建默认配置文件 - if err := dl.createDefaultConfig(absPath); err != nil { - log.Errorf("[PROXY] 创建默认配置文件失败: %v", err) - log.Debugf("[PROXY] =====================================================") - return err - } - } - - file, err := os.Open(absPath) - if err != nil { - log.Errorf("[PROXY] 打开文件失败: %v", err) - log.Debugf("[PROXY] =====================================================") - return err - } - defer file.Close() - - var patterns []string - var skipped, added int - scanner := bufio.NewScanner(file) - lineNum := 0 - - log.Debugf("[PROXY] 开始解析规则:") - for scanner.Scan() { - lineNum++ - line := scanner.Text() - pattern := strings.TrimSpace(line) - - if pattern == "" { - log.Debugf("[PROXY] 行 %d: 空行,已跳过", lineNum) - skipped++ - continue - } - if strings.HasPrefix(pattern, "#") { - log.Debugf("[PROXY] 行 %d: 注释行,已跳过: %s", lineNum, line) - skipped++ - continue - } - - // 验证规则格式 - if strings.HasPrefix(pattern, "*.") { - log.Debugf("[PROXY] 行 %d: 添加通配符规则: %s", lineNum, pattern) - } else if strings.Contains(pattern, "*") { - log.Warnf("[PROXY] 行 %d: 不支持的通配符位置,规则可能无法正常工作: %s", lineNum, pattern) - } else { - log.Debugf("[PROXY] 行 %d: 添加精确匹配规则: %s", lineNum, pattern) - } - - patterns = append(patterns, pattern) - added++ - } - - if err := scanner.Err(); err != nil { - log.Errorf("[PROXY] 读取文件失败: %v", err) - log.Debugf("[PROXY] =====================================================") - return err - } - - dl.mu.Lock() - dl.patterns = patterns - dl.mu.Unlock() - - log.Debugf("[PROXY] 规则统计:") - log.Debugf("[PROXY] - 总行数: %d", lineNum) - log.Debugf("[PROXY] - 跳过行数: %d", skipped) - log.Debugf("[PROXY] - 有效规则: %d", added) - log.Infof("[PROXY] 代理域名列表加载完成") - log.Debugf("[PROXY] =====================================================") - - return nil -} - -// createDefaultConfig 创建默认配置文件 -func (dl *ProxyList) createDefaultConfig(path string) error { - defaultConfig := `# 代理域名列表 -# 每行一个域名,支持通配符 * -# 以 # 开头的行为注释 - -# 需要代理的域名 -*.google.com -*.youtube.com -*.facebook.com -*.twitter.com -*.github.com -*.githubusercontent.com -*.cloudflare.com -*.wikipedia.org -*.medium.com -*.reddit.com - -# 国外服务 -*.netflix.com -*.amazon.com -*.microsoft.com -*.apple.com -*.dropbox.com -*.telegram.org -*.whatsapp.com -*.instagram.com -*.twitch.tv -*.spotify.com - -# 开发相关 -*.docker.com -*.npmjs.com -*.pypi.org -*.rubygems.org -*.maven.org` - - return os.WriteFile(path, []byte(defaultConfig), 0644) -} - -// Match 检查域名是否匹配直连列表 -func (dl *ProxyList) Match(domain string) bool { - dl.mu.RLock() - defer dl.mu.RUnlock() - - log := logger.Get() - log.Debugf("[PROXY] =====================================================") - log.Debugf("[PROXY] 开始检查域名: %s", domain) - - // 处理特殊情况 - if domain == "" { - log.Warnf("[PROXY] 域名为空") - log.Debugf("[PROXY] =====================================================") - return false - } - - domain = strings.ToLower(domain) - log.Debugf("[PROXY] 规则匹配:") - log.Debugf("[PROXY] - 原始域名: %s", domain) - log.Debugf("[PROXY] - 处理后域名: %s", domain) - - // 检查是否是IP地址 - if ip := net.ParseIP(domain); ip != nil { - log.Debugf("[PROXY] - 域名是IP地址: %s", ip) - log.Debugf("[PROXY] =====================================================") - return false - } - - // 遍历所有规则进行匹配 - for i, pattern := range dl.patterns { - log.Debugf("[PROXY] 检查规则 #%d: %s", i+1, pattern) - if matchDomain(domain, pattern) { - log.Debugf("[PROXY] - 匹配成功: %s -> %s", domain, pattern) - log.Debugf("[PROXY] =====================================================") - return true - } - } - - log.Debugf("[PROXY] - 未匹配任何规则") - log.Debugf("[PROXY] =====================================================") - return false -} - -// matchDomain 检查域名是否匹配模式 -func matchDomain(domain, pattern string) bool { - if pattern[0] == '*' { - suffix := pattern[1:] - matched := strings.HasSuffix(domain, suffix) - if matched { - return true - } - } - return domain == pattern -} diff --git a/pkg/proxy/server.go b/pkg/proxy/server.go index 2801b5a..0ebf6e1 100644 --- a/pkg/proxy/server.go +++ b/pkg/proxy/server.go @@ -35,7 +35,6 @@ type Server struct { activeConns sync.WaitGroup // 活动连接计数 upstreamDialer *UpstreamDialer // 上游代理拨号器 shutdownTimeout time.Duration // 关闭超时时间 - directList *ProxyList // 直连域名管理器 } // NewServer 创建新的代理服务器实例 @@ -56,7 +55,6 @@ func NewServer(config ServerConfig, upstreamConfig config.UpstreamConfig) *Serve done: make(chan struct{}), upstreamDialer: upstreamDialer, shutdownTimeout: 30 * time.Second, - directList: NewProxyList("proxy.txt"), } } @@ -618,77 +616,22 @@ func (s *Server) dialTarget(addr string) (net.Conn, error) { log.Debugf("[PROXY] =====================================================") log.Debugf("[PROXY] 开始处理连接请求: %s", addr) - // 提取域名和端口 - host := addr - port := "" - if idx := strings.LastIndex(addr, ":"); idx != -1 { - host = addr[:idx] - port = addr[idx+1:] - } - - // 检查是否是IP地址 - if ip := net.ParseIP(host); ip != nil { - log.Debugf("[PROXY] 目标是IP地址: %s", host) - log.Debugf("[PROXY] - 端口: %s", port) - // IP地址默认直连 - log.Debugf("[PROXY] IP地址默认使用直连") - conn, err := net.Dial("tcp", addr) - if err != nil { - log.Errorf("[PROXY] 直接连接失败: %v", err) - log.Debugf("[PROXY] =====================================================") - return nil, err - } - log.Debugf("[PROXY] 直接连接成功") - log.Debugf("[PROXY] 连接详情:") - log.Debugf("[PROXY] - 本地地址: %s", conn.LocalAddr()) - log.Debugf("[PROXY] - 远程地址: %s", conn.RemoteAddr()) - log.Debugf("[PROXY] =====================================================") - return conn, nil - } - - // 检查是否在代理列表中 - useProxy := s.directList.Match(host) - log.Debugf("[PROXY] 域名检查:") - log.Debugf("[PROXY] - 目标地址: %s", addr) - log.Debugf("[PROXY] - 域名: %s", host) - log.Debugf("[PROXY] - 端口: %s", port) - log.Debugf("[PROXY] - 是否在代理列表: %v", useProxy) - - if useProxy { - // 使用代理连接 - log.Debugf("[PROXY] 使用代理连接:") - log.Debugf("[PROXY] - 上游代理: %s", s.upstreamDialer.config.Server) - log.Debugf("[PROXY] - 代理类型: %s", s.upstreamDialer.config.Type) - conn, err := s.upstreamDialer.Dial("tcp", addr) - if err != nil { - log.Errorf("[PROXY] 代理连接失败: %v", err) - log.Debugf("[PROXY] =====================================================") - return nil, err - } - log.Debugf("[PROXY] 代理连接成功") - log.Debugf("[PROXY] 连接详情:") - log.Debugf("[PROXY] - 本地地址: %s", conn.LocalAddr()) - log.Debugf("[PROXY] - 远程地址: %s", conn.RemoteAddr()) - log.Debugf("[PROXY] - 连接方式: 代理") - log.Debugf("[PROXY] - 判断依据: 域名在代理列表中") - log.Debugf("[PROXY] =====================================================") - return conn, nil - } - - // 不在代理列表中的域名直连 - log.Debugf("[PROXY] 使用直接连接") - conn, err := net.Dial("tcp", addr) + // 使用代理连接 + log.Debugf("[PROXY] 使用代理连接:") + log.Debugf("[PROXY] - 上游代理: %s", s.upstreamDialer.config.Server) + log.Debugf("[PROXY] - 代理类型: %s", s.upstreamDialer.config.Type) + + conn, err := s.upstreamDialer.Dial("tcp", addr) if err != nil { - log.Errorf("[PROXY] 直接连接失败: %v", err) + log.Errorf("[PROXY] 代理连接失败: %v", err) log.Debugf("[PROXY] =====================================================") return nil, err } - log.Debugf("[PROXY] 直接连接成功") + + log.Debugf("[PROXY] 代理连接成功") log.Debugf("[PROXY] 连接详情:") log.Debugf("[PROXY] - 本地地址: %s", conn.LocalAddr()) log.Debugf("[PROXY] - 远程地址: %s", conn.RemoteAddr()) - log.Debugf("[PROXY] - 连接方式: 直连") - log.Debugf("[PROXY] - 判断依据: 域名不在代理列表中") log.Debugf("[PROXY] =====================================================") return conn, nil diff --git a/proxy.txt b/proxy.txt deleted file mode 100644 index e44af95..0000000 --- a/proxy.txt +++ /dev/null @@ -1,35 +0,0 @@ -# 代理域名列表 -# 每行一个域名,支持通配符 * -# 以 # 开头的行为注释 - -# 需要代理的域名 -*.google.com -*.youtube.com -*.facebook.com -*.twitter.com -*.github.com -*.githubusercontent.com -*.cloudflare.com -*.wikipedia.org -*.medium.com -*.reddit.com -*.googlevideo.com - -# 国外服务 -*.netflix.com -*.amazon.com -*.microsoft.com -*.apple.com -*.dropbox.com -*.telegram.org -*.whatsapp.com -*.instagram.com -*.twitch.tv -*.spotify.com - -# 开发相关 -*.docker.com -*.npmjs.com -*.pypi.org -*.rubygems.org -*.maven.org \ No newline at end of file