header custom & fix dialerProxy with finalmask/udp#5657
header custom & fix dialerProxy with finalmask/udp#5657
Conversation
|
|
|
|
|
|
( |
已经可以了,只是无法搭配 dialerProxy, |
|
|
|
|
嗯,我也只测试了 dialerProxy 部分, |
|
看了下 Splice 对于出站只需要读方向的 raw conn,对于入站只需要写方向的 raw conn,而 header-custom 和 fragment 都满足这一要求,所以可以直接默认 tcpmask 支持解 wrap 简单测试了下 tcp header-custom 以及有无 tcpmask 的 splice 下的行为和之前一样 明天再测下 udp 的 header-custom 以及 conn 清理细节方面应该就可以了
|
1ca3c57 to
f66ed82
Compare
|
改了下,去掉 OnCloseHeaderError,增加 ServersError,可选在不同 clients 位置过来的数据不对时回应的不同错误 |
|
header-custom 的话直接照抄 noises 吧有 str 方便些,如果 rand 就只读取长度、不验证内容 顺便把 fragment 和 noises break 过来吧,
|
|
Wait 不太需要单独 noise,就放 header-custom 的 UDP 里,可以加个选项 times,1 的话就是只发一次,带 delay 的话就是单独发 |
|
header-custom 的 TCP 同理也要加 delay 这个选项,不 delay 的话要粘包发送,都先等有数据吧确保 delay 的准确性 值得注意的是 header-custom UDP 有 delay 时两端可以不同,可能就出站/入站先发几个包给 GFW 演一下, |
|
对于 UDP 就默认它可能会丢包然后有 delay 的就是不验证对端包吧,比如入站写了 client 但有 delay,只发自己 server 的就行 |
CopyRawConnIfExist 只在 freedom 出站和 xtls 里用到,freedom 里在 responseDone,获取 inbound 的 conn 用 tc.ReadFrom 如果有,ReadFrom 也只是影响这个流的写,读不会影响,所以出站只需要 unwrap 后的 read,入站只需要 unwrap 后的 write
合一起也可以,我想的是可以在整个连接周期只发一次,或者可设置重置时间,感觉已经打通的四元组再发没啥意义 |
|
Splice 的话你可能没看 ReadFrom() 里的实现,Linux 要知道两端的 fd 才能对拷,不然实际上是基于 buffer 的 copy,没用到 Splice
|
哦哦,
都改成 str 吗,我怀疑 str 能否表示完全 0-255,还有对于中文不知道用的是啥编码 |
|
tcp 流粘包不太好实现,不知道后面会接收多少才会到下一个包头 |
|
Apart from noise, if we want to implement chrome-h3-fingerprint, we need to know final-target-ip-type (because chrome send 1250 bytes udp-payload for ipv4 and 1230 for ipv6). |
我明白你希望为 v4 v6 设置不同的 noise,但这在上层是可以控制的,出站的话很简单 sendthrough 或 socketopt,入站的话可能有 dual stack 问题但也可以通过监听具体 ip 来解决 |
|
|
|
也可以, |
|
@LjhAUMEM hy2 入站要用到的监听端口范围共用 inbound handler 实例另起一个 PR 改一下 |
那就是内嵌一个 dokodemo 转发,但说实话不如内核直接转发 |
|
@LjhAUMEM 不需要内嵌转发啊,直接处理不就行了 |
|
quic 内部有自己的四元组和 connetion id 所以可以做到连接迁移 quic.Listen 根据 pktConn 绑定 pktConn 根据 socket 绑定,通常为一个端口 "port": "5000-6000" 如果希望只为第一个端口创建 quic.Listen 其他端口只能走转发 可能还有个野路子是聚合 pktConn 传给 quic.Listen,但这比 xray 里的 udp hub 还复杂,udp hub 也只负责监听一个端口,而且会破坏 sysConn |
|
嗯跟我之前想的差不多 |
|
如果是 quic-go 库内部或者有什么算法要确保 local addr 不变的话, |
|
让它 LocalAddr() 取到的端口是固定的,再加一个 RealLocalAddr() 给日志和路由用 |
|
iptables 的性能应该是最好的, |
|
|
|
|
vless enc 什么的本来就是共用的 proxy实例就一份 不会复制一堆 |
|
想让它原生支持listen端口范围来支持端口跳跃麻烦而且性能不太行 hy官端都是跑ipt |
|
|
|
下面每个传输层都要小改 整个inboundhandler改一下 TCP based 还好说 反正就一个个连接 UDP 就麻烦的多 |
portRange 会共用一个 inbound Xray-core/app/proxyman/inbound/always.go Line 70 in b6a7609 但 inbound 间是独立的,仅对于 inbound 内的 ports 是共用的 |
|
|
tcp 包单元
delay: Int32Range 单位毫秒,为 0 会自动与前面合包
rand: int32 随机长度
packet: 十进制字节数组 或 二进制 std base64 编码,与 rand 二选一
tcp 对话序列: tcp 包单元数组
tcp header-custom settings
clients: tcp 对话序列数组,与 servers 遵循一发一收
servers: tcp 对话序列数组,与 clients 遵循一收一发
onError: 十进制字节数组 或 二进制 std base64 编码,仅服务端,对于 clients 发来的验证不通过触发,无 clients 则不会触发
udp 包单元
rand: int32 随机长度
packet: 十进制字节数组 或 二进制 std base64 编码,与 rand 二选一
udp header-custom settings
client: udp 包单元数组,总是合并后加入每个 udp 包头,对于 rand 包单元则只验证长度
server: udp 包单元数组,总是合并后加入每个 udp 包头,对于 rand 包单元则只验证长度
from freedom
只修改配置的 interval 为 delay,其他与原来不变
from freedom
udp 包单元
rand: Int32Range 随机长度
packet: 十进制字节数组 或 二进制 std base64 编码,与 rand 二选一
delay: Int32Range 单位毫秒,发送一个 item 后延迟多少
noise settings
reset Int32Range 单位秒,对于同个连接周期已经发送过的 addr 进行 reset 后重新发送,默认 0 为全局同个 addr 只发送一次
applyTo: udp v4udp v6udp
noise: udp 包单元数组
修复 finalmask/udp dialer proxy
重构 finalmask/udp readfrom
xhttp h3 套上 finalmask/udp
伪装 ssh banner,对应
SSH-2.0-OpenSSH_10.0p2 Debian-7\r\n伪装 socks5 user pass 代理 example.com
对应 hex