Chisel 是一款功能强大的开源网络工具,主要用于创建安全、加密的隧道,以便在两个系统之间传输数据。它用 Go 语言编写,能够穿透防火墙,并提供安全的网络端点访问 . 它是一个快速的 TCP/UDP 隧道,通过 HTTP 传输,并通过 SSH 加密 . Chisel 的主要优势在于其单一可执行文件包含客户端和服务器,简化了部署和使用 .
一、前言
最近几天发现了这个强大的端口转发工具,并且它使用HTTP协议承载流量,所以理论上可以套客各大CDN,可玩性非常高
这个小工具使用Go语言编写,支持全平台,单文件,使用很方便。对于Linux发行版也有打包格式可用
Github项目地址:Chisel
二、下载安装
在下载页面找到对应平台和架构的包下载,注意区分amd64
和arm64
这里以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
- 开启socks5代理,端口是
如果服务端使用了HTTPS
,例如使用CDN中转的情况,可以将目标地址写成https://host:port
的形式
附上官方架构图
四、官方完整配置
服务端:
$ 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