SSH远程端口映射通过-L、-R、-D参数实现隧道转发,而非修改sshd_config中的Port;-L将远程服务暴露至本地,-R将本地服务反向暴露至远程,-D创建本地SOCKS代理,均需配合AllowTcpForwarding yes等服务端配置生效。

SSH远程端口映射不是改服务器的SSH端口,而是用SSH隧道把远端服务“拉”到本地,或把本地服务“推”到远端——关键在-L、-R、-D三个参数,不是改/etc/ssh/sshd_config里的Port。
ssh -L:把远程服务暴露到本地端口
适用于:你在本地想访问远程服务器上的某个服务(比如远程数据库、Web UI、Jupyter notebook),但该服务只监听127.0.0.1或内网IP,不对外开放。
-
ssh -L 8080:localhost:3000 user@remote-host→ 远程服务器上localhost:3000的服务,现在可通过http://localhost:8080在本地访问 - 如果服务在远程另一台机器(非SSH登录目标机)上,比如数据库在
10.0.1.5:5432,写成ssh -L 5433:10.0.1.5:5432 user@remote-host - 加
-g才能让其他设备(如手机连同一WiFi)访问你的localhost:8080;不加默认只允许本机连接 - 加
-N避免登录后进入shell,纯转发;加-f让SSH后台运行
ssh -R:把本地服务暴露给远程主机
适用于:远程服务器需要反向访问你本地开发的服务(比如调试时让测试环境调你的本地API),但你本地在NAT后或无公网IP。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
ssh -R 8000:localhost:8000 user@remote-host→ 你在本地启动了python -m http.server 8000,远程服务器上执行curl http://localhost:8000就能访问它 - 远程主机默认只能通过
localhost:8000访问,若想让远程局域网其他机器也能访问,必须加-g,且远程sshd_config里要设GatewayPorts yes - 普通用户无法绑定远程的特权端口(
1–1023),比如-R 22:localhost:2222会失败,除非远程SSH服务以root运行且配置允许
ssh -D:建一个本地SOCKS代理
适用于:需要全局代理访问远程网络(比如绕过本地网络限制、访问远程内网站点),而不是单个端口。
-
ssh -D 1080 user@remote-host→ 本地1080端口变成SOCKS5代理,浏览器或系统设置里配上就能用 - 它不指定目标地址,转发时由客户端协议(如HTTP CONNECT)动态决定目标,比
-L更灵活 - 注意:
-D默认只允许本地连接;要让其他设备走这个代理,同样需-g+ 远程sshd_config中AllowTcpForwarding yes(默认开启) - 浏览器访问
http://intranet.example.com时,DNS解析也走代理(取决于客户端是否启用远程DNS),这点和-L不同
常见失败原因和绕过方法
很多问题不是命令写错,而是权限或配置拦住了转发。
- 远程
sshd_config里AllowTcpForwarding no→ 即使你加了-L/-R,SSH服务直接拒绝,需管理员改成yes并sudo systemctl restart sshd - 远程
GatewayPorts no(默认值)→-R绑定后,远程其他机器无法访问,必须显式设为clientspecified或yes - 本地防火墙(如
ufw)或SELinux拦截了监听端口 → 检查sudo ufw status,临时关掉测试;SELinux可试sudo setsebool -P ssh_forward_port yes - 用
-L时填错目标地址:写localhost是指“远程主机上的localhost”,不是你本地机器;跨机器转发必须写远程能解析的IP或主机名
真正麻烦的从来不是敲哪条命令,而是搞清流量路径里哪一环被策略卡住——先确认AllowTcpForwarding,再看GatewayPorts,最后查本地监听是否生效(ss -tlnp | grep :端口号)。

















