fraud-bridge 有助于绕过限制性审查环境,这些环境会阻止直接的 TCP 或 UDP 连接, 通过设置 ICMP、NTP 或 DNS(通过 IPv4 或 IPv6)隧道来实现。
它会自动调整 TCP MSS 选项,以实现非分片的数据包流(即 MSS 钳制),从而提高性能, 使你能够在桥接上进行网络会话。
它使用 MD5(HMAC)完整性保护隧道,防止被恶意注入的 TCP 数据包攻击。如果你需要隐私保护, 则必须自行使用加密。这里假设你无论如何都会通过隧道使用 SSH。 可以直接使用,或者如果你需要 HTTP 隧道,则使用 SSH 代理选项。
当进行 DNS 隧道时,fraud-bridge 使用 EDNS0 扩展头部,将尽可能多的字节放入 TXT 回复中。
fraud-bridge 还包含一些其他技术,以应对某些 bind 限制,例如配额/限流。
你也可以使用它来为你的 SSH 会话获得完整的漫游/移动性支持,而无需任何补丁。
一旦你设置了隧道,你可能想阅读 如何让你的即时通讯工具在隧道中工作。
另外请注意,c->skills 提供了完整的审查破坏设备链,你可能会感兴趣: crash 和 psc
在 Linux 上只需执行 make 即可。
用法如下:
fraud-bridge -- https://github.com/stealth/fraud-bridge
用法: fraud-bridge <-k key> [-R IP] [-L IP] [-pP port] [-iIuUnN] [-s sz]
[-E sz] [-d dev] [-D domain] [-S usec] [-X user] [-r dir] [-t type] [-v]
-k -- HMAC 密钥,用于保护隧道数据包
-R -- 在内部启动时,外部对等端的 IP 或 IPv6 地址
-L -- 在外部启动时,要绑定的本地 IP 地址(可省略)
-p -- DNS/NTP 模式下的远程端口(默认:53/123)
-P -- DNS/NTP 模式下的本地端口(外部默认:53/123)
-i -- 使用 ICMP 隧道
-I -- 使用 ICMPv6 隧道
-u -- 通过 IP 使用 DNS 隧道
-U -- 通过 IPv6 使用 DNS 隧道
-n -- 通过 IP 使用 NTP4 隧道
-N -- 通过 IPv6 使用 NTP4 隧道
-E -- 设置 EDNS0 大小(默认:1024)
-s -- 设置 MSS 大小(默认:1024)
-d -- 使用的隧道设备(默认:tun1)
-D -- DNS 隧道时使用的 DNS 域名
-S -- DNS ping 的微秒延迟(默认:5000)
-X -- 运行的用户(默认:nobody)
-r -- chroot 目录(默认:/var/empty)
-t -- 覆盖 ICMP/ICMP6 类型(通常无需更改)
-v -- 启用详细模式
一些定义:内部 指位于被审查网络内的机器,很可能是你的笔记本/PC。外部 指位于被审查网络外的 VPS 或机器,即人们所说的“自由互联网”。
启动后,fraud-bridge 会打开一个点对点隧道:1.2.3.4 <-> 1.2.3.5
然后你需要在内部机器上启动 inside.sh,在外部机器上启动 outside.sh。
示例如下:
在隧道的外部端(例如互联网上的服务器):
# ./fraud-bridge -u -L 192.168.2.222 -D f.sub.dnstunnel.com -k key
(然后启动 outside.sh)
在内部端:
# ./fraud-bridge -u -R 127.0.0.1 -D f.sub.dnstunnel.com -k key
(然后启动 inside.sh)
这是一个 DNS 隧道示例,本地运行 127.0.0.1 的 named,外部对等端为 192.168.2.222。如前所述,隧道的外部部分可以(并且实际上需要)先启动,它将监听对等端以打开隧道。如果你想使用自己的 bind 设置进行实验,包含了示例区域文件。但在实际运行中的隧道中,这些文件不是必需的。
默认隧道设备是 tun1。确保不要同时运行多个 fraud-bridge 实例,或任何其他使用此隧道设备的隧道软件。每次杀死/重启 fraud-bridge 守护进程后,你必须在重启的那一端重新执行 inside/outside 脚本。
外部的 -L 参数可以(应该)省略。在实际设置中,内部配置中的 -R 参数包含外部服务器的 IP 或 IP6 地址,或者如果使用 DNS 递归,则包含你的提供商 DNS 服务器的 IP 地址或公共递归 DNS 解析器。如果你没有自己的 DNS 服务器,你仍然可以使用 DNS 隧道:在内部使用你的 VPS IP 作为 -R 参数,并在两端使用相同(但任意)的看起来对审查制度合法的 -D 域参数,例如 -D blah.gov。
在尝试 DNS 隧道之前,你很可能想先尝试 ICMP 或 NTP 隧道。 如果在系统日志中看到 chroot 警告,可以忽略它们,或者为 -r 提供有效的参数。
然后你可以使用 ssh -D 1234 1.2.3.5 获取到 192.168.2.222 的 SSH 连接(如上例),并在你的网络浏览器会话中使用端口 :1234 上的 SOCKS5 代理,该代理将通过隧道运行。
你也可以对 ICMP 使用 -i,对 IPv6 上的 ICMP 使用 -I,对通过 UDP 的 DNS 使用 -u,对通过 IPv6 的 DNS 使用 -U,对通过 UDP 的 NTP 使用 -n,对通过 UDP/IPv6 的 NTP 使用 -N。
还可以在你的 SSH 连接之后切换隧道类型(DNS 到 ICMP 或 ICMP 到 NTP),或者漫游到另一个本地 IP(例如从 Wi-Fi 切换到 5G),因为 TCP 状态保存在本地和远程内核中,而不是在桥接中。这允许完整的 SSH 漫游/移动性支持,而无需对 SSH 打补丁。
在详细模式下,fraud-bridge 会保持 stdout 打开以报告错误或消息,因此你需要在一个屏幕(screen)上运行它,或者如果需要它在后台(详细模式)运行,则将输出重定向到 /dev/null。请记住这一点,因为调用 fraud-bridge 后你需要启动 inside/outside 脚本。如果没有使用 -v,它会转到后台并将错误记录到系统日志。
在使用任何 ICMP 隧道之前,请确保放宽你的电缆调制解调器的防火墙规则,以便接收来自远程对等端的回复数据包。fraud-bridge 可以在 NAT 后面工作,但它最终需要接收回复数据包。当使用 ICMP 隧道且 ICMP 回显被阻止时,可以通过 -t 设置类型参数。例如,内部使用 -t 13,外部使用 -t 14,以获得时间戳请求/回复对。
当进行 DNS 隧道时,fraud-bridge 使用 EDNS0 扩展头部,将尽可能多的字节放入 TXT 回复中。在我的测试中,由于它尝试应答任何定时数据包,它不会在 bind9 系统日志文件中产生日志。如果你更改 EDNS0(-E),你需要在两端使用相同的值进行更改。(因为内部向域名服务器通告最大 UDP 负载大小,外部端点根据 -E 给出的值计算 MSS。)
当使用 NTP 隧道时,一些使用 CGN 的提供商会阻止大的 NTP 数据包(仅限 IPv4)。在某个常见的德国 ISP 中,任何大于 256 字节的 NTP 数据包都被阻止。因此,你需要相应地设置 MSS 以获取更小的数据包,例如 -s 100,这样 TCP 栈会以更小的分片发送段。
由于 fraud-bridge 打开一个 PtP 隧道,它可以剥离传输的数据包的 IP 头部,并在两端合成它。因此,对于 ICMP 隧道,你只有 8(ICMP)+ 16(HMAC)字节的开销,这是可以接受的。DNS 隧道在直接使用时,由于 MSS 钳制,仍然有良好的延迟和带宽。当通过公共 DNS 解析器间接隧道时,默认值足以维持合理的会话,但当然,只要可能,ICMP 隧道是更好的选择。
通过使用 ssh -D [0.0.0.0]:1234 1.2.3.5,你可以在本地机器上设置一个本地 SOCKS 代理(端口 1234 内部),并通过 WLAN 将其分发给你的邻居,以便进行无审查的网络会话。
你也可以在外部盒子上设置一个本地 tor,提供一个在 127.0.0.1:9150 上的 SOCKS 端口,就像通常做的那样,然后使用 ssh -L 9150:127.0.0.1:9150 1.2.3.5 将此外部端口转发到你的内部机器,从而精确地在本地复制外部 tor 设置,并通过 WLAN 将其作为 tor SOCKS 端口分发给你的用户。这样我们就不需要实现可插拔传输,你仍然可以像以前一样使用 tor。同样的方法也适用于 crash 或 psc 会话或任何其他隧道机制。
-S 参数对 DNS 定时数据包(需要以恒定间隔发送到服务器)有一个合理的默认值。较低的值可以提供更好的隧道延迟,但可能会使递归 DNS 服务器过载并产生更多噪声。
proudly sponsored by: