backgroundbackground
Chisel - 强大的端口转发和网络隧道工具

Chisel - 强大的端口转发和网络隧道工具

Chisel / Network / Proxy

教程

2024-10-30 14:00

Chisel 是一款功能强大的开源网络工具,主要用于创建安全、加密的隧道,以便在两个系统之间传输数据。它用 Go 语言编写,能够穿透防火墙,并提供安全的网络端点访问 . 它是一个快速的 TCP/UDP 隧道,通过 HTTP 传输,并通过 SSH 加密 . Chisel 的主要优势在于其单一可执行文件包含客户端和服务器,简化了部署和使用 .

一、前言

最近几天发现了这个强大的端口转发工具,并且它使用HTTP协议承载流量,所以理论上可以套客各大CDN,可玩性非常高

这个小工具使用Go语言编写,支持全平台,单文件,使用很方便。对于Linux发行版也有打包格式可用

Github项目地址:Chisel

二、下载安装

下载页面找到对应平台和架构的包下载,注意区分amd64arm64

这里以Debian系统为例,下载后缀为linux_amd64.deb的包,然后用dpkg安装:

sudo dpkg -i chisel_linux_amd64.deb

然后就能直接在命令行输入chisel使用了

三、使用方法

chisel分为服务端和客户端,服务端指定监听端口和选项,客户端连接服务端并指定端口转发的配置

参考命令

服务端

chisel server -p 8090 --keepalive 10s --socks5 --reverse --auth 'user:password'

命令详解:

  • -p 8090
    • 监听端口8090
  • --keepalive 10s
    • 每10秒发送心跳检测保持连接
  • --socks5
    • 启用socks5支持
  • --reverse
    • 启用反向端口转发(即监听服务端端口,转发回客户端)
  • --auth 'user:password'
    • 设置认证为user:password

客户端

# 实际使用的时候把 127.0.0.1:8090 换成你的服务端地址和端口
chisel client -v --auth 'user:password' 127.0.0.1:8090 1234:192.168.1.2:1234 R:2345:127.0.0.1:2345 2080:socks

命令详解:

  • -v
    • 开启详细日志
  • --auth 'user:password'
    • 设置认证信息
  • 127.0.0.1:8090
    • 服务端地址和端口
  • 1234:192.168.1.2:1234
    • 监听本地1234,转发到远程的192.168.1.2:1234
  • R:2345:127.0.0.1:2345
    • 监听远程的2345,转发回本地的127.0.0.1:2345
  • 2080:socks
    • 开启socks5代理,端口是2080

如果服务端使用了HTTPS,例如使用CDN中转的情况,可以将目标地址写成https://host:port的形式

附上官方架构图

Chisel

四、官方完整配置

服务端:

