mirror of https://github.com/v2ray/v2ray-core
				
				
				
			add tlsping utility
							parent
							
								
									10d90f5fc1
								
							
						
					
					
						commit
						9476f38f8b
					
				| 
						 | 
				
			
			@ -0,0 +1,105 @@
 | 
			
		|||
package control
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/tls"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
 | 
			
		||||
	"v2ray.com/core/common"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type TlsPingCommand struct{}
 | 
			
		||||
 | 
			
		||||
func (c *TlsPingCommand) Name() string {
 | 
			
		||||
	return "tlsping"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *TlsPingCommand) Description() Description {
 | 
			
		||||
	return Description{
 | 
			
		||||
		Short: "Ping the domain with TLS handshake",
 | 
			
		||||
		Usage: []string{"v2ctl tlsping <domain> --ip <ip>"},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *TlsPingCommand) Execute(args []string) error {
 | 
			
		||||
	fs := flag.NewFlagSet(c.Name(), flag.ContinueOnError)
 | 
			
		||||
	ipStr := fs.String("ip", "", "IP address of the domain")
 | 
			
		||||
 | 
			
		||||
	if err := fs.Parse(args); err != nil {
 | 
			
		||||
		return newError("flag parsing").Base(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if fs.NArg() < 1 {
 | 
			
		||||
		return newError("domain not specified")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	domain := fs.Arg(0)
 | 
			
		||||
	fmt.Println("Tls ping: ", domain)
 | 
			
		||||
 | 
			
		||||
	var ip net.IP
 | 
			
		||||
	if len(*ipStr) > 0 {
 | 
			
		||||
		v := net.ParseIP(*ipStr)
 | 
			
		||||
		if v == nil {
 | 
			
		||||
			return newError("invalid IP: ", *ipStr)
 | 
			
		||||
		}
 | 
			
		||||
		ip = v
 | 
			
		||||
	} else {
 | 
			
		||||
		v, err := net.ResolveIPAddr("ip", domain)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return newError("resolve IP").Base(err)
 | 
			
		||||
		}
 | 
			
		||||
		ip = v.IP
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println("Using IP: ", ip.String())
 | 
			
		||||
 | 
			
		||||
	fmt.Println("Pinging without SNI")
 | 
			
		||||
	{
 | 
			
		||||
		tcpConn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: ip, Port: 443})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return newError("dial tcp").Base(err)
 | 
			
		||||
		}
 | 
			
		||||
		tlsConn := tls.Client(tcpConn, &tls.Config{
 | 
			
		||||
			InsecureSkipVerify: true,
 | 
			
		||||
			NextProtos:         []string{"http/1.1"},
 | 
			
		||||
			MaxVersion:         tls.VersionTLS12,
 | 
			
		||||
			MinVersion:         tls.VersionTLS12,
 | 
			
		||||
		})
 | 
			
		||||
		err = tlsConn.Handshake()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Println("Handshake failure: ", err)
 | 
			
		||||
		} else {
 | 
			
		||||
			fmt.Println("Handshake succeeded")
 | 
			
		||||
		}
 | 
			
		||||
		tlsConn.Close()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("Pinging with SNI")
 | 
			
		||||
	{
 | 
			
		||||
		tcpConn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: ip, Port: 443})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return newError("dial tcp").Base(err)
 | 
			
		||||
		}
 | 
			
		||||
		tlsConn := tls.Client(tcpConn, &tls.Config{
 | 
			
		||||
			ServerName: domain,
 | 
			
		||||
			NextProtos: []string{"http/1.1"},
 | 
			
		||||
			MaxVersion: tls.VersionTLS12,
 | 
			
		||||
			MinVersion: tls.VersionTLS12,
 | 
			
		||||
		})
 | 
			
		||||
		err = tlsConn.Handshake()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Println("handshake failure: ", err)
 | 
			
		||||
		} else {
 | 
			
		||||
			fmt.Println("handshake succeeded")
 | 
			
		||||
		}
 | 
			
		||||
		tlsConn.Close()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("Tls ping finished")
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	common.Must(RegisterCommand(&TlsPingCommand{}))
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue