socks.go 6.8 KB

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