$ chisel server --help

  用法:chisel server [选项]

  选项:

    --host,定义 HTTP 监听主机 - 网络接口(默认为环境变量 HOST,回退到 0.0.0.0)。

    --port,-p,定义 HTTP 监听端口(默认为环境变量PORT,回退到端口 8080)。

    --key,(已弃用,请改用 --keygen --keyfile)一个可选字符串,用于生成 ECDSA 公钥和私钥对的种子。所有通信将使用此密钥对进行加密。与客户端共享后续指纹以启用中间人攻击检测(默认为 CHISEL_KEY 环境变量,否则每次运行生成新密钥)。

    --keygen,写入新生成的 PEM 编码 SSH 私钥文件的路径。如果用户依赖于您的 --key 指纹,您也可以包含您的 --key 以输出现有密钥。使用 -(短横线)将生成的密钥输出到标准输出。

    --keyfile,一个可选的 PEM 编码 SSH 私钥路径。当设置此标志时,将忽略 --key 选项,并使用提供的私钥来保护所有通信。(默认为 CHISEL_KEY_FILE环境变量)。由于 ECDSA 密钥较短,您还可以将 keyfile设置为内联 base64 私钥(例如 chisel server --keygen - | base64)。

    --authfile,一个可选的 users.json 文件路径。该文件应是一个对象,用户定义如下:
      {
        "<user:pass>": ["<addr-regex>","<addr-regex>"]
      }
 <user> 连接时,将验证其 <pass>,然后将每个远程地址与地址正则表达式列表进行比较以查找匹配。地址将始终以 "<remote-host>:<remote-port>" 的形式出现,正常远程和 "R:<local-interface>:<local-port>" 的形式用于反向端口转发远程。此文件将在更改时自动重新加载。

    --auth,一个可选字符串,表示具有完全访问权限的单个用户,格式为 <user:pass>。这相当于创建一个authfile,内容为 {"<user:pass>": [""]}。如果未设置,将使用环境变量 AUTH。

    --keepalive,一个可选的保持活动间隔。由于底层传输是 HTTP,在许多情况下,我们将通过代理,通常这些代理会关闭空闲连接。您必须指定一个带单位的时间,例如 '5s' '2m'。默认为'25s'(设置为 0s 以禁用)。

    --backend,指定另一个 HTTP 服务器以在chisel 接收到正常 HTTP 请求时代理请求。用于在明处隐藏 chisel。

    --socks5,允许客户端访问内部 SOCKS5 代理。有关更多信息,请参见chisel client --help。

    --reverse,允许客户端指定反向端口转发远程除了正常远程。

    --tls-key,启用 TLS 并提供 PEM 编码TLS 私钥的可选路径。当设置此标志时,您还必须设置 --tls-cert,并且不能设置 --tls-domain。

    --tls-cert,启用 TLS 并提供 PEM 编码TLS 证书的可选路径。当设置此标志时,您还必须设置 --tls-key,并且不能设置 --tls-domain。

    --tls-domain,启用 TLS 并使用 LetsEncrypt 自动获取 TLS 密钥和证书。设置 --tls-domain 需要端口 443。您可以指定多个 --tls-domain 标志以服务多个域。生成的文件缓存到 "$HOME/.cache/chisel" 目录。您可以通过设置 CHISEL_LE_CACHE 变量来修改此路径,或通过将此变量设置为 "-" 来禁用缓存。您可以通过设置 CHISEL_LE_EMAIL可选地提供证书通知电子邮件。

    --tls-ca,PEM 编码 CA 证书包的路径或包含多个 PEM 编码 CA 证书包文件的目录,用于验证客户端连接。提供的 CA 证书将被用于替代系统根证书。这通常用于实现双向 TLS。

    --pid 在当前工作目录生成 pid 文件
    -v,启用详细日志记录

    --help,显示此帮助文本

  信号:
    chisel 进程正在监听:
      SIGUSR2 以打印进程统计信息,以及
      SIGHUP 以短路客户端重连计时器

  版本:
    X.Y.Z

  了解更多:
    https://github.com/jpillora/chisel

客户端:

