# SSH 隧道与端口转发 ## 场景 不想装 VPN,只想临时把某个内网端口映射出来,或者把自己本地的服务给外网调试。 ## 前置条件 - 有一台能 SSH 的跳板机或公网服务器 - 知道自己要访问的地址和端口 ## 配置 ### 本地转发(把远端的端口映射到本地) ```bash # 访问跳板机能到的 10.0.0.5:3306,映射到本机 13306 ssh -N -L 13306:10.0.0.5:3306 user@jump.example.com ``` ### 远程转发(把本地端口暴露到远端) ```bash # 让别人访问公网服务器的 8080,实际转发到你本机 3000 ssh -N -R 8080:127.0.0.1:3000 user@public.example.com ``` 远程转发要服务端 `GatewayPorts yes` 才能监听 0.0.0.0。 ### 动态转发(SOCKS5 代理) ```bash ssh -N -D 1080 user@jump.example.com # 浏览器/客户端把代理设成 socks5://127.0.0.1:1080 ``` ### 保持连接 ```bash ssh -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes -N -L 13306:10.0.0.5:3306 user@jump # 或者用 autossh autossh -M 0 -N -L 13306:10.0.0.5:3306 user@jump ``` ## 验证 ```bash ss -lntp | grep 13306 nc -zv 127.0.0.1 13306 curl -x socks5://127.0.0.1:1080 https://ifconfig.me ``` ## 回滚 关掉 ssh 进程即可,隧道不改变任何配置。 ## 坑 - **`-N` 不加会占一个交互 shell**,脚本里记得加。 - 远程转发默认只监听 127.0.0.1,要改 `GatewayPorts`。 - 隧道断开后本地端口还显示监听(残留),要 `ExitOnForwardFailure`。 - 只做转发不做认证,暴露出去等于开了一个后门。 - 多个 `-L` 参数可以叠加,写在同一行。 - 复制文件走隧道用 `scp -o ProxyJump=jump` 更省事。