server.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. ln net.Listener
  19. )
  20. // 判断证书文件
  21. // _, err = os.Stat(certFile)
  22. // if errors.Is(err, os.ErrNotExist) {
  23. // // 自动生成证书
  24. // certs[0], err = selfsign.GenerateSelfSignedWithDNS("vpn.anylink")
  25. // } else {
  26. // // 使用自定义证书
  27. // certs[0], err = tls.LoadX509KeyPair(certFile, keyFile)
  28. // }
  29. // 修复 CVE-2016-2183
  30. // https://segmentfault.com/a/1190000038486901
  31. // nmap -sV --script ssl-enum-ciphers -p 443 www.example.com
  32. cipherSuites := tls.CipherSuites()
  33. selectedCipherSuites := make([]uint16, 0, len(cipherSuites))
  34. for _, s := range cipherSuites {
  35. selectedCipherSuites = append(selectedCipherSuites, s.ID)
  36. }
  37. // 设置tls信息
  38. tlsConfig := &tls.Config{
  39. NextProtos: []string{"http/1.1"},
  40. MinVersion: tls.VersionTLS12,
  41. CipherSuites: selectedCipherSuites,
  42. // InsecureSkipVerify: true,
  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, base.Cfg.CertFile, base.Cfg.CertKey)
  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. b, _ := os.ReadFile(base.Cfg.Profile)
  72. w.Write(b)
  73. }).Methods(http.MethodGet)
  74. r.PathPrefix("/files/").Handler(
  75. http.StripPrefix("/files/",
  76. http.FileServer(http.Dir(base.Cfg.FilesPath)),
  77. ),
  78. )
  79. r.NotFoundHandler = http.HandlerFunc(notFound)
  80. return r
  81. }
  82. func notFound(w http.ResponseWriter, r *http.Request) {
  83. // fmt.Println(r.RemoteAddr)
  84. // hu, _ := httputil.DumpRequest(r, true)
  85. // fmt.Println("NotFound: ", string(hu))
  86. w.WriteHeader(http.StatusNotFound)
  87. fmt.Fprintln(w, "404 page not found")
  88. }