本文目录导读:

sshuttle 和通常的 SSH 隧道(如 -L 或 -D 端口转发)的工作方式不同,它不建立单个具体的“隧道端口”,而是建立一个透明的 VPN 级别的代理。
它拦截所有 TCP 流量(或指定网段的流量),并通过 SSH 连接将其路由到远端服务器,然后由远端服务器代为发出。
快速上手(最常用的命令)
假设你想让所有本机的网络流量都通过远程 SSH 服务器 user@your-ssh-server.com 转发:
sudo sshuttle -r user@your-ssh-server.com 0.0.0.0/0
sudo:必须的,因为 sshuttle 需要修改系统路由表和拦截网络数据包。-r user@your-ssh-server.com:指定 SSH 连接的远程服务器。0.0.0/0:表示“所有 IPv4 地址”,即所有流量都走代理。
更常见的使用场景:仅代理公司内网
如果你只需要访问公司内网(0.0.0/8),而不想浪费带宽访问外网,可以这样:
sudo sshuttle -r user@office-vpn.com 10.0.0.0/8
这样,只有访问 x.x.x 网段的流量会通过 SSH 隧道走远程服务器,访问百度、Google 等网站依然走你本机网络。
常用参数选项
-
--dns:将 DNS 查询也通过隧道发送,解决内网域名解析问题。sudo sshuttle --dns -r user@server 10.0.0.0/8
-
-x <IP>或--exclude <IP>:排除某个 IP 不走隧道(直连),避免 SSH 连接把自己踢掉。sudo sshuttle -r user@server 0.0.0.0/0 -x your-ssh-server-ip
-
-v:显示详细日志,方便调试。 -
--ssh-cmd:指定 SSH 命令(如果使用了非标准端口或自定义密钥)。sudo sshuttle -r user@server --ssh-cmd 'ssh -p 2222 -i ~/.ssh/mykey' 10.0.0.0/8
与普通 SSH 隧道的区别
| 特性 | sshuttle |
普通 SSH 隧道 (-L/-D) |
|---|---|---|
| 工作层级 | 网络层(VPN 模式) | 应用层(端口转发) |
| 配置复杂度 | 极简,一行命令搞定 | 需要为每个服务手动转发端口 |
| 协议支持 | 仅 TCP 和 DNS (UDP 部分) | 取决于转发类型 |
| 是否需 sudo | 必须(修改路由表) | 通常不需要 |
| 拦截机制 | 透明代理(所有应用自动走代理) | 需要应用配置代理或连接特定端口 |
重要提示
- Python 依赖:sshuttle 是用 Python 写的,远程服务器需要有 Python 环境(Linux 默认自带)。
- 仅支持 TCP:它不能转发 UDP 流量(如视频通话、在线游戏),但会处理 DNS 查询(通过
--dns)。 - 断开隧道:按
Ctrl + C终止sshuttle进程,路由表会自动恢复,如果程序崩溃导致网络不通,可以运行sudo sshuttle --reset-tcp清理残留规则。
当你不想配置繁杂的 iptables 或 OpenVPN,又想快速、透明地让所有(或指定)程序通过公司内网/代理访问资源时,sshuttle 是比普通 SSH 隧道更优雅的解决方案。
标签: SSH代理隧道