transtation.git

transtation

~ Your own VLESS + REALITY proxy with optional Cloudflare WARP egress. Server in a container or native; native client with a fail-closed killswitch.
git clone https://github.com/debuman/transtation.git
commit 594fdc49e451a272800505d478b62a66db56d91d
parent baeb91ca9dfea9c052773ccff92ea054c135ce72
Author: sqzer <110329244+sqzer-x@users.noreply.github.com>
Date: Thu, 6 Aug 2026 18:59:41 +0900

Say plainly that proxy mode does not put your machine behind the proxy

Someone reading the README could reasonably install the server and the client,
see the installer report an egress IP in Tokyo, and believe their machine was
now behind the proxy. It is not. Measured on a host with the client running:

curl https://api.ipify.org 198.51.100.23 own address
curl https://api.ipify.org (after the exports) 192.0.2.7 proxied
env -i curl https://api.ipify.org 198.51.100.23 own address
… and the same from any other terminal, and from anything the desktop starts

The old wording contributed to that. "Not covered: QUIC and any application
that ignores proxy environment variables" reads as though everything else is
covered, when in fact nothing is until each program is pointed at the proxy --
and the two export lines reach only the shell they are typed into. Firefox in
particular never sees them.

Proxy mode now opens by saying it does not put the machine behind the proxy and
pointing at tun mode for that, shows the measurement above, and reframes the
limitations so they no longer imply a default that does not exist. The
installer says the same thing in the same words, and labels its self-test
result "through the proxy" rather than presenting an address that is not yours
as though it were.

Diffstat:
MREADME.md | 49++++++++++++++++++++++++++++++++++++++-----------
Minstall.sh | 22++++++++++++++--------
2 files changed, 52 insertion(+), 19 deletion(-)

diff --git a/README.md b/README.md
@@ -4,8 +4,8 @@ Your own VLESS + REALITY proxy, with optional Cloudflare WARP egress, in one
 container on any Linux box that has Docker.
 
 ```
-curl -fsSLO https://raw.githubusercontent.com/sqzer-x/transtation/v1.0.10/install.sh
-sha256sum install.sh      # compare against the hash in the v1.0.10 release notes
+curl -fsSLO https://raw.githubusercontent.com/sqzer-x/transtation/v1.0.11/install.sh
+sha256sum install.sh      # compare against the hash in the v1.0.11 release notes
 less install.sh           # please actually read it
 sudo sh install.sh
 ```
@@ -45,7 +45,7 @@ transtation exists because of a narrower set of preferences:
 Two-step form above is the recommended one. If you are going to pipe it anyway:
 
 ```
-curl -fsSL https://raw.githubusercontent.com/sqzer-x/transtation/v1.0.10/install.sh | sudo sh
+curl -fsSL https://raw.githubusercontent.com/sqzer-x/transtation/v1.0.11/install.sh | sudo sh
 ```
 
 The installer needs root, refuses anything other than x86_64/aarch64, installs
@@ -59,7 +59,7 @@ If you already run Docker and prefer to do it yourself:
 # /opt/transtation/docker-compose.yml
 services:
   proxy:
-    image: ghcr.io/sqzer-x/transtation:v1.0.10
+    image: ghcr.io/sqzer-x/transtation:v1.0.11
     container_name: transtation
     restart: unless-stopped
     ports: ["443:8443"]
@@ -121,6 +121,13 @@ anything.
 
 ### Proxy mode (default) — a local SOCKS5 + HTTP proxy
 
