Skip to content

Commit

Permalink
Add XTLS support to mKCP (#267)
Browse files Browse the repository at this point in the history
  • Loading branch information
RPRX committed Oct 6, 2020
1 parent 03fb762 commit bcc7b78
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 20 deletions.
4 changes: 2 additions & 2 deletions infra/conf/transport_internet.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
11 changes: 6 additions & 5 deletions transport/internet/kcp/dialer.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package kcp

import (
"context"
"crypto/tls"
"io"
"sync/atomic"

Expand All @@ -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 (
Expand Down Expand Up @@ -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
Expand Down
34 changes: 21 additions & 13 deletions transport/internet/kcp/listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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) {
Expand All @@ -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 {
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit bcc7b78

Please sign in to comment.