main.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package main
  2. import (
  3. "container/list"
  4. "flag"
  5. "fmt"
  6. "io"
  7. "io/fs"
  8. "io/ioutil"
  9. "log"
  10. "net"
  11. "net/http"
  12. "os"
  13. "path/filepath"
  14. "time"
  15. )
  16. var (
  17. ipcenteraddr = flag.String("centeraddr", "127.0.0.1:60910", "IP代理中心地址") //IP代理中心地址
  18. addr = flag.String("addr", ":18080", "跳板socks5监听地址")
  19. monitorAddr = flag.String("maddr", ":18081", "监控地址")
  20. connectTimeout = flag.Int64("cto", 90, "网络链接超时")
  21. currentTargetAddr = "" //当前环境IP
  22. cache = list.New()
  23. diskCacheDir = flag.String("cachedir", "./cache_dir", "用户缓存目录位置")
  24. //userDataDir = flag.String("userdir", "./user_dir", "用户数据目录位置")
  25. //poolMinLimit = flag.Int("pl", 3, "IP池最少容量")
  26. //ipOilLifeLimit = flag.Int("ipol", 90, "IP剩余最少可用秒数")
  27. //no = flag.String("no", "1", "编号")
  28. //ip *IpPool
  29. )
  30. // init
  31. func init() {
  32. flag.Parse()
  33. }
  34. // forward
  35. func forward(src, dest io.ReadWriteCloser) {
  36. defer func() {
  37. //fmt.Print("@")
  38. if src != nil {
  39. _ = src.Close()
  40. }
  41. if dest != nil {
  42. _ = dest.Close()
  43. }
  44. }()
  45. if src == nil || dest == nil {
  46. return
  47. }
  48. _, _ = io.Copy(src, dest)
  49. }
  50. // processClient
  51. func processClient(client net.Conn) {
  52. defer func() {
  53. if err := recover(); err != nil {
  54. fmt.Printf("{err %v}", err)
  55. }
  56. }()
  57. var targetConn net.Conn
  58. var err error
  59. for {
  60. //默认复用上一次可用IP
  61. targetConn, err = net.DialTimeout("tcp", currentTargetAddr, time.Duration(*connectTimeout)*time.Second)
  62. //fmt.Println("check ip:", currentTargetAddr)
  63. if err == nil {
  64. break
  65. }
  66. //跳板主动切换IP
  67. currentTargetAddr = getIp()
  68. fmt.Println("自主检测,切换本机IP:", currentTargetAddr)
  69. }
  70. //fmt.Printf("{%s %s}", *no, currentTargetAddr)
  71. cache.PushBack([2]net.Conn{client, targetConn})
  72. go forward(client, targetConn)
  73. go forward(targetConn, client)
  74. }
  75. // changeIp 切换代理IP,被动切换IP
  76. func changeIp() {
  77. currentTargetAddr = getIp()
  78. fmt.Println("ChangeIp:", currentTargetAddr)
  79. for e := cache.Front(); e != nil; e = e.Next() {
  80. connes, _ := e.Value.([2](net.Conn))
  81. if connes[0].Close() != nil {
  82. connes[0].Close()
  83. }
  84. if connes[1].Close() != nil {
  85. connes[0].Close()
  86. }
  87. }
  88. }
  89. // clearTrace
  90. func clearTrace() {
  91. if *diskCacheDir != "" {
  92. filepath.Walk(*diskCacheDir,
  93. func(path string,
  94. info fs.FileInfo, err error) error {
  95. if err == nil && info != nil && !info.IsDir() {
  96. os.Remove(path)
  97. }
  98. return nil
  99. })
  100. }
  101. }
  102. // monitor
  103. func monitor() {
  104. //最好是单实例调用
  105. http.HandleFunc("/changeip", func(w http.ResponseWriter, r *http.Request) {
  106. changeIp()
  107. w.Write([]byte("ok"))
  108. })
  109. http.HandleFunc("/cleartrace", func(w http.ResponseWriter, r *http.Request) {
  110. clearTrace()
  111. w.Write([]byte("ok"))
  112. })
  113. http.ListenAndServe(*monitorAddr, nil)
  114. }
  115. func getIp() string {
  116. defer Catch()
  117. var ip string
  118. for i := 1; i <= 3; i++ {
  119. url := "http://" + *ipcenteraddr + "/getip"
  120. client := &http.Client{Timeout: time.Second * 5}
  121. resp, err := client.Get(url)
  122. //resp, err := http.Get(url)
  123. if err != nil {
  124. continue
  125. }
  126. bs, err := ioutil.ReadAll(resp.Body)
  127. if err != nil {
  128. continue
  129. }
  130. resp.Body.Close()
  131. ip = string(bs)
  132. break
  133. }
  134. return ip
  135. }
  136. // main
  137. func main() {
  138. conn, err := net.Listen("tcp", *addr)
  139. if err != nil {
  140. log.Fatal(err)
  141. return
  142. }
  143. //
  144. go monitor()
  145. //
  146. currentTargetAddr = getIp()
  147. fmt.Println("当前环境IP:", currentTargetAddr)
  148. //
  149. for {
  150. client, err := conn.Accept()
  151. if err != nil {
  152. log.Fatalf("Listen failed: %v\n", err)
  153. continue
  154. }
  155. go processClient(client)
  156. }
  157. }