@@ -11,6 +11,7 @@ import (
1111 "github.com/Sesame2/gotun/internal/config"
1212 "github.com/Sesame2/gotun/internal/logger"
1313 "github.com/Sesame2/gotun/internal/proxy"
14+ "github.com/Sesame2/gotun/internal/router"
1415 "github.com/Sesame2/gotun/internal/sysproxy"
1516 "github.com/spf13/cobra"
1617)
@@ -57,14 +58,43 @@ var rootCmd = &cobra.Command{
5758 }
5859 log .Infof ("GoTun %s 启动中..." , Version )
5960
60- httpProxy , err := proxy .NewHTTPOverSSH (cfg , log )
61+ // 1. 初始化 Router
62+ var r * router.Router
63+ if cfg .RuleFile != "" {
64+ var err error
65+ r , err = router .NewRouter (cfg .RuleFile )
66+ if err != nil {
67+ log .Warnf ("加载规则文件失败: %v。将以全局代理模式运行。" , err )
68+ } else {
69+ log .Infof ("已加载规则文件: %s" , cfg .RuleFile )
70+ }
71+ }
72+
73+ // 2. 初始化 SSHClient
74+ sshClient , err := proxy .NewSSHClient (cfg , log )
6175 if err != nil {
62- return fmt .Errorf ("代理初始化失败: %w" , err )
76+ return fmt .Errorf ("SSH连接失败: %w" , err )
77+ }
78+ defer sshClient .Close ()
79+
80+ // 3. 初始化 HTTP 代理
81+ httpProxy , err := proxy .NewHTTPOverSSH (cfg , log , sshClient , r )
82+ if err != nil {
83+ return fmt .Errorf ("HTTP代理初始化失败: %w" , err )
84+ }
85+
86+ // 4. 初始化 SOCKS5 代理
87+ var socksProxy * proxy.SOCKS5OverSSH
88+ if cfg .SocksAddr != "" {
89+ socksProxy , err = proxy .NewSOCKS5OverSSH (cfg , log , sshClient , r )
90+ if err != nil {
91+ return fmt .Errorf ("SOCKS5代理初始化失败: %w" , err )
92+ }
6393 }
6494
6595 var proxyMgr * sysproxy.Manager
6696 if cfg .SystemProxy {
67- proxyMgr = sysproxy .NewManager (log , cfg .ListenAddr )
97+ proxyMgr = sysproxy .NewManager (log , cfg .ListenAddr , cfg . SocksAddr )
6898 }
6999
70100 sigChan := make (chan os.Signal , 1 )
@@ -77,12 +107,26 @@ var rootCmd = &cobra.Command{
77107 }
78108 }
79109 if err := httpProxy .Start (); err != nil {
80- log .Errorf ("代理服务启动失败 : %v" , err )
110+ log .Errorf ("HTTP代理服务启动失败 : %v" , err )
81111 sigChan <- syscall .SIGTERM
82112 }
83113 }()
84114
85- fmt .Println ("\n 代理服务已启动:" , "http://" + cfg .ListenAddr )
115+ if socksProxy != nil {
116+ go func () {
117+ if err := socksProxy .Start (); err != nil {
118+ log .Errorf ("SOCKS5代理服务启动失败: %v" , err )
119+ sigChan <- syscall .SIGTERM
120+ }
121+ }()
122+ }
123+
124+ fmt .Println ("\n 代理服务已启动:" )
125+ fmt .Println ("HTTP Proxy:" , "http://" + cfg .ListenAddr )
126+ if cfg .SocksAddr != "" {
127+ fmt .Println ("SOCKS5 Proxy:" , "socks5://" + cfg .SocksAddr )
128+ }
129+
86130 if len (cfg .JumpHosts ) > 0 {
87131 fmt .Printf ("跳板机链: %s -> %s\n " , fmt .Sprintf ("%v" , cfg .JumpHosts ), cfg .SSHServer )
88132 } else {
@@ -106,7 +150,14 @@ var rootCmd = &cobra.Command{
106150 }
107151
108152 if err := httpProxy .Close (); err != nil {
109- log .Errorf ("关闭代理服务失败: %v" , err )
153+ log .Errorf ("关闭HTTP代理服务失败: %v" , err )
154+ }
155+
156+ // 新增关闭逻辑
157+ if socksProxy != nil {
158+ if err := socksProxy .Close (); err != nil {
159+ log .Errorf ("关闭SOCKS5代理服务失败: %v" , err )
160+ }
110161 }
111162
112163 return nil
@@ -127,6 +178,7 @@ func init() {
127178 rootCmd .PersistentFlags ().StringVar (& cfg .LogFile , "log" , "" , "日志文件路径" )
128179 rootCmd .PersistentFlags ().BoolVar (& cfg .SystemProxy , "sys-proxy" , true , "自动设置/恢复系统代理" )
129180 rootCmd .PersistentFlags ().StringVar (& cfg .RuleFile , "rules" , "" , "代理规则配置文件路径" )
181+ rootCmd .PersistentFlags ().StringVar (& cfg .SocksAddr , "socks5" , ":1080" , "SOCKS5 代理监听地址" )
130182}
131183
132184func Execute (version string ) {
0 commit comments