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