SSH 端口转发是一种高效、安全的方式,可以将本地服务暴露到远程服务器,或者将远程服务映射到本地。
SSH 端口转发的类型
本地端口转发 (
-L
)
将远程服务器上的服务映射到本地端口,用于访问远程服务。ssh -L [本地地址:本地端口]:[远程地址:远程端口] user@your-server
示例:
ssh -L 8080:localhost:80 user@your-server
- 本地
8080
端口映射到远程服务器的80
端口。 - 本地访问
http://localhost:8080
,即访问远程服务器的http://localhost:80
。
- 本地
远程端口转发 (
-R
)
将本地服务映射到远程服务器的端口,用于将本地服务暴露到外网。ssh -R [远程地址:远程端口]:[本地地址:本地端口] user@your-server
示例:
ssh -R 0.0.0.0:8888:localhost:8080 user@your-server
- 远程服务器的
8888
端口映射到本地的8080
端口。 - 外部访问
http://your-server:8888
,即可访问本地的http://localhost:8080
。
- 远程服务器的
动态端口转发 (
-D
)
将本地端口作为 SOCKS 代理,用于动态访问任意远程服务。ssh -D [本地地址:本地端口] user@your-server
示例:
ssh -D 127.0.0.1:1080 user@your-server
- 本地
127.0.0.1:1080
作为 SOCKS 代理,可通过浏览器等工具配置访问外网。
- 本地
配置 /etc/ssh/sshd_config
文件
为了使远程端口转发(-R
)正常工作,可能需要修改远程服务器的 SSH 配置文件 /etc/ssh/sshd_config
。
关键配置项
允许 TCP 转发
确保以下配置为yes
:AllowTcpForwarding yes
启用网关端口
使远程端口可以绑定到非本地地址:GatewayPorts yes
GatewayPorts no
:默认值,只允许绑定到127.0.0.1
(本地回环地址)。GatewayPorts yes
:允许绑定到所有地址。GatewayPorts clientspecified
:根据客户端的-R
命令指定绑定地址。
重启 SSH 服务
修改配置后,重启 SSH 服务使其生效:sudo systemctl restart sshd
常用组合参数
1. 保持连接活跃 (-fN
)
-f
:在连接建立后,SSH 会后台运行。-N
:只建立端口转发,不执行远程命令。ssh -fN -L 8080:localhost:80 user@your-server
2. 指定绑定地址
-L
本地绑定地址:127.0.0.1
仅本地访问,0.0.0.0
外部可访问。-R
远程绑定地址:同样使用127.0.0.1
或0.0.0.0
。ssh -R 0.0.0.0:8888:localhost:8080 user@your-server
3. 动态端口转发 + 指定 SOCKS 代理
使用
-D
开启动态端口转发,将本地端口作为 SOCKS 代理:ssh -D 127.0.0.1:1080 user@your-server
4. 禁用伪终端
-T
:禁用伪终端分配,用于纯端口转发:ssh -T -R 8888:localhost:8080 user@your-server
5. 指定配置文件
-F
:使用自定义 SSH 配置文件:ssh -F ~/.ssh/custom_config -L 8080:localhost:80 user@your-server
远程端口转发的安全性考虑
限制绑定地址
如果不需要外网访问,建议远程端口绑定到127.0.0.1
,避免暴露服务:ssh -R 127.0.0.1:8888:localhost:8080 user@your-server
强制使用 SSH 密钥认证
配置服务器强制使用密钥认证,避免账户被暴力破解:PasswordAuthentication no
监控转发端口的使用
在远程服务器上监控端口转发的使用情况:netstat -tlnp
完整案例
1. 将本地服务暴露到远程服务器并开放外网访问
ssh -R 0.0.0.0:8888:localhost:8080 user@your-server
- 在远程服务器的
8888
端口监听,外部可通过http://your-server:8888
访问。
2. 映射远程服务到本地
ssh -L 8080:localhost:80 user@your-server
- 将远程服务器的
80
端口映射到本地8080
,本地访问http://localhost:8080
。
3. 配置 SOCKS 代理
ssh -D 127.0.0.1:1080 user@your-server
- 本地
127.0.0.1:1080
作为 SOCKS 代理,可代理访问外网。
评论 (0)