github.com/jpillora/chisel
v1.11.8
#182 most downloaded on Go modules
jpillora/chisel
What this package is like to depend on
Last release 15 days ago
08 Aug 2026
Release timing varies
gaps range from 8 days to 12 months
Some releases are documented
notes for 8 of 28 stable releases
Nothing withdrawn
no release was ever pulled
11 years old
71 releases · first in 2015
13 releases in the last 12 months
see the full history below
Release timeline
71 releases · Feb 2015 to Aug 2026Releases
latest 60 of 71-
v1.12.0-rc308 Aug 2026 pre-release -
v1.12.0-rc218 Jul 2026 pre-releaseRelease notes
Open source →Supersedes v1.12.0-rc1, whose
linux_amd64.gzanddarwin_amd64.gzassets were corrupted by a goreleaser v2.12.7 packaging bug (#610). No chisel code changes — rebuilt with goreleaser v2.17.0, and CI now integrity-tests every archive before a release can ship. All 28 rc2 archives verified.Release candidate — soaking for community testing before
1.12becomeslatest. Please try it and report anything odd in #610.Try it:
- One-line install:
curl "https://i.jpillora.com/jpillora/[email protected]!" | bash - Docker:
docker pull jpillora/chisel:1.12.0-rc2(orghcr.io/jpillora/chisel:1.12.0-rc2) - Binaries/packages: assets below
Upgrading from 1.11.x? Read the Upgrading to 1.12 README section. What follows is from 1.12-changes.md, the verified UX & compatibility review of this line.
1. Breaking changes for existing users
a. SOCKS +
--authfile— already on master, branch adds the missing docsEnforcement (
UserAddr()→"socks", channel-level ACL gate) shipped in v1.11.7 (927abde), so branch-vs-master this is not a new break — but today's released chisel has an undocumented breaking change: its README/--helpsay nothing about thesockstoken. The branch fixes that in five places (server help, client help, README auth section, SOCKS guide, 1.12 changelog) including the migration line "existing authfiles which should allow SOCKS5 must add an entry matchingsocks". This documentation is arguably the most valuable UX content on the branch.The original review flagged a diagnosability gap here: a denied user's server-side trace was
Debugf("Denied connection to socks (ACL)"), invisible without-v, making "socks stopped working after upgrade" the #1 anticipated support ticket. This is now fixed — commit3c66f9braised it toInfof("Denied connection to %s (ACL)", hostPort)(share/tunnel/tunnel_out_ssh.go:57), so operators see socks ACL denials at the default log level.b. Truncated legacy MD5 fingerprints rejected — branch-new, loud
Master's
verifyLegacyFingerprintusedstrings.HasPrefix, so--fingerprint a5:b3matched any key with that MD5 prefix (~1-in-65k spoof risk). The branch requires the full 16-octet colon form (client/client.go:248). Affected users fail loudly at connect withInvalid fingerprint (...), and the preceding info line helpfully prints the correct SHA256 fingerprint to migrate to. SHA256 fingerprints were always exact-match — only MD5 stragglers with shorthand configs are affected. Documented in README Security, and the 1.12 changelog now lists it as breaking (added inc4038c3).c.
--authwithout a colon is now a fatal startup error — branch-new, loudOn master,
--auth nocolonsilently degraded (server: user never registered → effectively no auth; client: empty credentials). That's a security footgun, and the branch turns it intoinvalid auth string, expected <user>:<pass>at startup on both sides. Anyone hit by this was already running something other than what they believed. Documented in README, and the 1.12 changelog now lists it as breaking (added inc4038c3).d. Exit code on
--max-retry-countexhaustion: 0 → non-zero — branch-new, silent for automationclient_connect.gonow returnsconnection attempts exhaustedon give-up (ctx-cancel/Ctrl-C still exits 0). Correct behavior, but it's the one change scripts andRestart=on-failureunits experience with no error message to notice — the semantics of$?just flip. It is in the 1.12 changelog, which is the right mitigation.
2. Quiet behavior changes (non-breaking, but observable)
- Reconnect pacing: backoff floor moves 100ms → 1s (new
--min-retry-interval). Softer thundering-herd on server restarts; individual reconnects marginally slower. - Dead connections actually die: pings now time out (
CHISEL_PING_TIMEOUT, default = keepalive interval, so ~50s at defaults vs 15–60 min of kernel retransmit limbo on master). Sleep/wake and NAT-timeout hangs become visible reconnects in logs. Old peers reply to pings, so mixed versions are fine. - Honest connect failures: exit-side dial now happens before channel accept (
CHISEL_DIAL_TIMEOUT30s). Apps see "connection refused/timeout" instead of master's instant-success-then-EOF. Strictly better UX, but tools that measured "connect success" will notice. - Half-close propagation:
shutdown(SHUT_WR)traverses the tunnel (share/cio/pipe.go), fixing netcat-style pipelines and rsync. Falls back to full-close against old peers — no hangs, just old behavior. - SIGTERM is graceful: first signal drains (HTTP drain
CHISEL_SHUTDOWN_GRACE5s, under docker's 10s default), second forces exit. Master died instantly on SIGTERM. - New info-level logs: session
Open (user=… addr=… remotes=…)/Close (… duration=…)andLogin failed for user X (ip)— failed logins are finally fail2ban-able. Two side effects: log parsers keyed on the old debugClosed connectionneed updating, and tunnel endpoints now appear in default-level logs (mild privacy consideration for shipped logs). - Authfile reloads actually work: the watcher survives vim renames, truncation, and k8s ConfigMap symlink swaps, with 100ms debounce; ACLs re-resolve per new channel; the
--authuser is pinned across reloads and wins name clashes; removed users lose new tunnels but established ones aren't cut (documented). Operators who habitually restart after edits will find edits now apply live. - Unanchored ACL patterns warn at every load, per pattern, unsuppressible. Common
.*-style files keep working but get noisy — the warning is doing its job, since unanchored patterns really do over-match. - WS read cap 64KB pre-auth (
CHISEL_WS_READ_LIMIT, 0 disables) on both sides. Max legit SSH packet is ~35KB, so ~2× headroom; the only tail risk is a pathological config payload (thousands of remotes on one client), and the env knob is the escape hatch. - UDP at the flow cap: master permanently blackholed flows past 100; branch sweeps idle over-cap flows (
CHISEL_UDP_DEADLINE15s), so DNS-heavy exit nodes recover instead of wedging. - Nicer failure edges: partial
BindRemotesfailure now unbinds earlier listeners (no zombie ports); bad--keyfileerrors no longer echo raw key material into logs;go installbuilds report real versions;3000/UDPuppercase now parses.
3. Library consumers (Go API)
No compile-breaking signature changes in
client,server, orshare/.... Additive:client.Config.MinRetryInterval,Client.Ready(ctx),Tunnel.Ready,UserIndex.PinUser. Behavioral:NewServerreturns errors where master calledlog.Fatalinside (a win for embedders),Remote.UserAddr()returns"socks"for forward-socks,L4Protolowercases — only code depending on those exact outputs would notice.
4. Mixed-version deployments
Protocol string is unchanged (
chisel-v3), and no handshake changes were found.- v1.11.x client ↔ 1.12 server: works. Socks ACL is server-side and already live since v1.11.7; WS cap and ping timeout are old-peer-safe.
- 1.12 client ↔ v1.11.x server: works, degrading gracefully — no half-close benefit, no dial propagation, no server-side changes;
socks5://proxy scheme is client-local.
Changelog
- One-line install:
-
v1.12.0-rc117 Jul 2026 pre-releaseRelease notes
Open source →⚠️ Superseded by v1.12.0-rc2 — the
linux_amd64.gzanddarwin_amd64.gzassets below are corrupted (goreleaser v2.12.7 packaging bug, #610); their checksums match because the corruption happened at build time. All other assets and the Docker images are intact, but please use rc2 (identical chisel code, rebuilt + integrity-verified assets).Release candidate — soaking for community testing before
1.12becomeslatest. Please try it and report anything odd in #610.Try it:
- One-line install:
curl "https://i.jpillora.com/jpillora/[email protected]!" | bash - Docker:
docker pull jpillora/chisel:1.12.0-rc1(orghcr.io/jpillora/chisel:1.12.0-rc1) - Binaries/packages: assets below
Upgrading from 1.11.x? Read the Upgrading to 1.12 README section. What follows is from 1.12-changes.md, the verified UX & compatibility review of this line.
1. Breaking changes for existing users
a. SOCKS +
--authfile— already on master, branch adds the missing docsEnforcement (
UserAddr()→"socks", channel-level ACL gate) shipped in v1.11.7 (927abde), so branch-vs-master this is not a new break — but today's released chisel has an undocumented breaking change: its README/--helpsay nothing about thesockstoken. The branch fixes that in five places (server help, client help, README auth section, SOCKS guide, 1.12 changelog) including the migration line "existing authfiles which should allow SOCKS5 must add an entry matchingsocks". This documentation is arguably the most valuable UX content on the branch.The original review flagged a diagnosability gap here: a denied user's server-side trace was
Debugf("Denied connection to socks (ACL)"), invisible without-v, making "socks stopped working after upgrade" the #1 anticipated support ticket. This is now fixed — commit3c66f9braised it toInfof("Denied connection to %s (ACL)", hostPort)(share/tunnel/tunnel_out_ssh.go:57), so operators see socks ACL denials at the default log level.b. Truncated legacy MD5 fingerprints rejected — branch-new, loud
Master's
verifyLegacyFingerprintusedstrings.HasPrefix, so--fingerprint a5:b3matched any key with that MD5 prefix (~1-in-65k spoof risk). The branch requires the full 16-octet colon form (client/client.go:248). Affected users fail loudly at connect withInvalid fingerprint (...), and the preceding info line helpfully prints the correct SHA256 fingerprint to migrate to. SHA256 fingerprints were always exact-match — only MD5 stragglers with shorthand configs are affected. Documented in README Security, and the 1.12 changelog now lists it as breaking (added inc4038c3).c.
--authwithout a colon is now a fatal startup error — branch-new, loudOn master,
--auth nocolonsilently degraded (server: user never registered → effectively no auth; client: empty credentials). That's a security footgun, and the branch turns it intoinvalid auth string, expected <user>:<pass>at startup on both sides. Anyone hit by this was already running something other than what they believed. Documented in README, and the 1.12 changelog now lists it as breaking (added inc4038c3).d. Exit code on
--max-retry-countexhaustion: 0 → non-zero — branch-new, silent for automationclient_connect.gonow returnsconnection attempts exhaustedon give-up (ctx-cancel/Ctrl-C still exits 0). Correct behavior, but it's the one change scripts andRestart=on-failureunits experience with no error message to notice — the semantics of$?just flip. It is in the 1.12 changelog, which is the right mitigation.
2. Quiet behavior changes (non-breaking, but observable)
- Reconnect pacing: backoff floor moves 100ms → 1s (new
--min-retry-interval). Softer thundering-herd on server restarts; individual reconnects marginally slower. - Dead connections actually die: pings now time out (
CHISEL_PING_TIMEOUT, default = keepalive interval, so ~50s at defaults vs 15–60 min of kernel retransmit limbo on master). Sleep/wake and NAT-timeout hangs become visible reconnects in logs. Old peers reply to pings, so mixed versions are fine. - Honest connect failures: exit-side dial now happens before channel accept (
CHISEL_DIAL_TIMEOUT30s). Apps see "connection refused/timeout" instead of master's instant-success-then-EOF. Strictly better UX, but tools that measured "connect success" will notice. - Half-close propagation:
shutdown(SHUT_WR)traverses the tunnel (share/cio/pipe.go), fixing netcat-style pipelines and rsync. Falls back to full-close against old peers — no hangs, just old behavior. - SIGTERM is graceful: first signal drains (HTTP drain
CHISEL_SHUTDOWN_GRACE5s, under docker's 10s default), second forces exit. Master died instantly on SIGTERM. - New info-level logs: session
Open (user=… addr=… remotes=…)/Close (… duration=…)andLogin failed for user X (ip)— failed logins are finally fail2ban-able. Two side effects: log parsers keyed on the old debugClosed connectionneed updating, and tunnel endpoints now appear in default-level logs (mild privacy consideration for shipped logs). - Authfile reloads actually work: the watcher survives vim renames, truncation, and k8s ConfigMap symlink swaps, with 100ms debounce; ACLs re-resolve per new channel; the
--authuser is pinned across reloads and wins name clashes; removed users lose new tunnels but established ones aren't cut (documented). Operators who habitually restart after edits will find edits now apply live. - Unanchored ACL patterns warn at every load, per pattern, unsuppressible. Common
.*-style files keep working but get noisy — the warning is doing its job, since unanchored patterns really do over-match. - WS read cap 64KB pre-auth (
CHISEL_WS_READ_LIMIT, 0 disables) on both sides. Max legit SSH packet is ~35KB, so ~2× headroom; the only tail risk is a pathological config payload (thousands of remotes on one client), and the env knob is the escape hatch. - UDP at the flow cap: master permanently blackholed flows past 100; branch sweeps idle over-cap flows (
CHISEL_UDP_DEADLINE15s), so DNS-heavy exit nodes recover instead of wedging. - Nicer failure edges: partial
BindRemotesfailure now unbinds earlier listeners (no zombie ports); bad--keyfileerrors no longer echo raw key material into logs;go installbuilds report real versions;3000/UDPuppercase now parses.
3. Library consumers (Go API)
No compile-breaking signature changes in
client,server, orshare/.... Additive:client.Config.MinRetryInterval,Client.Ready(ctx),Tunnel.Ready,UserIndex.PinUser. Behavioral:NewServerreturns errors where master calledlog.Fatalinside (a win for embedders),Remote.UserAddr()returns"socks"for forward-socks,L4Protolowercases — only code depending on those exact outputs would notice.
4. Mixed-version deployments
Protocol string is unchanged (
chisel-v3), and no handshake changes were found.- v1.11.x client ↔ 1.12 server: works. Socks ACL is server-side and already live since v1.11.7; WS cap and ping timeout are old-peer-safe.
- 1.12 client ↔ v1.11.x server: works, degrading gracefully — no half-close benefit, no dial propagation, no server-side changes;
socks5://proxy scheme is client-local.
Changelog
- One-line install:
-
v1.11.810 Jul 2026 -
v1.11.727 Jun 2026Release notes
Open source → -
v1.11.630 Apr 2026Nothing published for this version
-
v1.11.509 Mar 2026 -
v1.11.415 Feb 2026 -
v1.11.314 Sep 2025Release notes
Open source →Changelog
- Fix CHISEL_KEY environment variable ignored when --keyfile not set by @Copilot in #571
- Remove broken Windows ARM32 builds
- Bump Go version to 1.25.1 and update all dependencies by @Copilot in #568
New Contributors
- @Copilot made their first contribution in #571
-
v1.11.211 Sep 2025Release notes
Open source →- Remove obsolete Windows ARM32 build exclusions from goreleaser
- Add GOTOOLCHAIN=auto to CI for Go version compatibility
- Windows ARM32 builds work fine with modern Go versions
💖 Generated with Crush
Co-Authored-By: Crush [email protected] -
v1.11.111 Sep 2025Nothing published for this version
-
v1.11.011 Sep 2025Nothing published for this version
-
v1.10.2-0.20240928233505-ab8f06a8304828 Sep 2024 pre-releaseNothing published for this version
-
v1.10.128 Sep 2024 -
v1.10.005 Aug 2024 -
v1.9.2-0.20240805055020-59e5362e6bd605 Aug 2024 pre-releaseNothing published for this version
-
v1.9.2-0.20240101204637-3de177432cd201 Jan 2024 pre-releaseNothing published for this version
-
v1.9.2-0.20231201204510-2efe855c4d5b01 Dec 2023 pre-releaseNothing published for this version
-
v1.9.120 Aug 2023Nothing published for this version
-
v1.9.1-0.20230820065040-4eb9e6a87ff520 Aug 2023 pre-releaseNothing published for this version
-
v1.9.019 Aug 2023Nothing published for this version
-
v1.8.2-0.20230819010041-69093be1d96019 Aug 2023 pre-releaseNothing published for this version
-
v1.8.2-0.20230813125432-498c801b820513 Aug 2023 pre-releaseNothing published for this version
-
v1.8.2-0.20230128060137-ce307e580ce028 Jan 2023 pre-releaseNothing published for this version
-
v1.8.127 Jan 2023Nothing published for this version
-
v1.8.027 Jan 2023Nothing published for this version
-
v1.7.8-0.20221031050820-556db3efada031 Oct 2022 pre-releaseNothing published for this version
-
v1.7.8-0.20221011121143-2b90de64cfb211 Oct 2022 pre-releaseNothing published for this version
-
v1.7.8-0.20220814195605-bea454040d6514 Aug 2022 pre-releaseNothing published for this version
-
v1.7.8-0.20220203202419-9e97ddfe604a03 Feb 2022 pre-releaseNothing published for this version
-
v1.7.8-0.20220131044031-bcb6e58dfd5831 Jan 2022 pre-releaseNothing published for this version
-
v1.7.731 Jan 2022Nothing published for this version
-
v1.7.618 Feb 2021Nothing published for this version
-
v1.7.6-0.20210709002849-60d62c6f20e909 Jul 2021 pre-releaseNothing published for this version
-
v1.7.6-0.20210527024803-27169382961227 May 2021 pre-releaseNothing published for this version
-
v1.7.6-0.20210523044622-f8cfc590aa0f23 May 2021 pre-releaseNothing published for this version
-
v1.7.518 Feb 2021Nothing published for this version
-
v1.7.413 Jan 2021Nothing published for this version
-
v1.7.316 Nov 2020Nothing published for this version
-
v1.7.218 Oct 2020Nothing published for this version
-
v1.7.120 Sep 2020Nothing published for this version
-
v1.7.1-rc118 Jul 2020 pre-releaseNothing published for this version
-
v1.7.017 Sep 2020Nothing published for this version
-
v1.7.0-rc928 Aug 2020 pre-releaseNothing published for this version
-
v1.7.0-rc822 Aug 2020 pre-releaseNothing published for this version
-
v1.7.0-rc722 Jul 2020 pre-releaseNothing published for this version
-
v1.7.0-rc622 Jul 2020 pre-releaseNothing published for this version
-
v1.7.0-rc522 Jul 2020 pre-releaseNothing published for this version
-
v1.7.0-rc422 Jul 2020 pre-releaseNothing published for this version
-
v1.7.0-rc318 Jul 2020 pre-releaseNothing published for this version
-
v1.7.0-rc218 Jul 2020 pre-releaseNothing published for this version
-
v1.7.0-rc118 Jul 2020 pre-releaseNothing published for this version
-
v1.6.017 Jun 2020Nothing published for this version
-
v1.5.220 May 2020Nothing published for this version
-
v1.5.120 May 2020Nothing published for this version
-
v1.5.020 May 2020Nothing published for this version
-
v1.4.001 Apr 2020Nothing published for this version
-
v0.0.0-20260309094737-44310b65667a09 Mar 2026 pre-releaseNothing published for this version
-
v0.0.0-20240101204637-3de177432cd201 Jan 2024 pre-releaseNothing published for this version
-
v0.0.0-20230128060137-ce307e580ce028 Jan 2023 pre-releaseNothing published for this version