socks.go 6.9 KB

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