1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-06-22 23:45:24 +00:00

Add XTLS support to mKCP (#267)

This commit is contained in:
RPRX 2020-10-06 16:25:02 +00:00 committed by GitHub
parent 03fb762169
commit bcc7b78ff7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 20 deletions

View File

@ -496,8 +496,8 @@ func (c *StreamConfig) Build() (*internet.StreamConfig, error) {
config.SecurityType = tm.Type
}
if strings.EqualFold(c.Security, "xtls") {
if config.ProtocolName != "tcp" && config.ProtocolName != "domainsocket" {
return nil, newError("XTLS only supports TCP and DomainSocket for now.")
if config.ProtocolName != "tcp" && config.ProtocolName != "mkcp" && config.ProtocolName != "domainsocket" {
return nil, newError("XTLS only supports TCP, mKCP and DomainSocket for now.")
}
xtlsSettings := c.XTLSSettings
if xtlsSettings == nil {

View File

@ -4,7 +4,6 @@ package kcp
import (
"context"
"crypto/tls"
"io"
"sync/atomic"
@ -13,7 +12,8 @@ import (
"v2ray.com/core/common/dice"
"v2ray.com/core/common/net"
"v2ray.com/core/transport/internet"
v2tls "v2ray.com/core/transport/internet/tls"
"v2ray.com/core/transport/internet/tls"
"v2ray.com/core/transport/internet/xtls"
)
var (
@ -88,9 +88,10 @@ func DialKCP(ctx context.Context, dest net.Destination, streamSettings *internet
var iConn internet.Connection = session
if config := v2tls.ConfigFromStreamSettings(streamSettings); config != nil {
tlsConn := tls.Client(iConn, config.GetTLSConfig(v2tls.WithDestination(dest)))
iConn = tlsConn
if config := tls.ConfigFromStreamSettings(streamSettings); config != nil {
iConn = tls.Client(iConn, config.GetTLSConfig(tls.WithDestination(dest)))
} else if config := xtls.ConfigFromStreamSettings(streamSettings); config != nil {
iConn = xtls.Client(iConn, config.GetXTLSConfig(xtls.WithDestination(dest)))
}
return iConn, nil

View File

@ -5,15 +5,18 @@ package kcp
import (
"context"
"crypto/cipher"
"crypto/tls"
gotls "crypto/tls"
"sync"
goxtls "github.com/xtls/go"
"v2ray.com/core/common"
"v2ray.com/core/common/buf"
"v2ray.com/core/common/net"
"v2ray.com/core/transport/internet"
v2tls "v2ray.com/core/transport/internet/tls"
"v2ray.com/core/transport/internet/tls"
"v2ray.com/core/transport/internet/udp"
"v2ray.com/core/transport/internet/xtls"
)
type ConnectionID struct {
@ -25,14 +28,15 @@ type ConnectionID struct {
// Listener defines a server listening for connections
type Listener struct {
sync.Mutex
sessions map[ConnectionID]*Connection
hub *udp.Hub
tlsConfig *tls.Config
config *Config
reader PacketReader
header internet.PacketHeader
security cipher.AEAD
addConn internet.ConnHandler
sessions map[ConnectionID]*Connection
hub *udp.Hub
tlsConfig *gotls.Config
xtlsConfig *goxtls.Config
config *Config
reader PacketReader
header internet.PacketHeader
security cipher.AEAD
addConn internet.ConnHandler
}
func NewListener(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, addConn internet.ConnHandler) (*Listener, error) {
@ -57,9 +61,12 @@ func NewListener(ctx context.Context, address net.Address, port net.Port, stream
addConn: addConn,
}
if config := v2tls.ConfigFromStreamSettings(streamSettings); config != nil {
if config := tls.ConfigFromStreamSettings(streamSettings); config != nil {
l.tlsConfig = config.GetTLSConfig()
}
if config := xtls.ConfigFromStreamSettings(streamSettings); config != nil {
l.xtlsConfig = config.GetXTLSConfig()
}
hub, err := udp.ListenUDP(ctx, address, port, streamSettings, udp.HubCapacity(1024))
if err != nil {
@ -131,8 +138,9 @@ func (l *Listener) OnReceive(payload *buf.Buffer, src net.Destination) {
}, writer, l.config)
var netConn internet.Connection = conn
if l.tlsConfig != nil {
tlsConn := tls.Server(conn, l.tlsConfig)
netConn = tlsConn
netConn = gotls.Server(conn, l.tlsConfig)
} else if l.xtlsConfig != nil {
netConn = goxtls.Server(conn, l.xtlsConfig)
}
l.addConn(netConn)