socks5_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package process
  2. import (
  3. "crypto/tls"
  4. "ehang.io/nps/core/action"
  5. "ehang.io/nps/lib/common"
  6. "ehang.io/nps/lib/enet"
  7. "fmt"
  8. "github.com/stretchr/testify/assert"
  9. "golang.org/x/net/proxy"
  10. "net"
  11. "net/http"
  12. "net/url"
  13. "testing"
  14. "time"
  15. )
  16. func TestSocks5ProxyProcess(t *testing.T) {
  17. sAddr, err := startHttps(t)
  18. assert.NoError(t, err)
  19. h := Socks5Process{
  20. DefaultProcess: DefaultProcess{},
  21. }
  22. ac := &action.LocalAction{}
  23. ac.Init()
  24. assert.NoError(t, h.Init(ac))
  25. ln, err := net.Listen("tcp", "127.0.0.1:0")
  26. assert.NoError(t, err)
  27. go func() {
  28. for {
  29. c, err := ln.Accept()
  30. assert.NoError(t, err)
  31. go h.ProcessConn(enet.NewReaderConn(c))
  32. }
  33. }()
  34. transport := &http.Transport{
  35. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  36. Proxy: func(_ *http.Request) (*url.URL, error) {
  37. return url.Parse(fmt.Sprintf("socks5://%s", ln.Addr().String()))
  38. },
  39. }
  40. client := &http.Client{Transport: transport}
  41. resp, err := client.Get(fmt.Sprintf("https://%s/now", sAddr))
  42. assert.NoError(t, err)
  43. assert.Equal(t, 200, resp.StatusCode)
  44. }
  45. func TestSocks5ProxyProcessAuth(t *testing.T) {
  46. sAddr, err := startHttps(t)
  47. h := Socks5Process{
  48. DefaultProcess: DefaultProcess{},
  49. Accounts: map[string]string{"aaa": "bbb"},
  50. }
  51. ac := &action.LocalAction{}
  52. ac.Init()
  53. assert.NoError(t, h.Init(ac))
  54. ln, err := net.Listen("tcp", "127.0.0.1:0")
  55. assert.NoError(t, err)
  56. go func() {
  57. for {
  58. c, err := ln.Accept()
  59. assert.NoError(t, err)
  60. go func() {
  61. _, _ = h.ProcessConn(enet.NewReaderConn(c))
  62. _ = c.Close()
  63. }()
  64. }
  65. }()
  66. auth := proxy.Auth{
  67. User: "aaa",
  68. Password: "bbb",
  69. }
  70. dialer, err := proxy.SOCKS5("tcp", ln.Addr().String(), nil, proxy.Direct)
  71. assert.NoError(t, err)
  72. tr := &http.Transport{Dial: dialer.Dial, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
  73. client := &http.Client{
  74. Transport: tr,
  75. }
  76. resp, err := client.Get(fmt.Sprintf("https://%s/now", sAddr))
  77. assert.Error(t, err)
  78. dialer, err = proxy.SOCKS5("tcp", ln.Addr().String(), &auth, proxy.Direct)
  79. assert.NoError(t, err)
  80. tr = &http.Transport{Dial: dialer.Dial, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
  81. client = &http.Client{
  82. Transport: tr,
  83. }
  84. resp, err = client.Get(fmt.Sprintf("https://%s/now", sAddr))
  85. assert.NoError(t, err)
  86. assert.Equal(t, 200, resp.StatusCode)
  87. }
  88. func TestSocks5ProxyProcessUdp(t *testing.T) {
  89. h := Socks5Process{
  90. DefaultProcess: DefaultProcess{},
  91. }
  92. ac := &action.LocalAction{}
  93. ac.Init()
  94. assert.NoError(t, h.Init(ac))
  95. h.ipStore.Set("127.0.0.1", true, time.Minute)
  96. serverPc, err := net.ListenPacket("udp", "127.0.0.1:0")
  97. assert.NoError(t, err)
  98. localPc, err := net.ListenPacket("udp", "127.0.0.1:0")
  99. assert.NoError(t, err)
  100. appPc, err := net.ListenPacket("udp", "127.0.0.1:0")
  101. assert.NoError(t, err)
  102. data := []byte("test")
  103. go func() {
  104. p := make([]byte, 1500)
  105. n, addr, err := appPc.ReadFrom(p)
  106. assert.NoError(t, err)
  107. assert.Equal(t, p[:n], data)
  108. _, err = appPc.WriteTo(data, addr)
  109. assert.NoError(t, err)
  110. }()
  111. go func() {
  112. p := make([]byte, 1500)
  113. n, addr, err := serverPc.ReadFrom(p)
  114. assert.NoError(t, err)
  115. pc := enet.NewReaderPacketConn(serverPc, p[:n], addr)
  116. err = pc.SendPacket(p[:n], addr)
  117. assert.NoError(t, err)
  118. b, err := h.ProcessPacketConn(pc)
  119. assert.Equal(t, b, true)
  120. assert.NoError(t, err)
  121. }()
  122. b := []byte{0, 0, 0}
  123. pAddr, err := common.ParseAddr(appPc.LocalAddr().String())
  124. assert.NoError(t, err)
  125. b = append(b, pAddr...)
  126. b = append(b, data...)
  127. _, err = localPc.WriteTo(b, serverPc.LocalAddr())
  128. assert.NoError(t, err)
  129. p := make([]byte, 1500)
  130. n, _, err := localPc.ReadFrom(p)
  131. assert.NoError(t, err)
  132. respAddr, err := common.SplitAddr(p[3:])
  133. assert.NoError(t, err)
  134. assert.Equal(t, respAddr.String(), appPc.LocalAddr().String())
  135. assert.Equal(t, p[3+len(respAddr):n], data)
  136. }