sshuttle 实战:一条 SSH 命令把电脑挂进内网,临时当 VPN 用
远程访问家里那台服务器,你一般会怎么搞?装 …
远程访问家里那台服务器,你一般会怎么搞?装 frp、配 WireGuard、开 Tailscale……这些方案都挺靠谱,但有个共同的”毛病”:多多少少都要动服务端的配置,要么装个客户端,要么起个常驻服务。有时候我人就坐在咖啡店,只想临时连回家瞄一眼 NAS 的下载进度,为了这五分钟去改一堆配置文件,实在有点重。
今天推荐一个”轻量到不像话”的工具——sshuttle。一句话解释:它把 SSH 隧道升级成了”穷人版 VPN”,能把你的所有流量(或指定网段)封装进一条 SSH 连接里,转发到远端服务器再”出站”。对,就是那个你天天在用的 SSH,别的什么都不用装。
原理不复杂:sshuttle 在本地监听,把你指定的流量抓起来切成 TCP 片段,通过 SSH 通道塞给远端;远端用一段 Python 脚本在 iptables/nftables 里做重定向,再把收到的数据发往目标地址。整条链路复用 SSH 的加密和认证,安全性完全继承你现有的 SSH 配置。服务端只要有 SSH 和 Python 环境即可,不需要 root 之外的任何额外软件,也不用开新端口。
安装
- Ubuntu / Debian:
sudo apt install sshuttle - macOS:
brew install sshuttle - 其它发行版:
pip install sshuttle
三种最常用的姿势
先看最简单的——全局代理,把所有流量都走服务器(相当于开了个全局 VPN):
sudo sshuttle -r user@your-server 0.0.0.0/0
但我平时用得最多的,其实是只代理内网网段:把家里那台服务器的内网挂进来,其它流量照常走本地,互不干扰:
sudo sshuttle -r user@your-server 192.168.1.0/24
再加上 --dns 参数,让域名解析也从隧道里走,避免 DNS 泄漏:
sudo sshuttle --dns -r user@your-server 192.168.1.0/24
实战:从咖啡店连回家
举个例子:我人在外面,想访问家里路由器管理页(192.168.1.1)和 NAS(192.168.1.100),家里服务器的可访问地址是 server.vpnt.top。就一行:
sudo sshuttle --dns -r root@server.vpnt.top 192.168.1.0/24
回车、输入 SSH 密码(或者直接配密钥免密),看到 c : Connected to server. 就说明通了。然后浏览器直接打开 http://192.168.1.1 就能进路由器后台,跟坐在家里一模一样。用完 Ctrl+C 断开,干干净净,不留任何残留进程。
它的边界
当然也得说清楚它不适合的场景:本地需要 sudo 权限(要改本机路由表);远端得有 Python;因为是 TCP over TCP 封装,在丢包严重的弱网下性能不如 WireGuard 这类 UDP 方案。所以它的定位是”临时、轻量、应急”的通道——长期稳定的异地组网,我还是建议老老实实上 WireGuard 或 Tailscale。
一句话总结:sshuttle 就是”不想折腾时的临时通道”。SSH 你已经有了,等于这个 VPN 是白送的。下次在咖啡店想连回家,别急着装一堆东西,先试试这一条命令。
