Fix redirection

This commit is contained in:
Qian Wang 2019-08-03 13:26:57 +01:00
parent 64b39d728f
commit bf83273f6e
2 changed files with 21 additions and 21 deletions

View File

@ -69,7 +69,10 @@ func dispatchConnection(conn net.Conn, sta *server.State) {
log.Errorf("Making connection to redirection server: %v", err) log.Errorf("Making connection to redirection server: %v", err)
return return
} }
webConn.Write(data) _, err = webConn.Write(data)
if err != nil {
log.Error("Failed to send first packet to redirection server", err)
}
go pipe(webConn, conn) go pipe(webConn, conn)
go pipe(conn, webConn) go pipe(conn, webConn)
} }
@ -191,6 +194,7 @@ func dispatchConnection(conn net.Conn, sta *server.State) {
localConn, err := net.Dial("tcp", sta.ProxyBook[proxyMethod]) localConn, err := net.Dial("tcp", sta.ProxyBook[proxyMethod])
if err != nil { if err != nil {
log.Errorf("Failed to connect to %v: %v", proxyMethod, err) log.Errorf("Failed to connect to %v: %v", proxyMethod, err)
sesh.Close()
continue continue
} }
go pipe(localConn, newStream) go pipe(localConn, newStream)

View File

@ -91,12 +91,6 @@ func AddRecordLayer(input []byte, typ []byte, ver []byte) []byte {
return ret return ret
} }
// PeelRecordLayer peels off the record layer
func PeelRecordLayer(data []byte) []byte {
ret := data[5:]
return ret
}
// ParseClientHello parses everything on top of the TLS layer // ParseClientHello parses everything on top of the TLS layer
// (including the record layer) into ClientHello type // (including the record layer) into ClientHello type
func ParseClientHello(data []byte) (ret *ClientHello, err error) { func ParseClientHello(data []byte) (ret *ClientHello, err error) {
@ -105,45 +99,47 @@ func ParseClientHello(data []byte) (ret *ClientHello, err error) {
err = errors.New("Malformed ClientHello") err = errors.New("Malformed ClientHello")
} }
}() }()
data = PeelRecordLayer(data)
peeled := make([]byte, len(data)-5)
copy(peeled, data[5:])
pointer := 0 pointer := 0
// Handshake Type // Handshake Type
handshakeType := data[pointer] handshakeType := peeled[pointer]
if handshakeType != 0x01 { if handshakeType != 0x01 {
return ret, errors.New("Not a ClientHello") return ret, errors.New("Not a ClientHello")
} }
pointer += 1 pointer += 1
// Length // Length
length := int(u32(append([]byte{0x00}, data[pointer:pointer+3]...))) length := int(u32(append([]byte{0x00}, peeled[pointer:pointer+3]...)))
pointer += 3 pointer += 3
if length != len(data[pointer:]) { if length != len(peeled[pointer:]) {
return ret, errors.New("Hello length doesn't match") return ret, errors.New("Hello length doesn't match")
} }
// Client Version // Client Version
clientVersion := data[pointer : pointer+2] clientVersion := peeled[pointer : pointer+2]
pointer += 2 pointer += 2
// Random // Random
random := data[pointer : pointer+32] random := peeled[pointer : pointer+32]
pointer += 32 pointer += 32
// Session ID // Session ID
sessionIdLen := int(data[pointer]) sessionIdLen := int(peeled[pointer])
pointer += 1 pointer += 1
sessionId := data[pointer : pointer+sessionIdLen] sessionId := peeled[pointer : pointer+sessionIdLen]
pointer += sessionIdLen pointer += sessionIdLen
// Cipher Suites // Cipher Suites
cipherSuitesLen := int(u16(data[pointer : pointer+2])) cipherSuitesLen := int(u16(peeled[pointer : pointer+2]))
pointer += 2 pointer += 2
cipherSuites := data[pointer : pointer+cipherSuitesLen] cipherSuites := peeled[pointer : pointer+cipherSuitesLen]
pointer += cipherSuitesLen pointer += cipherSuitesLen
// Compression Methods // Compression Methods
compressionMethodsLen := int(data[pointer]) compressionMethodsLen := int(peeled[pointer])
pointer += 1 pointer += 1
compressionMethods := data[pointer : pointer+compressionMethodsLen] compressionMethods := peeled[pointer : pointer+compressionMethodsLen]
pointer += compressionMethodsLen pointer += compressionMethodsLen
// Extensions // Extensions
extensionsLen := int(u16(data[pointer : pointer+2])) extensionsLen := int(u16(peeled[pointer : pointer+2]))
pointer += 2 pointer += 2
extensions, err := parseExtensions(data[pointer:]) extensions, err := parseExtensions(peeled[pointer:])
ret = &ClientHello{ ret = &ClientHello{
handshakeType, handshakeType,
length, length,