socks5.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. package server
  2. import (
  3. "encoding/binary"
  4. "errors"
  5. "github.com/cnlh/easyProxy/bridge"
  6. "github.com/cnlh/easyProxy/utils"
  7. "io"
  8. "net"
  9. "strconv"
  10. "strings"
  11. )
  12. const (
  13. ipV4 = 1
  14. domainName = 3
  15. ipV6 = 4
  16. connectMethod = 1
  17. bindMethod = 2
  18. associateMethod = 3
  19. // The maximum packet size of any udp Associate packet, based on ethernet's max size,
  20. // minus the IP and UDP headers. IPv4 has a 20 byte header, UDP adds an
  21. // additional 4 bytes. This is a total overhead of 24 bytes. Ethernet's
  22. // max packet size is 1500 bytes, 1500 - 24 = 1476.
  23. maxUDPPacketSize = 1476
  24. )
  25. const (
  26. succeeded uint8 = iota
  27. serverFailure
  28. notAllowed
  29. networkUnreachable
  30. hostUnreachable
  31. connectionRefused
  32. ttlExpired
  33. commandNotSupported
  34. addrTypeNotSupported
  35. )
  36. const (
  37. UserPassAuth = uint8(2)
  38. userAuthVersion = uint8(1)
  39. authSuccess = uint8(0)
  40. authFailure = uint8(1)
  41. )
  42. type Sock5ModeServer struct {
  43. server
  44. isVerify bool
  45. listener net.Listener
  46. }
  47. //req
  48. func (s *Sock5ModeServer) handleRequest(c net.Conn) {
  49. /*
  50. The SOCKS request is formed as follows:
  51. +----+-----+-------+------+----------+----------+
  52. |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
  53. +----+-----+-------+------+----------+----------+
  54. | 1 | 1 | X'00' | 1 | Variable | 2 |
  55. +----+-----+-------+------+----------+----------+
  56. */
  57. header := make([]byte, 3)
  58. _, err := io.ReadFull(c, header)
  59. if err != nil {
  60. utils.Println("illegal request", err)
  61. c.Close()
  62. return
  63. }
  64. switch header[1] {
  65. case connectMethod:
  66. s.handleConnect(c)
  67. case bindMethod:
  68. s.handleBind(c)
  69. case associateMethod:
  70. s.handleUDP(c)
  71. default:
  72. s.sendReply(c, commandNotSupported)
  73. c.Close()
  74. }
  75. }
  76. //reply
  77. func (s *Sock5ModeServer) sendReply(c net.Conn, rep uint8) {
  78. reply := []byte{
  79. 5,
  80. rep,
  81. 0,
  82. 1,
  83. }
  84. localAddr := c.LocalAddr().String()
  85. localHost, localPort, _ := net.SplitHostPort(localAddr)
  86. ipBytes := net.ParseIP(localHost).To4()
  87. nPort, _ := strconv.Atoi(localPort)
  88. reply = append(reply, ipBytes...)
  89. portBytes := make([]byte, 2)
  90. binary.BigEndian.PutUint16(portBytes, uint16(nPort))
  91. reply = append(reply, portBytes...)
  92. c.Write(reply)
  93. }
  94. //do conn
  95. func (s *Sock5ModeServer) doConnect(c net.Conn, command uint8) {
  96. addrType := make([]byte, 1)
  97. c.Read(addrType)
  98. var host string
  99. switch addrType[0] {
  100. case ipV4:
  101. ipv4 := make(net.IP, net.IPv4len)
  102. c.Read(ipv4)
  103. host = ipv4.String()
  104. case ipV6:
  105. ipv6 := make(net.IP, net.IPv6len)
  106. c.Read(ipv6)
  107. host = ipv6.String()
  108. case domainName:
  109. var domainLen uint8
  110. binary.Read(c, binary.BigEndian, &domainLen)
  111. domain := make([]byte, domainLen)
  112. c.Read(domain)
  113. host = string(domain)
  114. default:
  115. s.sendReply(c, addrTypeNotSupported)
  116. return
  117. }
  118. var port uint16
  119. binary.Read(c, binary.BigEndian, &port)
  120. // connect to host
  121. addr := net.JoinHostPort(host, strconv.Itoa(int(port)))
  122. var ltype string
  123. if command == associateMethod {
  124. ltype = utils.CONN_UDP
  125. } else {
  126. ltype = utils.CONN_TCP
  127. }
  128. link := utils.NewLink(s.task.Client.GetId(), ltype, addr, s.config.CompressEncode, s.config.CompressDecode, s.config.Crypt, utils.NewConn(c), s.task.Flow, nil, s.task.Client.Rate, nil)
  129. if tunnel, err := s.bridge.SendLinkInfo(s.task.Client.Id, link); err != nil {
  130. c.Close()
  131. return
  132. } else {
  133. s.sendReply(c, succeeded)
  134. s.linkCopy(link, utils.NewConn(c), nil, tunnel, s.task.Flow)
  135. }
  136. return
  137. }
  138. //conn
  139. func (s *Sock5ModeServer) handleConnect(c net.Conn) {
  140. s.doConnect(c, connectMethod)
  141. }
  142. // passive mode
  143. func (s *Sock5ModeServer) handleBind(c net.Conn) {
  144. }
  145. //udp
  146. func (s *Sock5ModeServer) handleUDP(c net.Conn) {
  147. utils.Println("UDP Associate")
  148. /*
  149. +----+------+------+----------+----------+----------+
  150. |RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA |
  151. +----+------+------+----------+----------+----------+
  152. | 2 | 1 | 1 | Variable | 2 | Variable |
  153. +----+------+------+----------+----------+----------+
  154. */
  155. buf := make([]byte, 3)
  156. c.Read(buf)
  157. // relay udp datagram silently, without any notification to the requesting client
  158. if buf[2] != 0 {
  159. // does not support fragmentation, drop it
  160. utils.Println("does not support fragmentation, drop")
  161. dummy := make([]byte, maxUDPPacketSize)
  162. c.Read(dummy)
  163. }
  164. s.doConnect(c, associateMethod)
  165. }
  166. //new conn
  167. func (s *Sock5ModeServer) handleConn(c net.Conn) {
  168. buf := make([]byte, 2)
  169. if _, err := io.ReadFull(c, buf); err != nil {
  170. utils.Println("negotiation err", err)
  171. c.Close()
  172. return
  173. }
  174. if version := buf[0]; version != 5 {
  175. utils.Println("only support socks5, request from: ", c.RemoteAddr())
  176. c.Close()
  177. return
  178. }
  179. nMethods := buf[1]
  180. methods := make([]byte, nMethods)
  181. if len, err := c.Read(methods); len != int(nMethods) || err != nil {
  182. utils.Println("wrong method")
  183. c.Close()
  184. return
  185. }
  186. if s.isVerify {
  187. buf[1] = UserPassAuth
  188. c.Write(buf)
  189. if err := s.Auth(c); err != nil {
  190. c.Close()
  191. utils.Println("验证失败:", err)
  192. return
  193. }
  194. } else {
  195. buf[1] = 0
  196. c.Write(buf)
  197. }
  198. s.handleRequest(c)
  199. }
  200. //socks5 auth
  201. func (s *Sock5ModeServer) Auth(c net.Conn) error {
  202. header := []byte{0, 0}
  203. if _, err := io.ReadAtLeast(c, header, 2); err != nil {
  204. return err
  205. }
  206. if header[0] != userAuthVersion {
  207. return errors.New("验证方式不被支持")
  208. }
  209. userLen := int(header[1])
  210. user := make([]byte, userLen)
  211. if _, err := io.ReadAtLeast(c, user, userLen); err != nil {
  212. return err
  213. }
  214. if _, err := c.Read(header[:1]); err != nil {
  215. return errors.New("密码长度获取错误")
  216. }
  217. passLen := int(header[0])
  218. pass := make([]byte, passLen)
  219. if _, err := io.ReadAtLeast(c, pass, passLen); err != nil {
  220. return err
  221. }
  222. if string(pass) == s.config.U && string(user) == s.config.P {
  223. if _, err := c.Write([]byte{userAuthVersion, authSuccess}); err != nil {
  224. return err
  225. }
  226. return nil
  227. } else {
  228. if _, err := c.Write([]byte{userAuthVersion, authFailure}); err != nil {
  229. return err
  230. }
  231. return errors.New("验证不通过")
  232. }
  233. return errors.New("未知错误")
  234. }
  235. //start
  236. func (s *Sock5ModeServer) Start() error {
  237. var err error
  238. s.listener, err = net.Listen("tcp", ":"+strconv.Itoa(s.task.TcpPort))
  239. if err != nil {
  240. return err
  241. }
  242. for {
  243. conn, err := s.listener.Accept()
  244. if err != nil {
  245. if strings.Contains(err.Error(), "use of closed network connection") {
  246. break
  247. }
  248. utils.Fatalln("accept error: ", err)
  249. }
  250. if !s.ResetConfig() {
  251. conn.Close()
  252. continue
  253. }
  254. go s.handleConn(conn)
  255. }
  256. return nil
  257. }
  258. //close
  259. func (s *Sock5ModeServer) Close() error {
  260. return s.listener.Close()
  261. }
  262. //new
  263. func NewSock5ModeServer(bridge *bridge.Bridge, task *utils.Tunnel) *Sock5ModeServer {
  264. s := new(Sock5ModeServer)
  265. s.bridge = bridge
  266. s.task = task
  267. s.config = utils.DeepCopyConfig(task.Config)
  268. if s.config.U != "" && s.config.P != "" {
  269. s.isVerify = true
  270. } else {
  271. s.isVerify = false
  272. }
  273. return s
  274. }