SSH 隧道与端口转发
场景
不想装 VPN,只想临时把某个内网端口映射出来,或者把自己本地的服务给外网调试。
前置条件
- 有一台能 SSH 的跳板机或公网服务器
- 知道自己要访问的地址和端口
配置
本地转发(把远端的端口映射到本地)
# 访问跳板机能到的 10.0.0.5:3306,映射到本机 13306
ssh -N -L 13306:10.0.0.5:3306 user@jump.example.com
远程转发(把本地端口暴露到远端)
# 让别人访问公网服务器的 8080,实际转发到你本机 3000
ssh -N -R 8080:127.0.0.1:3000 user@public.example.com
远程转发要服务端 GatewayPorts yes 才能监听 0.0.0.0。
动态转发(SOCKS5 代理)
ssh -N -D 1080 user@jump.example.com
# 浏览器/客户端把代理设成 socks5://127.0.0.1:1080
保持连接
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
验证
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更省事。