tlsping.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package control
  2. import (
  3. "crypto/tls"
  4. "flag"
  5. "fmt"
  6. "net"
  7. "v2ray.com/core/common"
  8. )
  9. type TlsPingCommand struct{}
  10. func (c *TlsPingCommand) Name() string {
  11. return "tlsping"
  12. }
  13. func (c *TlsPingCommand) Description() Description {
  14. return Description{
  15. Short: "Ping the domain with TLS handshake",
  16. Usage: []string{"v2ctl tlsping <domain> --ip <ip>"},
  17. }
  18. }
  19. func (c *TlsPingCommand) Execute(args []string) error {
  20. fs := flag.NewFlagSet(c.Name(), flag.ContinueOnError)
  21. ipStr := fs.String("ip", "", "IP address of the domain")
  22. if err := fs.Parse(args); err != nil {
  23. return newError("flag parsing").Base(err)
  24. }
  25. if fs.NArg() < 1 {
  26. return newError("domain not specified")
  27. }
  28. domain := fs.Arg(0)
  29. fmt.Println("Tls ping: ", domain)
  30. var ip net.IP
  31. if len(*ipStr) > 0 {
  32. v := net.ParseIP(*ipStr)
  33. if v == nil {
  34. return newError("invalid IP: ", *ipStr)
  35. }
  36. ip = v
  37. } else {
  38. v, err := net.ResolveIPAddr("ip", domain)
  39. if err != nil {
  40. return newError("resolve IP").Base(err)
  41. }
  42. ip = v.IP
  43. }
  44. fmt.Println("Using IP: ", ip.String())
  45. fmt.Println("Pinging without SNI")
  46. {
  47. tcpConn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: ip, Port: 443})
  48. if err != nil {
  49. return newError("dial tcp").Base(err)
  50. }
  51. tlsConn := tls.Client(tcpConn, &tls.Config{
  52. InsecureSkipVerify: true,
  53. NextProtos: []string{"http/1.1"},
  54. MaxVersion: tls.VersionTLS12,
  55. MinVersion: tls.VersionTLS12,
  56. })
  57. err = tlsConn.Handshake()
  58. if err != nil {
  59. fmt.Println("Handshake failure: ", err)
  60. } else {
  61. fmt.Println("Handshake succeeded")
  62. }
  63. tlsConn.Close()
  64. }
  65. fmt.Println("Pinging with SNI")
  66. {
  67. tcpConn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: ip, Port: 443})
  68. if err != nil {
  69. return newError("dial tcp").Base(err)
  70. }
  71. tlsConn := tls.Client(tcpConn, &tls.Config{
  72. ServerName: domain,
  73. NextProtos: []string{"http/1.1"},
  74. MaxVersion: tls.VersionTLS12,
  75. MinVersion: tls.VersionTLS12,
  76. })
  77. err = tlsConn.Handshake()
  78. if err != nil {
  79. fmt.Println("handshake failure: ", err)
  80. } else {
  81. fmt.Println("handshake succeeded")
  82. }
  83. tlsConn.Close()
  84. }
  85. fmt.Println("Tls ping finished")
  86. return nil
  87. }
  88. func init() {
  89. common.Must(RegisterCommand(&TlsPingCommand{}))
  90. }