server.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package handler
  2. import (
  3. "crypto/tls"
  4. "fmt"
  5. "log"
  6. "net"
  7. "net/http"
  8. "os"
  9. "time"
  10. "github.com/bjdgyc/anylink/base"
  11. "github.com/bjdgyc/anylink/pkg/proxyproto"
  12. "github.com/gorilla/mux"
  13. )
  14. func startTls() {
  15. var (
  16. err error
  17. addr = base.Cfg.ServerAddr
  18. certFile = base.Cfg.CertFile
  19. keyFile = base.Cfg.CertKey
  20. certs = make([]tls.Certificate, 1)
  21. ln net.Listener
  22. )
  23. // 判断证书文件
  24. // _, err = os.Stat(certFile)
  25. // if errors.Is(err, os.ErrNotExist) {
  26. // // 自动生成证书
  27. // certs[0], err = selfsign.GenerateSelfSignedWithDNS("vpn.anylink")
  28. // } else {
  29. // // 使用自定义证书
  30. // certs[0], err = tls.LoadX509KeyPair(certFile, keyFile)
  31. // }
  32. certs[0], err = tls.LoadX509KeyPair(certFile, keyFile)
  33. if err != nil {
  34. panic(err)
  35. }
  36. // 设置tls信息
  37. tlsConfig := &tls.Config{
  38. NextProtos: []string{"http/1.1"},
  39. MinVersion: tls.VersionTLS12,
  40. Certificates: certs,
  41. // InsecureSkipVerify: true,
  42. }
  43. srv := &http.Server{
  44. Addr: addr,
  45. Handler: initRoute(),
  46. TLSConfig: tlsConfig,
  47. ErrorLog: base.GetBaseLog(),
  48. }
  49. ln, err = net.Listen("tcp", addr)
  50. if err != nil {
  51. log.Fatal(err)
  52. }
  53. defer ln.Close()
  54. if base.Cfg.ProxyProtocol {
  55. ln = &proxyproto.Listener{Listener: ln, ProxyHeaderTimeout: time.Second * 5}
  56. }
  57. base.Info("listen server", addr)
  58. err = srv.ServeTLS(ln, "", "")
  59. if err != nil {
  60. base.Fatal(err)
  61. }
  62. }
  63. func initRoute() http.Handler {
  64. r := mux.NewRouter()
  65. r.HandleFunc("/", LinkHome).Methods(http.MethodGet)
  66. r.HandleFunc("/", LinkAuth).Methods(http.MethodPost)
  67. r.HandleFunc("/CSCOSSLC/tunnel", LinkTunnel).Methods(http.MethodConnect)
  68. r.HandleFunc("/otp_qr", LinkOtpQr).Methods(http.MethodGet)
  69. r.HandleFunc("/profile.xml", func(w http.ResponseWriter, r *http.Request) {
  70. b, _ := os.ReadFile(base.Cfg.Profile)
  71. w.Write(b)
  72. }).Methods(http.MethodGet)
  73. r.PathPrefix("/files/").Handler(
  74. http.StripPrefix("/files/",
  75. http.FileServer(http.Dir(base.Cfg.FilesPath)),
  76. ),
  77. )
  78. r.NotFoundHandler = http.HandlerFunc(notFound)
  79. return r
  80. }
  81. func notFound(w http.ResponseWriter, r *http.Request) {
  82. // fmt.Println(r.RemoteAddr)
  83. // hu, _ := httputil.DumpRequest(r, true)
  84. // fmt.Println("NotFound: ", string(hu))
  85. w.WriteHeader(http.StatusNotFound)
  86. fmt.Fprintln(w, "404 page not found")
  87. }