9个版本

0.1.11 2022年3月13日
0.1.9 2021年1月23日
0.1.8 2020年12月31日
0.1.5 2020年10月1日
0.1.4 2020年9月27日

#16 in #another

每月48次下载

MIT/Apache

680KB
2K SLoC

Crate Clippy/Fmt Tests Coverage Status

概述

使用Rust实现的HTTP隧道,也可以作为TCP代理使用。

核心代码完全抽象于隧道协议或传输协议。在此示例中,它仅通过少量额外代码就支持了HTTP和HTTPS。

请注意,此隧道不允许通过HTTP隧道传输纯文本(仅支持HTTPS连接)。如果需要此功能,需要使用带有plain_text功能的http-tunnel构建。

cargo build --release --features plain_text

例如,它可以扩展到在QUIC+HTTP/3上运行隧道或连接到另一个隧道(只要实现满足AsyncRead + AsyncWrite)。

您可以查看基准测试

了解更多关于设计的信息。

源文件快速概述

  • configuration.rs - 包含配置结构 + 基本CLI
    • 请参阅config/中的配置文件/TLS材料
  • http_tunnel_codec.rs - 处理初始HTTP请求并编码相应响应的编解码器。
  • proxy_target.rs - 连接目标服务器的抽象 + 基本TCP实现。
    • 包含具有基本缓存策略(缓存给定TTL)的DNS解析器
  • relay.rs - 将数据从一条流转发到另一条流,tunnel = upstream_relay + downstream_relay
    • 还包含基本的relay_policy
  • tunnel.rs - 一个隧道。它由以下内容构建
    • 隧道握手编解码器(例如,HttpTunnelCodec
    • 目标连接器
    • 客户端连接作为一个流
  • main.rs - 应用程序。可以根据命令行参数启动 HTTPHTTPS 通道。
    • 将日志输出到 logs/application.loglog/ 包含浏览器会话中应用程序的实际输出)
    • 度量信息输出到 logs/metrics.log - 非常基本,用于展示概念。

运行演示

通过 cargo 安装

cargo install http-tunnel

现在您无需任何配置即可启动它

$ http-tunnel --bind 0.0.0.0:8080 http

有三种模式。

  • HTTPS:
$ http-tunnel --config ./config/config.yaml \
              --bind 0.0.0.0:8443 \
              https --pk "./config/domain.pfx" --password "6B9mZ*1hJ#xk"
  • HTTP:
$ http-tunnel --config ./config/config-browser.yaml --bind 0.0.0.0:8080 http
  • TCP代理:
$ http-tunnel --config ./config/config-browser.yaml --bind 0.0.0.0:8080 tcp --destination $REMOTE_HOST:$REMOTE_PORT

使用浏览器进行测试(HTTP)

在 Firefox 中,您可以设置 HTTP 代理为 localhost:8080。确保您使用正确的配置运行它

https://support.mozilla.org/en-US/kb/connection-settings-firefox

(使用 HTTP 代理并选中“使用此代理进行 FTP 和 HTTPS”)

$ ./target/release/http-tunnel --config ./config/config-browser.yaml --bind 0.0.0.0:8080 http

使用 cURL 进行测试(HTTPS)

此代理可以用 cURL 进行测试

simple.rust-http-tunnel.org' 添加到 /etc/hosts

$ echo '127.0.0.1       simple.rust-http-tunnel.org' | sudo tee -a /etc/hosts

然后尝试访问列表中的目标(见 ./config/config.yaml),例如

curl -vp --proxy https://simple.rust-http-tunnel.org:8443  --proxy-cacert ./config/domain.crt https://www.wikipedia.org

您也可以尝试不允许的目标。

隐私

应用程序无法看到明文数据。

应用程序不会记录任何可能帮助识别客户端的信息(如 IP、认证令牌)。仅记录一般信息(事件、错误、数据大小)以供监控目的。

DDoS 保护

  • Slowloris 攻击(打开大量缓慢的连接)
  • 发送导致大响应的请求

其中一些可以通过引入速率/年龄限制和空闲超时来解决。

构建

安装 cargo - 按照这些说明

Debian 上修复 OpenSSL 构建问题

sudo apt-get install pkg-config libssl-dev

安装

在 MacOS 上

curl https://sh.rustup.rs -sSf | sh
cargo install http-tunnel
http-tunnel --bind 0.0.0.0:8080 http

在基于 Debian 的 Linux 上

curl https://sh.rustup.rs -sSf | sh
sudo apt-get -y install gcc pkg-config libssl-dev
cargo install http-tunnel
http-tunnel --bind 0.0.0.0:8080 http

依赖关系

~11–24MB
~338K SLoC