转发模式
要使用SSH来做端口转发,首先我们需要了解SSH所支持的端口转发模式有那些?
- 本地端口转发 本地->远程
把对本地端口的请求转发到远程服务器的对应端口 - 远程端口转发 远程->本地
把对远程端口的请求转发到本地的对应端口上,使用远程端口转发,可以实现内网穿透。 - 动态端口转发
可以将本地的请求转发到远程服务器,由远程服务器帮助请求目标地址。 - Stdio转发(netcat模式)与ProxyJump
netcat模式可谓ssh的杀手特性:通过-W
参数开启到目标网络某主机和端口的stdio转发,可以看做是组合了netcat(nc
)和ssh -L
。上述命令相当于将本机的标准输入输出连接到了JumpHost的telnet端口上,就像在JumpHost上执行telnet localhost一样,而且并不需要在本机运行telnet!
场景使用
了解了SSH所支持的转发模式,我们就可以在实际工作中来进行合理的使用了。
本地端口转发
_L
是一个建立在传输层的端口到端口的转发模式,当然远程主机不仅限于localhost。比如将内网服务器的远程桌面(192.168.5.202:3389)经过SSH服务器(192.168.5.201)转发到本地计算机的3390端口(127.0.0.1:3390)
ssh -C -T -N -L 3390:192.168.5.202:3389 JumpHost
这时访问127.0.0.3390
就等于访问192.168.5.202:3389
参数说明:
C
压缩所有数据T
禁止模拟终端N
不执行远程指令,仅用于端口转发L [local_ip:]local_port:remote_ip:remote_port
本地端口和远程服务器IP端口的TCP隧道
远程端口转发
顾名思义,远程转发就是在SSH连接成功后,绑定目标主机的指定端口,并转发到本地网络的某主机和端口。它正好是和本地转发相反。比如将本地局域网计算机的服务 (IIS、NGINX、DB) 等经过 SSH 服务器暴露出去。
ssh -T -N -R 192.168.6.67:9090:127.0.0.1:9090 JumpHost
访问 192.168.6.67:9090
就等于访问 127.0.0.1:9090
。
参数说明:
C
压缩所有数据;T
禁用模拟终端;N
不执行远程指令, 常用于仅做端口转发;R [ssh_server_ip:]ssh_server_port:local_ip:local_port
SSH 服务器到本地/局域网计算机的的 TCP 隧道;
此时则需要修改 SSH 服务器上的 /etc/ssh/sshd_config 文件, 添加或者编辑 GatewayPorts yes 选项, 并重启 sshd 服务。
动态端口转发(代理)
-D
是建立在TCP/IP
应用层的动态端口转发。它将向本地指定端口发送的请求通过 SSH 服务器向外转发。 比如将 SSH 服务器作为一个代理服务器。由于是标准代理协议,只要支持SOCKS代理的程序都能使用它。
ssh -C -T -N -D 127.0.0.1:8088 JumpHost
将 127.0.0.1:8088
作为一个 SOCKS4/5 的代理
比如 curl --proxy socks5://127.0.0.1:8088 https://www.google.com
。
参数说明:
C
请求压缩所有数据;T
禁用模拟终端;N
不执行远程指令, 常用于仅做端口转发;D [local_ip:]port
动态端口转发, 实现代理服务器, 支持 SOCKS4 和 SOCKS5 协议;
安全性
建议为端口转发建立专门的账户,使用随机密码(私钥登录更好),并且禁用其执行命令的权限。
# add user tunnel-user for ssh port forwarding
sudo useradd -m tunnel-user
# generate 10 random passwords with 16 length
pwgen -sy1 16 10
# pick one password and set it to tunnel-user
sudo passwd tunnel-user
# disable shell for tunnel-user
sudo chsh -s /bin/false tunnel-user
文章评论