SSH 本地端口转发

将本地端口的流量通过 SSH 隧道转发到远程网络中的目标服务,常用于访问内网数据库、Web 服务等

语法

ssh -L [bind_address:]local_port:target_host:target_port [user@]ssh_server

参数

参数说明示例级别
-L 本地端口转发 ssh -L 3307:localhost:3306 user@host 常用
-N 不执行远程命令 ssh -NL 8080:internal:80 user@host 常用
-f 后台运行 ssh -fNL 8080:internal:80 user@host 常用
bind_address 本地绑定地址(默认 127.0.0.1) ssh -L 0.0.0.0:8080:internal:80 user@host 进阶
-g 允许远程主机连接本地转发端口 ssh -gL 8080:internal:80 user@host 进阶

示例

转发本地端口到远程 MySQL

ssh -NL 3307:localhost:3306 user@db-server
# 然后连接:mysql -h 127.0.0.1 -P 3307 -u dbuser -p
localhost 是相对于 db-server 的,即 db-server 本机的 3306

访问内网 Web 服务

ssh -NL 8080:internal-web.corp:80 user@bastion
通过跳板机访问内网 Web 应用,浏览器打开 http://localhost:8080

转发到内网 Redis

ssh -fNL 6380:redis.internal:6379 user@gateway
后台运行,本地 redis-cli -p 6380 即可连接内网 Redis

多端口同时转发

ssh -NL 3307:db:3306 -L 6380:redis:6379 -L 8080:web:80 user@bastion
一条命令同时转发多个端口

常见错误

bind: Address already in use 本地端口被占用,用 lsof -i :端口 或 ss -tlnp | grep 端口 查看,换一个端口
channel 2: open failed: connect failed: Connection refused SSH 服务器无法连接到目标主机:端口,确认目标服务正在运行

技巧

相关命令