Skip to content

Transwarpcom/byedpi

 
 

Repository files navigation

DPI 绕过方法的实现

该程序是一个本地 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 更改顺序。 为了防止虚假数据到达服务器,可以使用 ttlip-optmd5sig 选项。

TTL 需要选择一个值,使数据包能够通过所有 DPI,但不会到达服务器。
对于 Linux,可以使用 md5sig。它设置 TCP MD5 签名选项,该选项可防止数据包被许多服务器接受。 不幸的是,md5sig 并非在所有版本中都有效。

对于 Windows,还有另一种方法可以避免服务器处理虚假数据。 这是将 fakedisorder 结合使用:

  • 参数:--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

尽管 tlsrecoob 会混淆 DPI,但它们也可能会混淆不支持完整 TCP/TLS 堆栈的各种中间设备。
因此,应将它们与 --auto 一起使用:
--auto=torst --timeout 3 --tlsrec 3+s
在该示例中,tlsrec 仅在连接被重置或超时的情况下应用,即很可能发生阻塞时。
反之,如果服务器重置连接或丢弃数据包,则可以取消 tlsrec:
--tlsrec 3+s --auto=torst --timeout 3


--auto, --hosts

参数 auto 将选项分组。 对于每个请求,它们从左到右遍历。 首先检查 auto 中指定的触发器,然后是 pfprotohosts

可以使用此参数分隔多组选项。
可以在 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

有关 DPI 的其他信息,想法来源

About

Bypass DPI

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C 99.6%
  • Makefile 0.4%