Skip to content

Commit c180c59

Browse files
authored
Finalmask: Add XDNS (relies mKCP, like DNSTT), header-*, mkcp-* (#5560)
And #5560 (comment)
1 parent 5b849d5 commit c180c59

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

92 files changed

+5549
-2060
lines changed

infra/conf/transport_authenticators.go

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -4,72 +4,17 @@ import (
44
"sort"
55

66
"github.com/xtls/xray-core/common/errors"
7-
"github.com/xtls/xray-core/transport/internet/headers/dns"
87
"github.com/xtls/xray-core/transport/internet/headers/http"
98
"github.com/xtls/xray-core/transport/internet/headers/noop"
10-
"github.com/xtls/xray-core/transport/internet/headers/srtp"
11-
"github.com/xtls/xray-core/transport/internet/headers/tls"
12-
"github.com/xtls/xray-core/transport/internet/headers/utp"
13-
"github.com/xtls/xray-core/transport/internet/headers/wechat"
14-
"github.com/xtls/xray-core/transport/internet/headers/wireguard"
159
"google.golang.org/protobuf/proto"
1610
)
1711

18-
type NoOpAuthenticator struct{}
19-
20-
func (NoOpAuthenticator) Build() (proto.Message, error) {
21-
return new(noop.Config), nil
22-
}
23-
2412
type NoOpConnectionAuthenticator struct{}
2513

2614
func (NoOpConnectionAuthenticator) Build() (proto.Message, error) {
2715
return new(noop.ConnectionConfig), nil
2816
}
2917

30-
type SRTPAuthenticator struct{}
31-
32-
func (SRTPAuthenticator) Build() (proto.Message, error) {
33-
return new(srtp.Config), nil
34-
}
35-
36-
type UTPAuthenticator struct{}
37-
38-
func (UTPAuthenticator) Build() (proto.Message, error) {
39-
return new(utp.Config), nil
40-
}
41-
42-
type WechatVideoAuthenticator struct{}
43-
44-
func (WechatVideoAuthenticator) Build() (proto.Message, error) {
45-
return new(wechat.VideoConfig), nil
46-
}
47-
48-
type WireguardAuthenticator struct{}
49-
50-
func (WireguardAuthenticator) Build() (proto.Message, error) {
51-
return new(wireguard.WireguardConfig), nil
52-
}
53-
54-
type DNSAuthenticator struct {
55-
Domain string `json:"domain"`
56-
}
57-
58-
func (v *DNSAuthenticator) Build() (proto.Message, error) {
59-
config := new(dns.Config)
60-
config.Domain = "www.baidu.com"
61-
if len(v.Domain) > 0 {
62-
config.Domain = v.Domain
63-
}
64-
return config, nil
65-
}
66-
67-
type DTLSAuthenticator struct{}
68-
69-
func (DTLSAuthenticator) Build() (proto.Message, error) {
70-
return new(tls.PacketConfig), nil
71-
}
72-
7318
type AuthenticatorRequest struct {
7419
Version string `json:"version"`
7520
Method string `json:"method"`

infra/conf/transport_internet.go

Lines changed: 122 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,16 @@ import (
1616
"github.com/xtls/xray-core/common/platform/filesystem"
1717
"github.com/xtls/xray-core/common/serial"
1818
"github.com/xtls/xray-core/transport/internet"
19+
"github.com/xtls/xray-core/transport/internet/finalmask/header/dns"
20+
"github.com/xtls/xray-core/transport/internet/finalmask/header/dtls"
21+
"github.com/xtls/xray-core/transport/internet/finalmask/header/srtp"
22+
"github.com/xtls/xray-core/transport/internet/finalmask/header/utp"
23+
"github.com/xtls/xray-core/transport/internet/finalmask/header/wechat"
24+
"github.com/xtls/xray-core/transport/internet/finalmask/header/wireguard"
25+
"github.com/xtls/xray-core/transport/internet/finalmask/mkcp/aes128gcm"
26+
"github.com/xtls/xray-core/transport/internet/finalmask/mkcp/original"
1927
"github.com/xtls/xray-core/transport/internet/finalmask/salamander"
28+
"github.com/xtls/xray-core/transport/internet/finalmask/xdns"
2029
"github.com/xtls/xray-core/transport/internet/httpupgrade"
2130
"github.com/xtls/xray-core/transport/internet/hysteria"
2231
"github.com/xtls/xray-core/transport/internet/kcp"
@@ -29,16 +38,6 @@ import (
2938
)
3039

3140
var (
32-
kcpHeaderLoader = NewJSONConfigLoader(ConfigCreatorCache{
33-
"none": func() interface{} { return new(NoOpAuthenticator) },
34-
"srtp": func() interface{} { return new(SRTPAuthenticator) },
35-
"utp": func() interface{} { return new(UTPAuthenticator) },
36-
"wechat-video": func() interface{} { return new(WechatVideoAuthenticator) },
37-
"dtls": func() interface{} { return new(DTLSAuthenticator) },
38-
"wireguard": func() interface{} { return new(WireguardAuthenticator) },
39-
"dns": func() interface{} { return new(DNSAuthenticator) },
40-
}, "type", "")
41-
4241
tcpHeaderLoader = NewJSONConfigLoader(ConfigCreatorCache{
4342
"none": func() interface{} { return new(NoOpConnectionAuthenticator) },
4443
"http": func() interface{} { return new(Authenticator) },
@@ -63,9 +62,9 @@ func (c *KCPConfig) Build() (proto.Message, error) {
6362

6463
if c.Mtu != nil {
6564
mtu := *c.Mtu
66-
if mtu < 576 || mtu > 1460 {
67-
return nil, errors.New("invalid mKCP MTU size: ", mtu).AtError()
68-
}
65+
// if mtu < 576 || mtu > 1460 {
66+
// return nil, errors.New("invalid mKCP MTU size: ", mtu).AtError()
67+
// }
6968
config.Mtu = &kcp.MTU{Value: mtu}
7069
}
7170
if c.Tti != nil {
@@ -100,20 +99,8 @@ func (c *KCPConfig) Build() (proto.Message, error) {
10099
config.WriteBuffer = &kcp.WriteBuffer{Size: 512 * 1024}
101100
}
102101
}
103-
if len(c.HeaderConfig) > 0 {
104-
headerConfig, _, err := kcpHeaderLoader.Load(c.HeaderConfig)
105-
if err != nil {
106-
return nil, errors.New("invalid mKCP header config.").Base(err).AtError()
107-
}
108-
ts, err := headerConfig.(Buildable).Build()
109-
if err != nil {
110-
return nil, errors.New("invalid mKCP header config").Base(err).AtError()
111-
}
112-
config.HeaderConfig = serial.ToTypedMessage(ts)
113-
}
114-
115-
if c.Seed != nil {
116-
config.Seed = &kcp.EncryptionSeed{Seed: *c.Seed}
102+
if c.HeaderConfig != nil || c.Seed != nil {
103+
return nil, errors.PrintRemovedFeatureError("mkcp header & seed", "finalmask/udp header-* & mkcp-original & mkcp-aes128gcm")
117104
}
118105

119106
return config, nil
@@ -1242,10 +1229,80 @@ func (c *SocketConfig) Build() (*internet.SocketConfig, error) {
12421229

12431230
var (
12441231
udpmaskLoader = NewJSONConfigLoader(ConfigCreatorCache{
1245-
"salamander": func() interface{} { return new(Salamander) },
1232+
"header-dns": func() interface{} { return new(Dns) },
1233+
"header-dtls": func() interface{} { return new(Dtls) },
1234+
"header-srtp": func() interface{} { return new(Srtp) },
1235+
"header-utp": func() interface{} { return new(Utp) },
1236+
"header-wechat": func() interface{} { return new(Wechat) },
1237+
"header-wireguard": func() interface{} { return new(Wireguard) },
1238+
"mkcp-original": func() interface{} { return new(Original) },
1239+
"mkcp-aes128gcm": func() interface{} { return new(Aes128Gcm) },
1240+
"salamander": func() interface{} { return new(Salamander) },
1241+
"xdns": func() interface{} { return new(Xdns) },
12461242
}, "type", "settings")
12471243
)
12481244

1245+
type Dns struct {
1246+
Domain string `json:"domain"`
1247+
}
1248+
1249+
func (c *Dns) Build() (proto.Message, error) {
1250+
config := &dns.Config{}
1251+
config.Domain = "www.baidu.com"
1252+
1253+
if len(c.Domain) > 0 {
1254+
config.Domain = c.Domain
1255+
}
1256+
1257+
return config, nil
1258+
}
1259+
1260+
type Dtls struct{}
1261+
1262+
func (c *Dtls) Build() (proto.Message, error) {
1263+
return &dtls.Config{}, nil
1264+
}
1265+
1266+
type Srtp struct{}
1267+
1268+
func (c *Srtp) Build() (proto.Message, error) {
1269+
return &srtp.Config{}, nil
1270+
}
1271+
1272+
type Utp struct{}
1273+
1274+
func (c *Utp) Build() (proto.Message, error) {
1275+
return &utp.Config{}, nil
1276+
}
1277+
1278+
type Wechat struct{}
1279+
1280+
func (c *Wechat) Build() (proto.Message, error) {
1281+
return &wechat.Config{}, nil
1282+
}
1283+
1284+
type Wireguard struct{}
1285+
1286+
func (c *Wireguard) Build() (proto.Message, error) {
1287+
return &wireguard.Config{}, nil
1288+
}
1289+
1290+
type Original struct{}
1291+
1292+
func (c *Original) Build() (proto.Message, error) {
1293+
return &original.Config{}, nil
1294+
}
1295+
1296+
type Aes128Gcm struct {
1297+
Password string `json:"password"`
1298+
}
1299+
1300+
func (c *Aes128Gcm) Build() (proto.Message, error) {
1301+
return &aes128gcm.Config{
1302+
Password: c.Password,
1303+
}, nil
1304+
}
1305+
12491306
type Salamander struct {
12501307
Password string `json:"password"`
12511308
}
@@ -1256,14 +1313,28 @@ func (c *Salamander) Build() (proto.Message, error) {
12561313
return config, nil
12571314
}
12581315

1259-
type FinalMask struct {
1316+
type Xdns struct {
1317+
Domain string `json:"domain"`
1318+
}
1319+
1320+
func (c *Xdns) Build() (proto.Message, error) {
1321+
if c.Domain == "" {
1322+
return nil, errors.New("empty domain")
1323+
}
1324+
1325+
return &xdns.Config{
1326+
Domain: c.Domain,
1327+
}, nil
1328+
}
1329+
1330+
type Mask struct {
12601331
Type string `json:"type"`
12611332
Settings *json.RawMessage `json:"settings"`
12621333
}
12631334

1264-
func (c *FinalMask) Build(tcpmaskLoader bool) (proto.Message, error) {
1335+
func (c *Mask) Build(tcp bool) (proto.Message, error) {
12651336
loader := udpmaskLoader
1266-
if tcpmaskLoader {
1337+
if tcp {
12671338
return nil, errors.New("")
12681339
}
12691340

@@ -1282,12 +1353,17 @@ func (c *FinalMask) Build(tcpmaskLoader bool) (proto.Message, error) {
12821353
return ts, nil
12831354
}
12841355

1356+
type FinalMask struct {
1357+
Tcp []Mask `json:"tcp"`
1358+
Udp []Mask `json:"udp"`
1359+
}
1360+
12851361
type StreamConfig struct {
12861362
Address *Address `json:"address"`
12871363
Port uint16 `json:"port"`
12881364
Network *TransportProtocol `json:"network"`
12891365
Security string `json:"security"`
1290-
Udpmasks []*FinalMask `json:"udpmasks"`
1366+
FinalMask *FinalMask `json:"finalmask"`
12911367
TLSSettings *TLSConfig `json:"tlsSettings"`
12921368
REALITYSettings *REALITYConfig `json:"realitySettings"`
12931369
RAWSettings *TCPConfig `json:"rawSettings"`
@@ -1437,12 +1513,21 @@ func (c *StreamConfig) Build() (*internet.StreamConfig, error) {
14371513
config.SocketSettings = ss
14381514
}
14391515

1440-
for _, mask := range c.Udpmasks {
1441-
u, err := mask.Build(false)
1442-
if err != nil {
1443-
return nil, errors.New("failed to build mask with type ", mask.Type).Base(err)
1516+
if c.FinalMask != nil {
1517+
for _, mask := range c.FinalMask.Tcp {
1518+
u, err := mask.Build(true)
1519+
if err != nil {
1520+
return nil, errors.New("failed to build mask with type ", mask.Type).Base(err)
1521+
}
1522+
config.Tcpmasks = append(config.Tcpmasks, serial.ToTypedMessage(u))
1523+
}
1524+
for _, mask := range c.FinalMask.Udp {
1525+
u, err := mask.Build(false)
1526+
if err != nil {
1527+
return nil, errors.New("failed to build mask with type ", mask.Type).Base(err)
1528+
}
1529+
config.Udpmasks = append(config.Udpmasks, serial.ToTypedMessage(u))
14441530
}
1445-
config.Udpmasks = append(config.Udpmasks, serial.ToTypedMessage(u))
14461531
}
14471532

14481533
return config, nil

main/distro/all/all.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,6 @@ import (
6363
// Transport headers
6464
_ "github.com/xtls/xray-core/transport/internet/headers/http"
6565
_ "github.com/xtls/xray-core/transport/internet/headers/noop"
66-
_ "github.com/xtls/xray-core/transport/internet/headers/srtp"
67-
_ "github.com/xtls/xray-core/transport/internet/headers/tls"
68-
_ "github.com/xtls/xray-core/transport/internet/headers/utp"
69-
_ "github.com/xtls/xray-core/transport/internet/headers/wechat"
70-
_ "github.com/xtls/xray-core/transport/internet/headers/wireguard"
7166

7267
// JSON & TOML & YAML
7368
_ "github.com/xtls/xray-core/main/json"

0 commit comments

Comments
 (0)