SSH隧道:动态转发本地请求

2021-05-12 3054点热度 0条评论

转发模式

要使用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 服务可能默认没有启用远程端口转发。
此时则需要修改 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
避免在公网直接暴露动态代理转发,十分危险。尽量将远程端口转发到目标主机的SSH端口。这样需要远程接入的人可以自行通过ssh登录或打开本地Socks代理。

Jalena

原创内容,转载请注明出处! 部分内容来自网络,请遵守法律适用!

文章评论