SSH配置远程端口转发
一、ssh -N -L 实现内网端口访问的原理与用法
ssh -N -L 是 SSH 本地端口转发(Local Port Forwarding)的核心命令,其核心作用是在本地机器的指定端口与远程服务器可访问的内网目标端口之间,建立一条加密传输隧道,从而实现通过访问本地端口,间接访问内网服务的目的,无需直接暴露内网地址。
1. 命令参数解释
明确各参数的具体含义,是正确使用该命令、排查问题的基础,核心参数及常用补充参数如下:
-L:本地端口转发的核心参数,格式固定为本地端口:内网目标地址:内网目标端口,用于指定本地端口、内网目标的地址和端口。-N:仅建立 SSH 隧道,不执行远程服务器的任何命令,避免不必要的 shell 登录,专注于端口转发功能。补充常用参数(提升使用便捷性和安全性):
-f:将 SSH 隧道后台运行,避免终端关闭后隧道断开,无需一直保持终端窗口打开。-i:指定 SSH 私钥文件路径,适用于密钥登录场景,无需手动输入密码,提升登录效率和安全性。
2. 典型场景与完整命令
结合实际网络拓扑,给出最常用的应用场景,方便读者直接参考套用:
本地机器:可正常访问公网,能连接公网服务器(IP:
203.0.113.10,默认 SSH 端口 22)。公网服务器:具备内网访问权限,可连通内网目标机器(IP:
192.168.1.50,内网 Web 服务端口 8080)。核心目标:在本地机器上,访问内网
192.168.1.50:8080对应的服务。
完整命令示例(推荐后台运行,避免终端占用):
1 | # 后台建立加密隧道,将本地8888端口转发至内网192.168.1.50:8080 |
3. 访问内网端口的步骤
- 执行转发命令:
在本地终端运行上述命令后,SSH 会自动在本地监听 8888 端口,此时输入公网服务器登录密码(或通过密钥自动认证),即可完成隧道建立,无需额外操作。
- 密钥登录场景(补充
-i参数,替换私钥文件路径):
- 访问内网服务:
隧道建立成功后,无需额外配置,在本地浏览器或对应客户端中,访问 http://localhost:8888(或 127.0.0.1:8888),即可等同于直接访问内网的 192.168.1.50:8080 服务。
4. 进阶场景:多层内网转发
若公网服务器与内网目标机器之间存在多层网络(如公网服务器仅能访问内网网关 192.168.1.1,而网关可访问深层内网 192.168.2.10:3306,如 MySQL 数据库端口),命令格式无需调整,仅需修改内网目标地址即可:
1 | # 本地3306端口转发至深层内网192.168.2.10:3306(MySQL端口) |
此时本地连接 MySQL 数据库时,只需将连接地址设为 localhost,端口设为 3306,即可正常访问内网数据库。
5. 关闭隧道(可选)
若无需继续使用隧道,可通过以下命令关闭,避免占用本地端口和网络资源:
1 | # 查找SSH隧道对应的进程(筛选出目标隧道进程) |
二、注意事项
本地端口不可占用:若本地指定的端口(如示例中的 8888)已被其他程序占用,会提示
bind: Address already in use,只需更换一个未被占用的本地端口(如 8889)即可。公网服务器需连通内网目标:公网服务器必须能正常 ping 通内网目标地址(如
192.168.1.50),且内网目标端口未被防火墙拦截,否则隧道虽能建立,但无法正常访问内网服务。权限需达标:SSH 登录公网服务器的用户(如示例中的 root)需具备足够的操作权限,同时内网服务需允许公网服务器的 IP 访问,否则会出现权限不足或访问被拒绝的问题。
总结
ssh -N -L命令的核心逻辑的是本地端口:内网目标地址:内网目标端口 远程服务器地址,建议搭配-f参数后台运行,提升使用便捷性。隧道建立后,访问
localhost:本地端口,即可间接访问内网目标服务,无需直接接触内网环境。使用该命令的关键前提:公网服务器能正常连通内网目标的地址和端口,且本地指定的转发端口未被占用。