server.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package handler
  2. import (
  3. "crypto/tls"
  4. "errors"
  5. "fmt"
  6. "log"
  7. "net"
  8. "net/http"
  9. "os"
  10. "time"
  11. "github.com/pion/dtls/v2/pkg/crypto/selfsign"
  12. "github.com/bjdgyc/anylink/base"
  13. "github.com/bjdgyc/anylink/pkg/proxyproto"
  14. "github.com/gorilla/mux"
  15. )
  16. func startTls() {
  17. var (
  18. err error
  19. addr = base.Cfg.ServerAddr
  20. certFile = base.Cfg.CertFile
  21. keyFile = base.Cfg.CertKey
  22. certs = make([]tls.Certificate, 1)
  23. ln net.Listener
  24. )
  25. // 判断证书文件
  26. _, err = os.Stat(certFile)
  27. if errors.Is(err, os.ErrNotExist) {
  28. // 自动生成证书
  29. certs[0], err = selfsign.GenerateSelfSignedWithDNS("vpn.anylink")
  30. } else {
  31. // 使用自定义证书
  32. certs[0], err = tls.LoadX509KeyPair(certFile, keyFile)
  33. }
  34. if err != nil {
  35. panic(err)
  36. }
  37. // 设置tls信息
  38. tlsConfig := &tls.Config{
  39. NextProtos: []string{"http/1.1"},
  40. MinVersion: tls.VersionTLS12,
  41. InsecureSkipVerify: true,
  42. Certificates: certs,
  43. }
  44. srv := &http.Server{
  45. Addr: addr,
  46. Handler: initRoute(),
  47. TLSConfig: tlsConfig,
  48. ErrorLog: base.GetBaseLog(),
  49. }
  50. ln, err = net.Listen("tcp", addr)
  51. if err != nil {
  52. log.Fatal(err)
  53. }
  54. defer ln.Close()
  55. if base.Cfg.ProxyProtocol {
  56. ln = &proxyproto.Listener{Listener: ln, ProxyHeaderTimeout: time.Second * 5}
  57. }
  58. base.Info("listen server", addr)
  59. err = srv.ServeTLS(ln, "", "")
  60. if err != nil {
  61. base.Fatal(err)
  62. }
  63. }
  64. func initRoute() http.Handler {
  65. r := mux.NewRouter()
  66. r.HandleFunc("/", LinkHome).Methods(http.MethodGet)
  67. r.HandleFunc("/", LinkAuth).Methods(http.MethodPost)
  68. r.HandleFunc("/CSCOSSLC/tunnel", LinkTunnel).Methods(http.MethodConnect)
  69. r.HandleFunc("/otp_qr", LinkOtpQr).Methods(http.MethodGet)
  70. r.HandleFunc("/profile.xml", func(w http.ResponseWriter, r *http.Request) {
  71. w.Write([]byte(auth_profile))
  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. }