socks.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. // Package socks contains protocol definition and io lib for SOCKS5 protocol
  2. package socks
  3. import (
  4. "encoding/binary"
  5. "errors"
  6. "fmt"
  7. "io"
  8. "github.com/v2ray/v2ray-core/log"
  9. v2net "github.com/v2ray/v2ray-core/net"
  10. )
  11. const (
  12. socksVersion = byte(0x05)
  13. socks4Version = byte(0x04)
  14. AuthNotRequired = byte(0x00)
  15. AuthGssApi = byte(0x01)
  16. AuthUserPass = byte(0x02)
  17. AuthNoMatchingMethod = byte(0xFF)
  18. Socks4RequestGranted = byte(90)
  19. Socks4RequestRejected = byte(91)
  20. )
  21. var (
  22. ErrorSocksVersion4 = errors.New("Using SOCKS version 4.")
  23. )
  24. // Authentication request header of Socks5 protocol
  25. type Socks5AuthenticationRequest struct {
  26. version byte
  27. nMethods byte
  28. authMethods [256]byte
  29. }
  30. type Socks4AuthenticationRequest struct {
  31. Version byte
  32. Command byte
  33. Port uint16
  34. IP [4]byte
  35. }
  36. func (request *Socks5AuthenticationRequest) HasAuthMethod(method byte) bool {
  37. for i := 0; i < int(request.nMethods); i++ {
  38. if request.authMethods[i] == method {
  39. return true
  40. }
  41. }
  42. return false
  43. }
  44. func ReadAuthentication(reader io.Reader) (auth Socks5AuthenticationRequest, auth4 Socks4AuthenticationRequest, err error) {
  45. buffer := make([]byte, 256)
  46. nBytes, err := reader.Read(buffer)
  47. if err != nil {
  48. log.Error("Failed to read socks authentication: %v", err)
  49. return
  50. }
  51. if nBytes < 2 {
  52. err = fmt.Errorf("Expected 2 bytes read, but actaully %d bytes read", nBytes)
  53. return
  54. }
  55. if buffer[0] == socks4Version {
  56. auth4.Version = buffer[0]
  57. auth4.Command = buffer[1]
  58. auth4.Port = binary.BigEndian.Uint16(buffer[2:4])
  59. copy(auth4.IP[:], buffer[4:8])
  60. err = ErrorSocksVersion4
  61. return
  62. }
  63. auth.version = buffer[0]
  64. if auth.version != socksVersion {
  65. err = fmt.Errorf("Unknown SOCKS version %d", auth.version)
  66. return
  67. }
  68. auth.nMethods = buffer[1]
  69. if auth.nMethods <= 0 {
  70. err = fmt.Errorf("Zero length of authentication methods")
  71. return
  72. }
  73. if nBytes-2 != int(auth.nMethods) {
  74. err = fmt.Errorf("Unmatching number of auth methods, expecting %d, but got %d", auth.nMethods, nBytes)
  75. return
  76. }
  77. copy(auth.authMethods[:], buffer[2:nBytes])
  78. return
  79. }
  80. type Socks5AuthenticationResponse struct {
  81. version byte
  82. authMethod byte
  83. }
  84. type Socks4AuthenticationResponse struct {
  85. result byte
  86. port uint16
  87. ip []byte
  88. }
  89. func NewAuthenticationResponse(authMethod byte) *Socks5AuthenticationResponse {
  90. return &Socks5AuthenticationResponse{
  91. version: socksVersion,
  92. authMethod: authMethod,
  93. }
  94. }
  95. func NewSocks4AuthenticationResponse(result byte, port uint16, ip []byte) *Socks4AuthenticationResponse {
  96. return &Socks4AuthenticationResponse{
  97. result: result,
  98. port: port,
  99. ip: ip,
  100. }
  101. }
  102. func WriteAuthentication(writer io.Writer, r *Socks5AuthenticationResponse) error {
  103. _, err := writer.Write([]byte{r.version, r.authMethod})
  104. return err
  105. }
  106. func WriteSocks4AuthenticationResponse(writer io.Writer, r *Socks4AuthenticationResponse) error {
  107. buffer := make([]byte, 8)
  108. // buffer[0] is always 0
  109. buffer[1] = r.result
  110. binary.BigEndian.PutUint16(buffer[2:4], r.port)
  111. copy(buffer[4:], r.ip)
  112. _, err := writer.Write(buffer)
  113. return err
  114. }
  115. type Socks5UserPassRequest struct {
  116. version byte
  117. username string
  118. password string
  119. }
  120. func (request Socks5UserPassRequest) IsValid(username string, password string) bool {
  121. return request.username == username && request.password == password
  122. }
  123. func ReadUserPassRequest(reader io.Reader) (request Socks5UserPassRequest, err error) {
  124. buffer := make([]byte, 256)
  125. _, err = reader.Read(buffer[0:2])
  126. if err != nil {
  127. return
  128. }
  129. request.version = buffer[0]
  130. nUsername := buffer[1]
  131. nBytes, err := reader.Read(buffer[:nUsername])
  132. if err != nil {
  133. return
  134. }
  135. request.username = string(buffer[:nBytes])
  136. _, err = reader.Read(buffer[0:1])
  137. if err != nil {
  138. return
  139. }
  140. nPassword := buffer[0]
  141. nBytes, err = reader.Read(buffer[:nPassword])
  142. if err != nil {
  143. return
  144. }
  145. request.password = string(buffer[:nBytes])
  146. return
  147. }
  148. type Socks5UserPassResponse struct {
  149. version byte
  150. status byte
  151. }
  152. func NewSocks5UserPassResponse(status byte) Socks5UserPassResponse {
  153. return Socks5UserPassResponse{
  154. version: socksVersion,
  155. status: status,
  156. }
  157. }
  158. func WriteUserPassResponse(writer io.Writer, response Socks5UserPassResponse) error {
  159. _, err := writer.Write([]byte{response.version, response.status})
  160. return err
  161. }
  162. const (
  163. AddrTypeIPv4 = byte(0x01)
  164. AddrTypeIPv6 = byte(0x04)
  165. AddrTypeDomain = byte(0x03)
  166. CmdConnect = byte(0x01)
  167. CmdBind = byte(0x02)
  168. CmdUdpAssociate = byte(0x03)
  169. )
  170. type Socks5Request struct {
  171. Version byte
  172. Command byte
  173. AddrType byte
  174. IPv4 [4]byte
  175. Domain string
  176. IPv6 [16]byte
  177. Port uint16
  178. }
  179. func ReadRequest(reader io.Reader) (request *Socks5Request, err error) {
  180. buffer := make([]byte, 4)
  181. nBytes, err := reader.Read(buffer)
  182. if err != nil {
  183. return
  184. }
  185. if nBytes < len(buffer) {
  186. err = fmt.Errorf("Unable to read request.")
  187. return
  188. }
  189. request = &Socks5Request{
  190. Version: buffer[0],
  191. Command: buffer[1],
  192. // buffer[2] is a reserved field
  193. AddrType: buffer[3],
  194. }
  195. switch request.AddrType {
  196. case AddrTypeIPv4:
  197. nBytes, err = reader.Read(request.IPv4[:])
  198. if err != nil {
  199. return
  200. }
  201. if nBytes != 4 {
  202. err = fmt.Errorf("Unable to read IPv4 address.")
  203. return
  204. }
  205. case AddrTypeDomain:
  206. buffer = make([]byte, 256)
  207. nBytes, err = reader.Read(buffer[0:1])
  208. if err != nil {
  209. return
  210. }
  211. domainLength := buffer[0]
  212. nBytes, err = reader.Read(buffer[:domainLength])
  213. if err != nil {
  214. return
  215. }
  216. if nBytes != int(domainLength) {
  217. err = fmt.Errorf("Unable to read domain with %d bytes, expecting %d bytes", nBytes, domainLength)
  218. return
  219. }
  220. request.Domain = string(buffer[:domainLength])
  221. case AddrTypeIPv6:
  222. nBytes, err = reader.Read(request.IPv6[:])
  223. if err != nil {
  224. return
  225. }
  226. if nBytes != 16 {
  227. err = fmt.Errorf("Unable to read IPv4 address.")
  228. return
  229. }
  230. default:
  231. err = fmt.Errorf("Unexpected address type %d", request.AddrType)
  232. return
  233. }
  234. buffer = make([]byte, 2)
  235. nBytes, err = reader.Read(buffer)
  236. if err != nil {
  237. return
  238. }
  239. if nBytes != 2 {
  240. err = fmt.Errorf("Unable to read port.")
  241. return
  242. }
  243. request.Port = binary.BigEndian.Uint16(buffer)
  244. return
  245. }
  246. func (request *Socks5Request) Destination() v2net.Address {
  247. switch request.AddrType {
  248. case AddrTypeIPv4:
  249. return v2net.IPAddress(request.IPv4[:], request.Port)
  250. case AddrTypeIPv6:
  251. return v2net.IPAddress(request.IPv6[:], request.Port)
  252. case AddrTypeDomain:
  253. return v2net.DomainAddress(request.Domain, request.Port)
  254. default:
  255. panic("Unknown address type")
  256. }
  257. }
  258. const (
  259. ErrorSuccess = byte(0x00)
  260. ErrorGeneralFailure = byte(0x01)
  261. ErrorConnectionNotAllowed = byte(0x02)
  262. ErrorNetworkUnreachable = byte(0x03)
  263. ErrorHostUnUnreachable = byte(0x04)
  264. ErrorConnectionRefused = byte(0x05)
  265. ErrorTTLExpired = byte(0x06)
  266. ErrorCommandNotSupported = byte(0x07)
  267. ErrorAddressTypeNotSupported = byte(0x08)
  268. )
  269. type Socks5Response struct {
  270. Version byte
  271. Error byte
  272. AddrType byte
  273. IPv4 [4]byte
  274. Domain string
  275. IPv6 [16]byte
  276. Port uint16
  277. }
  278. func NewSocks5Response() *Socks5Response {
  279. return &Socks5Response{
  280. Version: socksVersion,
  281. }
  282. }
  283. func (r *Socks5Response) SetIPv4(ipv4 []byte) {
  284. r.AddrType = AddrTypeIPv4
  285. copy(r.IPv4[:], ipv4)
  286. }
  287. func (r *Socks5Response) SetIPv6(ipv6 []byte) {
  288. r.AddrType = AddrTypeIPv6
  289. copy(r.IPv6[:], ipv6)
  290. }
  291. func (r *Socks5Response) SetDomain(domain string) {
  292. r.AddrType = AddrTypeDomain
  293. r.Domain = domain
  294. }
  295. func (r *Socks5Response) toBytes() []byte {
  296. buffer := make([]byte, 0, 300)
  297. buffer = append(buffer, r.Version)
  298. buffer = append(buffer, r.Error)
  299. buffer = append(buffer, 0x00) // reserved
  300. buffer = append(buffer, r.AddrType)
  301. switch r.AddrType {
  302. case 0x01:
  303. buffer = append(buffer, r.IPv4[:]...)
  304. case 0x03:
  305. buffer = append(buffer, byte(len(r.Domain)))
  306. buffer = append(buffer, []byte(r.Domain)...)
  307. case 0x04:
  308. buffer = append(buffer, r.IPv6[:]...)
  309. }
  310. portBuffer := make([]byte, 2)
  311. binary.BigEndian.PutUint16(portBuffer, r.Port)
  312. buffer = append(buffer, portBuffer...)
  313. return buffer
  314. }
  315. func WriteResponse(writer io.Writer, response *Socks5Response) error {
  316. _, err := writer.Write(response.toBytes())
  317. return err
  318. }