runshell.github.io

personal blog

View on GitHub

SSH隧道转发

0x00 ssh常用参数说明

-C  压缩传输数据,加快传输速度
-f  后台对用户名密码进行认证
-N  仅仅只用来转发,不用再弹回一个新的shell
-n  后台运行
-q  安静模式,不要显示警告等信息
-l  指定ssh登录名
-g  允许远程主机连接到本地转发的端口(本机监听地址设为0.0.0.0,不选则为127.0.0.1)    
-L  进行本地端口转发
-R  进行远程端口转发
-D  动态转发,即socks代理
-T  禁止分配伪终端
-p  指定远程ssh服务端口

0x01 本地转发

ssh [-C] [-f] [-N] [-g] -L [本机ip]:本机端口:vps能访问的主机ip:端口 <user@vps>

将本地的一个端口映射到vps能到达的主机的一个端口。如果vps是边界设备,拥有多网卡,那么就可以用该方法访问内网主机的服务。

例:假如你拥有一台web服务器的控制权,但是数据库服务器没有公网IP,你想直接访问数据库的服务,这时就可以使用本地转发,在本地(local)执行如下命令:

ssh -Nnf -L 6666:10.10.10.12:3306 root@188.224.123.45
#访问本地的6666端口就可以被映射到数据库10.10.10.12的3306端口
mysql -u root -ppassword -P 6666

序列图如下:

1536460373438

0x02 远程转发

ssh -C -f -N -R 0.0.0.0:vps_port:本机能访问的IP:端口 root@vps

将vps上的一个端口映射到本机能到达的主机的一个端口。以至于可以通过vps访问内网的计算机上面的服务。遗憾的是,即使你指定了监听地址为0.0.0.0,它也仅能监听127.0.0.1,不能实现内网穿透。

然后经过一番折腾,得出答案,需要修改sshd的配置文件/etc/ssh/sshd_config,将配置做如下修改:

GatewayPorts yes
#重启sshd服务
service sshd restart || systemctl restart sshd

0x03 动态转发

ssh -qTfnN -D 0.0.0.0:1080 root@vps -p 22

本机将本地1080端口的所有流量发给vps,vps转发收到的流量。这就是赤裸裸的socks代理啊。