ZBLOG

golang 编写http加密代理

以下是一个使用Golang编写的HTTP加密代理示例:

  1. package main
  2. import (
  3. "crypto/tls"
  4. "fmt"
  5. "io"
  6. "log"
  7. "net"
  8. "net/http"
  9. "os"
  10. )
  11. func handleTunneling(w http.ResponseWriter, r *http.Request) {
  12. // 获取连接目标地址和端口
  13. targetHost := r.URL.Host
  14. log.Printf("Proxying HTTPS request to: %s\n", targetHost)
  15. // 建立与目标地址的TCP连接
  16. conn, err := net.Dial("tcp", targetHost)
  17. if err != nil {
  18. http.Error(w, err.Error(), http.StatusServiceUnavailable)
  19. return
  20. }
  21. defer conn.Close()
  22. // 返回客户端HTTP状态码200(成功建立隧道)
  23. w.WriteHeader(http.StatusOK)
  24. // 将客户端的请求头发送给目标服务器
  25. hijacker, ok := w.(http.Hijacker)
  26. if !ok {
  27. http.Error(w, "Hijacking not supported", http.StatusInternalServerError)
  28. return
  29. }
  30. clientConn, _, err := hijacker.Hijack()
  31. if err != nil {
  32. http.Error(w, err.Error(), http.StatusServiceUnavailable)
  33. return
  34. }
  35. defer clientConn.Close()
  36. io.WriteString(clientConn, "HTTP/1.1 200 Connection established\r\n\r\n")
  37. // 在双方之间进行数据传输
  38. go transfer(conn, clientConn)
  39. transfer(clientConn, conn)
  40. }
  41. func transfer(destination io.WriteCloser, source io.ReadCloser) {
  42. defer destination.Close()
  43. defer source.Close()
  44. io.Copy(destination, source)
  45. }
  46. func main() {
  47. // 创建TLS配置,允许不安全连接
  48. tlsConfig := &tls.Config{
  49. InsecureSkipVerify: true,
  50. }
  51. // 创建代理服务器
  52. proxy := &http.Server{
  53. Addr: ":8080",
  54. Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  55. if r.Method == http.MethodConnect {
  56. handleTunneling(w, r)
  57. } else {
  58. // 处理普通HTTP请求
  59. proxyHTTPHandler := http.DefaultTransport
  60. resp, err := proxyHTTPHandler.RoundTrip(r)
  61. if err != nil {
  62. http.Error(w, err.Error(), http.StatusServiceUnavailable)
  63. return
  64. }
  65. defer resp.Body.Close()
  66. // 将响应返回给客户端
  67. for key, values := range resp.Header {
  68. for _, value := range values {
  69. w.Header().Add(key, value)
  70. }
  71. }
  72. w.WriteHeader(resp.StatusCode)
  73. io.Copy(w, resp.Body)
  74. }
  75. }),
  76. TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)), // 禁用HTTP/2
  77. ConnState: func(conn net.Conn, state http.ConnState) {
  78. log.Printf("Connection %s: %s\n", conn.RemoteAddr().String(), state)
  79. },
  80. TLSConfig: tlsConfig,
  81. }
  82. // 启动代理服务器
  83. log.Println("Starting proxy server on :8080")
  84. err := proxy.ListenAndServe()
  85. if err != nil {
  86. fmt.Fprintf(os.Stderr, "Error starting server: %s\n", err)
  87. os.Exit(1)
  88. }
  89. }

这个示例创建了一个HTTP代理服务器,支持不安全的HTTPS连接。它使用net.Dial建立与目标服务器的TCP连接,并在双方之间进行数据传输。在客户端发起HTTPS请求时,它将返回HTTP状态码200,并直接将客户端和目标服务器之间的TCP连接交换数据。

要测试这个代理服务器,请设置浏览器或应用程序的代理设置,将其指向localhost:8080。现在,您应该能够通过代理服务器访问任何网站(包括HTTPS网站)。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1084

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?