该程序是一个本地 SOCKS 代理服务器。
ciadpi --disorder 1 --auto=torst --tlsrec 1+s
ciadpi --fake -1 --ttl 8
-i, --ip <ip>
监听 IP,默认为 0.0.0.0
-p, --port <num>
监听端口,默认为 1080
-c, --max-conn <count>
最大客户端连接数,默认为 512
-I, --conn-ip <ip>
绑定到传出连接的地址,默认为 ::
如果指定了 IPv4 地址,则将拒绝 IPv6 请求
-b, --buf-size <size>
在一次 recv/send 调用中接收和发送的最大数据大小
大小以字节为单位,默认为 16384
-g, --def-ttl <num>
所有传出连接的 TTL 值
对于绕过非标准/减少的 TTL 检测可能很有用
-N, --no-domain
如果地址是域名,则丢弃请求
因为解析是同步执行的,所以它可能会减慢甚至冻结工作
-U, --no-udp
不代理 UDP
-F, --tfo
启用 TCP Fast Open
如果服务器支持,则第一个数据包将与 SYN 包一起立即发送
仅在 Linux (4.11+) 中支持
-A, --auto <t,r,s,n>
自动模式
如果发生类似于阻塞或故障的事件,
则将应用此选项后面的绕过参数
可能的事件:
torst :第一个请求后超时或服务器重置连接
redirect:HTTP 重定向到与传出域名不同的 Location
ssl_err :响应 ClientHello 时没有收到 ServerHello 或 SH 包含不正确的 session_id
none :跳过上一组,例如由于域名或协议限制
-u, --cache-ttl <sec>
缓存中值的生存时间,默认为 100800(28 小时)
-T, --timeout <sec>
等待服务器第一个响应的超时时间(秒)
在 Linux 中转换为毫秒,因此可以指定小数
-K, --proto <t,h,u>
协议白名单:tls、http、udp
-H, --hosts <file|:string>
使用域名列表限制参数范围
域名应以换行符或空格分隔
-V, --pf <port[-portr]>
端口限制
-s, --split <n[+s]>
在指定偏移量处拆分请求
可以在数字后添加标志:
+s:添加 SNI 偏移量
+h:添加 Host 偏移量
可以指定多次以在多个位置拆分请求
如果指定了负值,则将数据包大小添加到该值中
-d, --disorder <n[+s]>
类似于 --split,但部分以相反的顺序发送
-o, --oob <n[+s]>
类似于 --split,但部分作为 OOB 数据发送
-q, --disoob <n[+s]>
类似于 --disorder,但部分作为 OOB 数据发送
-f, --fake <n[+s]>
类似于 --disorder,但在发送第一块之前发送一部分假的
发送的虚假字节数等于拆分部分的大小
-t, --ttl <num>
伪造数据包的 TTL,默认为 8
需要选择一个值,使数据包不会到达服务器,但会被 DPI 处理
-k, --ip-opt[=file|:str]
为虚假 IP 数据包设置选项
将大大降低数据包到达服务器的可能性
值得注意的是,它也可能无法到达 DPI
在 Windows 中,支持可能被禁用
-S, --md5sig
为虚假数据包设置 TCP MD5 签名选项
大多数服务器(主要是 Linux)会丢弃带有此选项的数据包
仅在 Linux 中受支持,在某些内核版本(< 3.9,Android)中可能被禁用
-O, --fake-offset <n>
将虚假数据的开头偏移 n 个字节
-l, --fake-data <file|:str>
指定您自己的虚假数据包
-e, --oob-data <char>
在主数据流之外发送的字节,默认为 'a'
-n, --tls-sni <str>
将虚假数据包中的 SNI 更改为指定的
-M, --mod-http <h[,d,r]>
对 HTTP 数据包进行各种操作,可以组合使用
hcsmix:
"Host: name" -> "hOsT: name"
dcsmix:
"Host: name" -> "Host: NaMe"
rmspace:
"Host: name" -> "Host:name\t"
-r, --tlsrec <n[+s]>
在指定偏移量处将 ClientHello 拆分为单独的记录
可以指定多次
-a, --udp-fake <count>
虚假 UDP 数据包的数量
-Y, --drop-sack
忽略 SACK,强制内核重新发送已发送的数据包
--split
将请求分成几部分。以 30 字节的请求为例:
- 参数:
--split 3 --split 7
- 发送顺序:1-3, 3-7, 7-30
位置应按升序指定。
--disorder
属于 disorder 的部分将以 TTL=1 发送,即实际上不会被发送到任何地方。 操作系统只有在发送后续部分后才会知道这一点,此时服务器将使用 SACK 报告丢失。 系统将不得不重新发送前一个数据包,从而扰乱正常的顺序。
- 参数:
--disorder 7
- 发送顺序:7-30, 1-7
以上仅适用于 Linux。 在 Windows 中,执行完全重传:
- 参数:
--disorder 7
- 发送顺序:7-30, 1-30
因此,最好也使用 split
:
- 参数:
--split 7 --disorder 23
- 发送顺序:1-7, 23-30, 7-30
在实践中,最佳使用方式是:
- Linux:
--disorder 1
- Windows:
--split 1+s --disorder 3+s
--fake
- 参数:
--fake 7
- 发送顺序:1-7 虚假,7-30 原始,1-7 原始
请求的第一部分中的数据将替换为虚假数据。
这部分应该通过 DPI,但不会到达服务器。
由于该部分不会到达,操作系统将重新发送它,从而类似于 disorder
更改顺序。
为了防止虚假数据到达服务器,可以使用 ttl
、ip-opt
和 md5sig
选项。
TTL 需要选择一个值,使数据包能够通过所有 DPI,但不会到达服务器。
对于 Linux,可以使用 md5sig。它设置 TCP MD5 签名选项,该选项可防止数据包被许多服务器接受。
不幸的是,md5sig 并非在所有版本中都有效。
对于 Windows,还有另一种方法可以避免服务器处理虚假数据。
这是将 fake
与 disorder
结合使用:
- 参数:
--disorder 1 --fake 7
- 发送顺序:2-7 虚假,7-30 原始,1-30 原始
如果虚假数据包确实到达了服务器,它将被完全重传覆盖。
在实践中,最佳使用方式是:
- Linux:
--fake -1 --md5sig
- Windows:
--disorder 1 --fake -1
--oob
TCP 可以使用 URG 标志在主数据流之外发送数据,但每个数据包只能发送 1 个字节。
此类数据包中的所有数据都将传递到应用程序,最后一个字节除外,该字节是带外数据:
- 参数:
--oob 3
- 发送:1-4 带有 URG 标志(1-3 请求数据 + 第 4 个字节,将被截断),3-30
最好将此字节放在 SNI 中:--oob 3+s
--disoob
类似于 --disorder
,但部分数据使用 OOB 字节发送:
- 参数:
--disoob 3
- 发送:3-30,1-4 带有 URG 标志(1-3 请求数据 + 第 4 个字节,将被截断)
与 --fake
或 --disorder
一起使用时,可以获得 OOB 字节位于分割点的数据包:
- 参数:
--disoob 3 --disorder 7
- 发送:3-30,1-8 带有 URG 标志(1-3 + 将被截断的字节 + 4-8)
--tlsrec
可以通过稍微修改标头将一个 TLS 记录拆分为多个记录。
在分割点插入一个新的标头,将请求的大小增加 5 个字节。
此标头可以放置在 SNI 的中间,从而阻止 DPI 正确读取它:
--tlsrec 3+s
尽管 tlsrec
和 oob
会混淆 DPI,但它们也可能会混淆不支持完整 TCP/TLS 堆栈的各种中间设备。
因此,应将它们与 --auto
一起使用:
--auto=torst --timeout 3 --tlsrec 3+s
在该示例中,tlsrec
仅在连接被重置或超时的情况下应用,即很可能发生阻塞时。
反之,如果服务器重置连接或丢弃数据包,则可以取消 tlsrec:
--tlsrec 3+s --auto=torst --timeout 3
--auto
, --hosts
参数 auto
将选项分组。
对于每个请求,它们从左到右遍历。
首先检查 auto
中指定的触发器,然后是 pf
、proto
和 hosts
。
可以使用此参数分隔多组选项。
可以在 help 文本中将位于 --timeout
下面的参数(tls-sni
除外)移至单独的组中。
--fake -1 --ttl 10 --auto=alert,sid_inv --fake -1 --ttl 5
默认情况下,使用 ttl=10 的 fake
,如果发生错误,则使用 ttl=5 的 fake
--hosts list.txt --disorder 3 --auto=none
仅对 list.txt 中的域名应用混淆
--hosts list.txt --auto=none --disorder 3
不对 list.txt 中的域名应用混淆
--auto=torst --hosts list.txt --disorder 3
默认情况下不执行任何操作,如果发生阻塞且域名包含在 list.txt 中,则使用 disorder。
--proto=http,tls --disorder 3 --auto=none
仅混淆 HTTP 和 TLS
--proto=http --fake -1 --fake-data=':GET /...' --auto=none --fake -1
覆盖 HTTP 的虚假数据包
构建需要:
make
、用于 Linux 的 gcc/clang
、用于 Windows 的 mingw
- Linux:
make
- Windows:
make windows CC=x86_64-w64-mingw32-gcc