$ chisel client --help

  用法:chisel client [选项] <服务器> <远程> [远程] [远程] ...

  <服务器>  chisel 服务器的 URL。

  <远程> 是通过服务器隧道的远程连接,每个连接的格式为:

    <本地主机>:<本地端口>:<远程主机>:<远程端口>/<协议>

 本地主机默认为 0.0.0.0(所有接口)。
 本地端口默认为远程端口。
 远程端口是必需的* 远程主机默认为 0.0.0.0(服务器本地主机)。
 协议默认为 tcp。

  这将从服务器共享 <远程主>:<远程端> 到客户端作为 <本地主>:<本地端>,或者:

    R:<本地接口>:<本地端口>:<远程主机>:<远程端口>/<协议>

  这将进行反向端口转发,将 <远程主>:<远程端> 从客户端共享到服务器的 <本地接>:<本地端>
    示例远程

      3000
      example.com:3000
      3000:google.com:80
      192.168.0.5:3000:google.com:80
      socks
      5000:socks
      R:2222:localhost:22
      R:socks
      R:5000:socks
      stdio:example.com:22
      1.1.1.1:53/udp

 chisel 服务器启用 --socks5 时,远程可以用 "socks" 替代远程主机和远程端口。
    "socks" 远程的默认本地主机和端口为 127.0.0.1:1080。连接到此远程将终止于服务器的内部 SOCKS5 代理。

 chisel 服务器启用 --reverse 时,远程可以用 R 前缀表示它们是反向的。也就是说,服务器将监听并接受连接,并通过指定远程的客户端进行代理。
    指定 "R:socks" 的反向远程将在服务器的默认 socks 端口(1080)上监听,并在客户端的内部 SOCKS5 代理处终止连接。

 stdio 用作本地主机时,隧道将连接此程序的标准输入/输出与远程。这在与 ssh ProxyCommand 结合使用时非常有用。你可以使用
      ssh -o ProxyCommand='chisel client chiselserver stdio:%h:%p' \
          [email protected]
    通过隧道连接到 SSH 服务器。

  选项:

    --fingerprint,*强烈推荐*的指纹字符串,用于对服务器的公钥进行主机密钥验证。
        指纹不匹配将关闭连接。
        指纹是通过使用 SHA256 ECDSA 公钥进行哈希生成的,并将结果编码为 base64。
        指纹必须为 44 个字符,并包含一个尾随的等号(=)。

    --auth, 可选的用户名和密码(客户端身份验证),格式为 "<用户>:<密码>"。这些凭据与服务器的 --authfile 中的凭据进行比较。默认为 AUTH 环境变量。

    --keepalive, 可选的保持活动间隔。由于底层传输是 HTTP,在许多情况下我们将通过代理进行传输,通常这些代理会关闭空闲连接。你必须指定一个带单位的时间,例如 '5s' '2m'。默认为 '25s'(设置为 0s 以禁用)。

    --max-retry-count, 最大重试次数,超过此次数后退出。默认为无限制。

    --max-retry-interval, 断开连接后重试前的最大等待时间。默认为 5 分钟。

    --proxy, 可选的 HTTP CONNECT SOCKS5 代理,将用于访问 chisel 服务器。可以在 URL 中指定身份验证。
        例如, http://admin:[email protected]:8081
        或: socks://admin:[email protected]:1080

    --header, 设置自定义头部,格式为 "HeaderName: HeaderContent"。可以多次使用。(例如 --header "Foo: Bar" --header "Hello: World")

    --hostname, 可选地设置 'Host' 头部(默认为服务器 URL 中找到的主机)。

    --sni, 在使用 TLS 时覆盖 ServerName(默认为主机名)。

    --tls-ca, 可选的根证书包,用于验证 chisel 服务器。仅在通过 "https" "wss" 连接到服务器时有效。默认情况下,将使用操作系统的 CA。

    --tls-skip-verify, 跳过服务器 TLS 证书的链和主机名验证(如果使用 TLS 进行与服务器的传输连接)。如果设置,客户端将接受服务器提供的任何 TLS 证书以及该证书中的任何主机名。这仅影响传输 https(wss)连接。chisel 服务器的公钥仍然可以在内部连接建立后进行验证(请参见 --fingerprint)。

    --tls-key, 用于客户端身份验证(双向 TLS)的 PEM 编码私钥的路径。

    --tls-cert, 与提供的私钥匹配的 PEM 编码证书的路径。该证书必须启用客户端身份验证(双向 TLS)。

    --pid 在当前工作目录中生成 pid 文件。

    -v, 启用详细日志记录。

    --help, 显示此帮助文本。

  信号:
    chisel 进程正在监听:
      SIGUSR2 以打印进程统计信息,以及
      SIGHUP 以短路客户端重连计时器。

  版本:
    X.Y.Z

  了解更多:
    https://github.com/jpillora/chisel