SSH应用层隧道原理

一、SSH 协议简介SSH(Secure Shell protocol)协议是应用层协议,OpenSSH 是 SSH (Secure SHell)协议的免费开源实现,SSH 协议族可以用来进行远程控制,或在计算机之间传送文件。而实现此功能的传统方式,如 telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh 都是极为不安全的,并且会使用明文传送密码。OpenSSH 提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程的中的数据,并由此来代替原来的类似服务。二、SSH 工作原理私钥 KEYpri加密公钥 KEYpub解密1)server 第一次启动 sshd 服务时候,会生成自己的私钥 KEYser-pri,生成公钥 KEYserpub存放在/etc/ssh/ssh_host_*下2)client 用户发起 ssh 请求3)server 将自己的公钥 KEYser-pub发送给 client4)client 将 server 的公钥 KEYser-pub存放于~/.ssh/known_hosts 下,并开始生成自己的公私钥 KEYcli-pub 和 KEYcli-pri5)client 回传自己的公钥 KEYcli-pub到 server,此时 server 端有自己的私钥 KEYser-pri和 client 的公钥 KEYcli-pub,client 端有自己的私钥 KEYcli-pri和 server 的公钥 KEYserpub,之后可以使用公私钥加密通信了。6)开始双向加密通信要点:/etc/ssh/ssh_host_* 是服务端放置自己的公钥的地方~/.ssh/known_hosts 是客户端存放服务端公钥的地方server 端(keyser-pri+keycli-pub)keyser-pri用来发送数据时加密发送,keycli-pub用来接收 client 数据后解密client 端(keycli-pri+keyser-pub)keycli-pri用来发送数据时加密发送,keyser-pub用来接收client 数据后解密三、SSH 协议组成1)传输层协议:提供服务器认证,保密性和完整性,和可以压缩提高传输效率。基于TCP/IP 连接2)用户认证协议:为服务器提供客户的身份认证3)连接协议:对接上层的网络安全应用协议认证方式:1)支持 username-passwd 认证2)支持秘钥认证四、SSH 隧道技术普通的 ssh 命令如下:ssh [email protected]创建隧道常用的参数说明:-C:压缩传输,提高传输速度-f:将 ssh 转入后台执行,不占用当前的 shell-N:建立静默连接(不回显 ssh 页面)-g:允许远程主机连接本地用于端口转发的端口-L:本地端口转发-R:远程端口转发-D:动态端口转发(socket 代理)-p:指定 ssh 端口Q1、什么是端口转发?ssh 会加密和解密 ssh 客户端与服务端的网络数据,ssh 还可以将其他的 tcp 端口网络数据通过 ssh 链接来转发,并且是机密解密的(又称隧道)。而且一般情况下 ssh 协议是被允许通过防火墙的,所以很容易被攻击者利用。Q2、ssh 端口转发的优势?1)加密客户端和服务端之间通讯数据2)可以突破防火墙的限制1、本地转发(远程转发到本地-正向代理)情景一:A 想访问 B 但是无法穿透防火墙,但是 A 可以对 B 发送 SSH 连接所以在 A 上执行命令:ssh -NL 54321[本地端口]:localhost[目标 ip]:12345[目标端口] username[目标用户名]@B[ip/host] -p 22[目标 ssh 监听的端口]然后输入 B 的 ssh 密码含义是:在 A 上访问自己的 54321 端口相当于通过(B 的)localhost 的 12345 端口。然后 A 在自己本地访问 54321 端口数据就会通过 ssh 发送给了 B,然后 B 访问了自己的 12345 端口,这样就可以通过 B 的 12345 访问 B 的网络,本地端口 54321 转发到了远程主机去访问某个端口情景二:vps 可以访问 web server(192.168.2.11),但是不能访问 data server(1.1.1.5),但是 web server 有两块网卡,可以使用 ssh 将 vps 的 54321 端口本地转发到远端的 web server,通过 web server 去访问 data server 的 3389 端口(实际上是走了 web server 的另一块网卡 1.1.1.6 访问了 data server 的 3389,把 webserver 当成跳板机)在 hacker 上控制 vps 执行命令:

ssh -CfNg -L 54321[本机端口]:1.1.1.5[目标 ip]:3389[目标端口] username[跳板机用户名]@192.168.2.11[跳板机 ip 或 host] -p 22[跳板机 ssh 监听端口]

