Finalmask: Add XDNS (relies on mKCP, like DNSTT), header-*, mkcp-*#5560
Finalmask: Add XDNS (relies on mKCP, like DNSTT), header-*, mkcp-*#5560
Conversation
|
|
|
让kcp能用 salamander 就差不多得了吧 那堆伪装就是兼容选项 这一break反而让它们没有意义了 让AI把它挪到udp mask就是把旧史搬上去 |
并不是 AI,我移了几天
这个头确实有问题,服务端回包格式和客户端发包格式是一样的,也许以后根据 rfc 改下就有资格上桌了
noise 要延迟发包和只加头或者异或/加密混淆不同,还不打算看这个,如果不需要 kcp mask 我就先去看 hy transport hub 了 |
|
那还是先弄hy入站吧 这个有用点 不然复现问题还得让人装个singbox非常难绷 |
|
正想把分享链接中那个 mKCP seed 删掉给 VLESS Seed 让位,所以 udpmasks 里别再叫 seed 了改名 psk 之类的吧 |
|
如果不是真正的前面就加个 |
|
@Fangliding 现在有了 hy2 要不把 kcp 删了吧,没几个人用就是说,现在想暴力发包的都去用 hy2 了 如果想用 VLESS 的 reverse 等特性,VLESS 也能接上 hy2 传输层, |
|
别 有人用的 |
|
他们用的逻辑不就是 kcp 还有那些伪装吗,那些伪装会被迁移到 udpmasks 然后催 UI 更新一下就能完全取代 kcp 了 |
|
我是觉得 UDP 可靠传输/暴力发包这块比起来土制协议还是全部基于 QUIC 更好,要什么外观把伪装叠上去就行 |
|
我觉得一个更精简的UDP协议还是有必要的 quic太重了 自己想改点都无从下手 |
|
也是那就先留着吧,不过等 udpmasks 弄差不多了、Xray 支持 hy2 服务端了,估计用 kcp 更没人用了, |
|
@LjhAUMEM 话说这 QUIC 库方便改 UDP 包最大长度不,不然 udpmasks 叠两层就炸了 |
|
@LjhAUMEM 还有 udpmasks 层能实现个统一的预留长度不,不然对于先弄成全随机数再叠上 fake header 来说性能上太吃亏了 |
|
无优化的“先弄成全随机数再叠上 fake header”直接多了一次没必要的 copy,所以肯定先要给后面的 udpmask 留一些头部空间 |
看了下只能设置 datagram 的包长度大小,对于 steam 的只能设置缓冲区大小,
应该可以在第一次 writeto 获取后面 header 的 size 和加密的 overhead 一起申请了,我看看, |
|
XOR 的本来就要多 copy 一次倒无所谓,只是有没有复用原内存的问题,不过 AEAD 的话 |
|
|
|
重构了一下 salamander 改为 buf 的实现,删掉了独有的缓冲区 现在每个 udpmask 都支持作为第一个 writeto 时为后面的写入预留空间, aead 加解密后的长度是会变化的,好消息是不会影响预留出来的空间,但是会延长后面的空间,如果作为 first 时申请的空间不够多可能会出问题 |
|
其实 salamander 搞这个缓冲区还是不错的,不然并发写入都 stacknew 一下有点难崩,可以只在 first 维护一个 8192 的缓冲区,后面的都共享这块读写 |
|
看了下 aead 加密后的长度其实是固定的,为 overhead+len(plaintext),然后 nonce 也要传过去再加个 nonceSize,我写了个 test 可以跑一下, udpmask 应该可以了,剩下的就是上配置文件测试, |
|
除去已测试的与旧客户端 dtls+aes-gcm-128 psk 可连接成功,下面的配置也测试成功 客户端 {
"log": { "loglevel": "debug" },
"inbounds": [
{
"listen": "127.0.0.1",
"port": 1080,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true
}
}
],
"outbounds": [
{
"protocol": "vless",
"settings": {
"address": "127.0.0.1",
"port": 1081,
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"encryption": "none"
},
"streamSettings": {
"network": "kcp",
"kcpSettings": {
},
"udpmasks": [
{
"type": "wechat"
},
{
"type": "dtls"
},
{
"type": "salamander",
"settings": {
"password": "0123"
}
},
{
"type": "salamander",
"settings": {
"password": "3210"
}
},
{
"type": "aesgcm128",
"settings": {
"psk": "123"
}
},
{
"type": "aesgcm128",
"settings": {
"psk": "321"
}
},
{
"type": "simple"
},
{
"type": "simple"
}
]
}
}
]
}服务端 {
"log": { "loglevel": "debug" },
"inbounds": [
{
"listen": "127.0.0.1",
"port": 1081,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "kcp",
"kcpSettings": {
},
"udpmasks": [
{
"type": "wechat"
},
{
"type": "dtls"
},
{
"type": "salamander",
"settings": {
"password": "0123"
}
},
{
"type": "salamander",
"settings": {
"password": "3210"
}
},
{
"type": "aesgcm128",
"settings": {
"psk": "123"
}
},
{
"type": "aesgcm128",
"settings": {
"psk": "321"
}
},
{
"type": "simple"
},
{
"type": "simple"
}
]
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}以及各个 mask 会额外占用的字节
|
|
|
|
|
已测试 dlts+simple/aesgcm128 psk 与旧版连接无问题,一层 salamander hy 服务端也正常 我想了想既然可以加 first 同理也可以加 end/last 让 mask 知道自己是不是最外层,以后加入 icmp 这种只能放在最外层的伪装也方便 dnstt 要加的话建议放在传输层而不是伪装层,因为要集成 kcp 的 mtu 来实现分片上传,而且放传输层以后如果要支持 DOT DOH 也方便 |
|
如果要把“基于 DNS 的隧道”放到传输层那岂不是又要实现一套可靠传输机制?直接用 QUIC 就行才想着把 DNSTT 这种放伪装层 |
|
就是说要把“可靠传输”和“单纯伪装”这两件事解耦,不然 ICMP、DNS、IP/TCP header 啥的全是不可靠的,都要自己实现可靠传输,开发和维护成本太高了 |
|
这跟salamander不一样 它把数据包混淆了 发过去 服务端解混淆一样 完全透明 完全无状态 啥也不用管 |
|
目前想法就是 XHTTP/3 over XOR over ICMP/DNS/IP/TCP header 啥的,目前还需要 XHTTP/3 那一层限制一下最大 QUIC 包 |
|
@LjhAUMEM Salamander 和 XDNS 内为啥又搞了一个文件夹,可以去掉吗 |
finalmask/udp/salamander finalmask/udp/xdns |
|
|
不对,把 udp 那一层文件夹去掉,以后有可能一个名称同时支持 UDP 和 TCP |
完成
那些是原来仓库里的结构, |
|
|
|
|
压到一个了,我重新 review 一下全部 |
|
Core 的 version 还是被改了 Salamander 和 XDNS 的文件夹还是嵌套了 |
|
XDNS 那个留着吧,就一堆结构体,和 conn 放一起不太合适 |
|
mkcp 那个 removed 提示,udpmasks 字样改成 finalmask/udp |
|
应该可以了,看了一下最重要的 mask conn 部分没问题,kcp 也粗略看了一下, icmp 不太好调试,需要起码两个设备,可能要推迟一下,不过也是这几天 |
|
更新一下 PR 正文描述 |
将 kcp header/security 移到 finalmask/udp,新版要连接旧版 kcp 未配置 seed 要带个 mkcp-original mask
添加 xdns,参考
e111260
dnstt
目前只能搭配 kcp + 配置 mtu,且需要在最外层
一般来说客户端 mtu 130,服务端 mtu 900,极限值也多不了多少,域名过长客户端 mtu 需要减一点,加额外 mask 也要减一点
各个 mask 会额外占用的字节
简易示例配置
{ "log": { "loglevel": "debug" }, "inbounds": [ { "listen": "127.0.0.1", "port": 1080, "protocol": "socks", "settings": { "auth": "noauth", "udp": true } } ], "outbounds": [ { "protocol": "vless", "settings": { "address": "127.0.0.1", "port": 1081, "id": "5783a3e7-e373-51cd-8642-c83782b807c5", "encryption": "none" }, "streamSettings": { "network": "kcp", "finalmask": { "udp": [ { "type": "header-dtls" }, { "type": "mkcp-original" }, { "type": "mkcp-aes128gcm", "settings": { "password": "123" } } ] } } } ] }{ "log": { "loglevel": "debug" }, "inbounds": [ { "listen": "127.0.0.1", "port": 1081, "protocol": "vless", "settings": { "clients": [ { "id": "5783a3e7-e373-51cd-8642-c83782b807c5" } ], "decryption": "none" }, "streamSettings": { "network": "kcp", "finalmask": { "udp": [ { "type": "header-dtls" }, { "type": "mkcp-original" }, { "type": "mkcp-aes128gcm", "settings": { "password": "123" } } ] } } } ], "outbounds": [ { "protocol": "freedom" } ] }