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 服务器无法连接到目标主机:端口,确认目标服务正在运行
技巧
- 记忆口诀:-L 本地端口:目标地址:目标端口,数据从「本地」流向「远程」
- 目标地址是相对于 SSH 服务器的,localhost 指的是 SSH 服务器自己
- 用 autossh -M 0 代替 ssh 可以实现断线自动重连