+**This does not put your machine behind the proxy.** It opens a proxy on
+`127.0.0.1:1080` and nothing else. Every program that should use it has to be
+pointed at it, one at a time. Your browser keeps using your own address until
+you configure it; so does everything started from your desktop, and every
+systemd service. If what you want is "all of this machine's traffic", that is
+[tun mode](#tun-mode--the-whole-host), not this.
+
 ```
 sudo sh install.sh client
 ```
@@ -132,7 +139,7 @@ install -Dm600 /dev/stdin /etc/transtation/uri   # paste the vless:// link, then
 docker run -d --name transtation-client --restart unless-stopped \
   -p 127.0.0.1:1080:1080 \
   -v /etc/transtation:/etc/transtation:ro \
-  ghcr.io/sqzer-x/transtation-client:v1.0.10
+  ghcr.io/sqzer-x/transtation-client:v1.0.11
 ```
 
 ```
@@ -140,9 +147,21 @@ export ALL_PROXY=socks5h://127.0.0.1:1080
 export HTTPS_PROXY=http://127.0.0.1:1080 HTTP_PROXY=http://127.0.0.1:1080
 ```
 
+Those two lines apply to **that shell and the programs it starts**, and nothing
+else. Measured on a host with the client running:
+
+```
+curl https://api.ipify.org                 198.51.100.23   your own address
+curl https://api.ipify.org   (after the exports)
+                                           192.0.2.7    through the proxy
+env -i curl https://api.ipify.org          198.51.100.23   your own address
+   … and the same from any other terminal, and from anything your desktop starts
+```
+
 The **`h`** in `socks5h` is load-bearing: plain `socks5://` makes curl resolve
-DNS locally and leaks every hostname you visit. In Firefox, tick "Proxy DNS when
-using SOCKS v5".
+DNS locally and leaks every hostname you visit. In Firefox, set the SOCKS host
+in the connection settings and tick "Proxy DNS when using SOCKS v5" — the
+environment variables above will not reach it.
 
 No capabilities, no devices, no host networking, so nothing here needs a
 rootful container runtime — it was run under rootless Podman as well as Docker.
@@ -157,12 +176,20 @@ Client-side settings, all optional:
 | `TT_URI_FILE` | `/etc/transtation/uri` | where the share link is read from |
 | `TT_URI` | *(unset)* | the link inline — visible in `docker inspect`, so prefer the file |
 
-**Not covered:** QUIC (browsers do not send UDP over SOCKS, so it silently falls
-back to TCP), and any application that ignores proxy environment variables.
+Two more things this mode will not do even for a program you *have* pointed at
+it: QUIC (browsers do not send UDP over SOCKS, so it silently falls back to
+TCP), and anything that reads no proxy setting at all.
+
 **No killswitch is needed here** — nothing is redirected, so if the container
-dies, proxied connections simply fail. That is this mode's biggest advantage.
+dies, proxied connections simply fail and everything else was never going
+through it in the first place. That is this mode's biggest advantage and its
+biggest limitation, and they are the same sentence.
 
 ### Tun mode — the whole host
+<a id="tun-mode--the-whole-host"></a>
+
+This is the one that captures everything the machine sends, with no per-program
+configuration.
 
 ```
 sudo sh install.sh client --tun --killswitch
@@ -176,7 +203,7 @@ docker run -d --name transtation-client --restart unless-stopped \
   -e MODE=tun \
   -e DIRECT_SUFFIXES=example.com,example.net \
   -v /etc/transtation:/etc/transtation:ro \
-  ghcr.io/sqzer-x/transtation-client:v1.0.10
+  ghcr.io/sqzer-x/transtation-client:v1.0.11
 ```
 
 Exactly three extra flags. `--privileged` is **not** needed and must not be
diff --git a/install.sh b/install.sh
@@ -15,12 +15,12 @@
 # last line. If the download is truncated, nothing runs.
 set -eu
 
-VERSION=${TT_VERSION:-v1.0.10}
+VERSION=${TT_VERSION:-v1.0.11}
 IMAGE_SERVER=${TT_IMAGE_SERVER:-ghcr.io/sqzer-x/transtation}
 IMAGE_CLIENT=${TT_IMAGE_CLIENT:-ghcr.io/sqzer-x/transtation-client}
 # Filled in by the release workflow. A tag is mutable -- the same stolen-token
 # compromise we already concede for Xray's .dgst would let someone retag
-# v1.0.10, and the hash-verified installer you read would vouch for nothing.
+# v1.0.11, and the hash-verified installer you read would vouch for nothing.
 SERVER_DIGEST=${TT_SERVER_DIGEST:-}
 CLIENT_DIGEST=${TT_CLIENT_DIGEST:-}
 
@@ -353,7 +353,7 @@ install_client() {
 			/usr/local/sbin/transtation-killswitch on
 		fi
 	else
-		step mode "proxy -- local SOCKS5 + HTTP, no root privileges used at runtime"
+		step mode "proxy -- local SOCKS5 + HTTP on 127.0.0.1:1080"
 		docker run -d --name transtation-client --restart unless-stopped \
 			-p 127.0.0.1:1080:1080 \
 			-v "$URI_DIR":"$URI_DIR":ro \
@@ -381,7 +381,7 @@ install_client() {
 		sleep 2
 	done
 	if [ -n "$_probe" ]; then
-		say "$_probe"
+		[ "$_tun" = 1 ] && say "$_probe" || say "through the proxy: $_probe"
 	else
 		say "NO TRAFFIC"
 		say ""
@@ -394,13 +394,19 @@ install_client() {
 	if [ "$_tun" = 0 ]; then
 		cat <<-'EOF'
 
+			  THIS DOES NOT PUT YOUR MACHINE BEHIND THE PROXY. It opens a proxy and
+			  nothing else; each program has to be pointed at it. Your browser and
+			  anything your desktop starts keep using your own address until you
+			  configure them. For "all of this machine's traffic", use --tun instead.
+
 			  export ALL_PROXY=socks5h://127.0.0.1:1080 HTTPS_PROXY=http://127.0.0.1:1080 HTTP_PROXY=http://127.0.0.1:1080
 
+			    Those apply to that shell and what it starts, and nothing else.
 			    The "h" in socks5h is load-bearing: plain socks5:// makes curl resolve DNS
-			    locally and leaks every hostname you visit. In Firefox, tick "Proxy DNS
-			    when using SOCKS v5".
-			    Not covered by this mode: QUIC (it degrades to TCP) and any app that
-			    ignores proxy environment variables.
+			    locally and leaks every hostname you visit. Firefox needs its own
+			    connection settings; it does not read these variables.
+			    Not covered even for a program you did point at it: QUIC (it degrades to
+			    TCP) and anything that reads no proxy setting at all.
 
 			  Whole-system tunnel instead:  sudo sh install.sh client --tun --killswitch