查看本地 54321 端口是否连接:netstat -tulnp | grep "54321"如果连接建立,此时 vps 访问自己的本地的 54321 端口就相当于借助 web server 的访问了 data server 的 3389 端口vps 上执行命令:rdesktop 127.0.0.1:54321 即可打开 data server 的 3389 远程桌面或者 hacker 上执行命令:rdesktop 150.150.150.150:54321 也可以访问到 dataserver 的 3389 远程桌面.

注意:本地端口转发:是在本地监听一个端口,所有访问这个端口的数据都会通过 ssh 隧道传输到远端机器,由远端机器代理去访问某个端口。本地端口映射:是把本地的某个端口转发到远端机器的指定端口。

2、远程转发(本地转发到远程-反向代理)

本地端口转发:是将本地的监听一个端口通过 ssh 转发到远端主机(服务器)的某个端口。(自己本地启端口给远端用)远程端口转发:是在远端主机上监听一个端口,所有的访问远程主机的这个端口的数据都会通过 ssh 转发到本地对应的端口(让远端自己启端口给自己用)

情景一:vps 不能访问内网 3 台机器。Web server 可以访问 vps,data 和域控都是纯内网机器,要想访问内网的 data server 的 3389,可以使用 ssh 让 web server 主机监听一个端口,使 web server 把监听到的数据通过 ssh 隧道传输给本地对应的 3399 端口(web server 跳板机)。在 hacker 上控制 vps 执行命令:

ssh -CfNg -R 3399[本机端口]:1.1.1.5[目标 ip]:3389[目标端口] username[跳板机用户名]@192.168.2.11[跳板机ip或 host] -p 22[跳板机 ssh 监听端口]

【注意执行了-R 参数】vps 上执行命令:rdesktop 127.0.0.1:3399 即可打开 data server 的 3389 远程桌面或者 hacker 上执行命令:rdesktop 150.150.150.150:3399 也可以访问到 dataserver 的 3389 远程桌面3、动态转发(socks5 代理)情景一:操作 vps,使用 ssh 动态代理,借助 web server 实现 vps 访问域控制器上的文件。操作步骤:1)vps 执行让 web server 开启动态转发命令:ssh -CfNg -D 8888[本地监听端口] username[用户名]@192.168.2.11[ip 或host] -p 22[ssh 监听端口]2)vps 本地给浏览器配置 socks5 proxy 代理:127.0.0.1:8888。3)然后浏览器访问域控制器 1.1.1.2 即可。情景二:hacker 本机不直接访问 web server,而是走 vps 动态代理访问 web server操作步骤:1)hacker 上执行让 vps 开启动态转发命令:

ssh -CfNg -D 8888[本地监听端口] root[vps 用户名]@150.150.150.150[ip 或host] -p 22[ssh 监听端口]

2)hacker 本机设置浏览器 socks5 代理:127.0.0.1:88883)然后浏览器访问 web server 即可,此时 web server 被访问显示的 ip 是 vps 的,hacker 的 ip 不显示【本机操作见SSH 动态代理】五、进阶使用1)进阶 ssh 多级跳板机动态代理参数 -J 【jump-host】语法:

ssh -J [user@jump-host:port] [user@remote-host:port] ssh -J [user1@jump-host1:port],[user2@jump-host2:port]…[user@remote-host:port]

示例:**ssh -J user1@host1,user2@host2,uesr3@host3 D-user@D-host**ssh 代理了一圈(7 台机器)最后从 93 机器登陆了 55,但是在 55 机器上只能看到是93 登录,并不知道最开始 ip 在哪ssh 开启动态代理从 55 出口出去+代理了一圈跳板机,此时配合本机的浏览器 socks5 代理(127.0.0.1:1080),即可伪装本机的 ip,使用55 的 ip 访问2)scp 多级跳板机传输文件scp -o ProxyJump jump-host1,jump-host2 file.txt user@host:/my/dirscp -o ProxyJump [email protected] 123.txt [email protected]:/tmp/3)动态代理(socks 代理)配合 goby本地让 vps 启动动态代理ssh -CfNg -D 8361 [email protected] -p 5772设置 goby 的代理 127.0.0.1:8361使用 sshuttle 也可以,只不过这样就不需要在 goby 上设置服务器了。