ssh隧道理解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ssh隧道理解相关的知识,希望对你有一定的参考价值。
参考技术A A是我们手上的电脑,B是外国服务器(公网我们的), C是外国服务器(如Google),A能访问B, A不能访问C, B不能访问A, B能访问C
那么,我想想上Google,该怎么办?
-N 不执行任何命令
-f 后台运行
-L参数的行为。-L X:Y:Z的含义是,将IP为Y的机器的Z端口通过中间服务器B映射到本地机器的X端口
那么,在A上访问127.0.0.1:2121就是访问C的网站了
在A上执行
然后在B上执行
使用SSH的方式不够稳定,使用AutoSSH可以自动在连接断开时自动重连,再把AutoSSH加入系统服务自动启动,则可以做到稳定的连接
1.安装AutoSSH
2.执行AutoSSH命令
-M:在5555端口上监听连接的变化,只要断开就重连
少了-f 参数,因为AutoSSH本来就在后台运行
有A,B,C 3台服务器, A,C有公网IP, B是某IDC的服务器无公网IP. A通过B连接C的80端口(A=>B=>C),
那么在B上执行如下命令即可:
-D port
指定一个本地机器 “动态的'’ 应用程序端口转发. 工作原理是这样的,
本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接,
该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接.
目前支持 SOCKS4 协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发
通过provixyl这样代理软件,全局代理(就是把所有的A电脑上访问所有ip,0.0.0.0 都转发到本地1080端口)
同时把访问的那些ip映射到B服务器, 让B去访问 最终就是A 利用 B作为跳板, 访问了那些IP
办公电脑A, 公司内网服务器B(内网192.x.x.x), [AB在同一个局域网]}, 生产环境上的C(内网ip:10.144.0.x)
A能链接B,不能链接C, B能链接C(同过一台公网服务器, 上面介绍到的, 公网访问内网)
实现B(192.x.x.x)链接C(通过一台公网服务器D) B通过D连接C的8000端口(B=>D=>C)
接收有A访问的ip, 如10.144.0.x:80, 通过provixyl这样软件, 把接收到的10.144.0.x转发到本地1080端口
ssh隧道配置
ssh隧道配置
1 前言
隧道是一种把一种网络协议封装进另外一种网络协议进行传输的技术。这里我们研究ssh隧道,所以所有的网络通讯都是加密的。又被称作端口转发,因为ssh隧道通常会绑定一个本地端口,所有发向这个端口端口的数据包,都会被加密并透明地传输到远端系统。
ssh隧道有3种类型:
l 动态端口转发(Socks 代理)
l 本地端口转发
l 远端端口转发
2 隧道配置
2.1 实验环境
角色 | IP |
服务器A | 192.168.8.10 |
服务器B | 192.168.8.11 |
服务器C | 192.168.8.12 |
2.2 动态端口转发(Socks)
动态端口允许通过配置一个本地端口,把通过隧道到数据转发到远端的所有地址。本地的应用程序需要使用Socks协议与本地端口通讯。此时SSH充当Socks代理服务器的角色。
动态转发需要用第三方socks软件
使用场景1
已知服务器A可以通过SSH访问登录服务器B,但无法访问服务器C,服务器B可以访问服务器C。
服务器A(192.168.8.10)通过服务器B(192.168.8.11)访问服务器C(192.168.8.12)所有端口
使用场景2
已知服务器A可以通过SSH访问登录服务器B,但无法访问某网站,服务器B可以访问某网站。
服务器A(192.168.8.10)通过服务器B(192.168.8.11)访问某网站
2.2.1 linux方式
命令格式:
ssh -D [bind_address:]port
参数说明
bind_address 指定绑定的IP地址,默认情况会绑定在本地的回环地址(即127.0.0.1),如果空值或者为*会绑定本地所有的IP地址,如果希望绑定的端口仅供本机使用,可以指定为localhost。
port 指定本地绑定的端口
l 免密钥方式
如果使用免密钥方式,首先需要将服务器A(192.168.8.10)能免密钥访问服务器B(192.168.8.11)
服务器A(192.168.8.10)操作:
ssh-keygen
一直回车
将服务器A(192.168.8.10)的id_rsa.pub内容放到服务器B(192.168.8.11).ssh/authorized_keys里面
ssh -f -N –g -D localhost:7001 [email protected]
l 亚马逊中转方式
如果服务器B(192.168.8.11)是亚马逊ec2服务器,操作如下:
将亚马逊pem的key上传服务器A(192.168.8.10),比如/key目录下:
ssh -i /key/key.pem -f -N -g -D localhost:7001 [email protected]
l 安装socks代理软件
下载代理软件proxychains
git clone https://github.com/rofl0r/proxychains-ng.git
安装配置
cd proxychains-ng/
./configure --prefix=/usr/local/proxychains
make
make install
make install-config
vi /usr/local/proxychains/etc/proxychains.conf
修改配置:
[ProxyList] # add proxy here ... # meanwile # defaults set to "tor" #socks4 127.0.0.1 9050 socks5 127.0.0.1 7001 |
使用proxychains:
一般就是在命令前面加上proxychains4即可
ssh方法:
/usr/local/proxychains/bin/proxychains4 ssh [email protected]
mysql方法:
/usr/local/proxychains/bin/proxychains4 mysql -uroot -h 192.168.8.12 -p
curl方法:
/usr/local/proxychains/bin/proxychains4 curl icanhazip.com
wget方法:
/usr/local/proxychains/bin/proxychains4 wget http://****
2.2.2 windows方式
xshell软件方法:
服务器A(192.168.8.10)先通过xshell软件连接到服务器B(192.168.8.11)
然后进行如下设置:
保持一直连接:
增加跳转配置:
重新连接服务器B:
保持连接不要关闭
安装socks5客户端软件proxifier
http://www.hanzify.org/software/13717.html
打开proxifier软件,并增加代理:
编辑代理规则:
默认的规则选择Direct,然后新增一个规则
注意:应用程序选择不一定生效,可以随便写一个程序,我们用另外方法让程序使用代理。
选择程序使用代理:
比如谷歌浏览器使用代理,对着谷歌浏览器右键:
就可以使用代理访问了,并且proxifier会有记录:
其他程序方法一样,右键选择代理打开即可。
2.2.3 优缺点
优点:
配置一个代理服务就可以访问远端机器和与其所在子网络的所有服务
缺点:
应用程序需要额外配置SOCKS代理,若应用程序不支持代理配置则无法使用
2.3 本地端口转发
通过SSH隧道,将一个远端机器能够访问到的地址和端口,映射为一个本地的端口。
相比动态转发,就是详细指定到目标某个端口。但不需要第三方socks软件。
使用场景
已知服务器A可以通过SSH访问登录服务器B,但无法访问服务器C,服务器B可以访问服务器C。
服务器A(192.168.8.10)通过服务器B(192.168.8.11)访问服务器C(192.168.8.12)某个端口
2.3.1 linux方式
命令格式
ssh -L [bind_address:]port:host:hostport
参数说明
bind_address 指定绑定的IP地址,默认情况会绑定在本地的回环地址(即127.0.0.1),如果空值或者为*会绑定本地所有的IP地址,如果希望绑定的端口仅供本机使用,可以指定为localhost。
port 指定本地绑定的端口
host 指定数据包转发目标地址的IP,如果目标主机和ssh server是同一台主机时该参数指定为localhost
host_port 指定数据包转发目标端口
l 免密钥方式
如果使用免密钥方式,首先需要将服务器A(192.168.8.10)能免密钥访问服务器B(192.168.8.11)
服务器A(192.168.8.10)操作:
ssh-keygen
一直回车
将服务器A(192.168.8.10)的id_rsa.pub内容放到服务器B(192.168.8.11).ssh/authorized_keys里面
服务器A(192.168.8.10)操作:
ssh -f -N –g -L 7002:192.168.8.12:22 [email protected]
然后直接访问192.168.8.10的7002端口就是访问192.168.8.12的22端口
ssh [email protected] –p 7002
l 亚马逊方式
如果服务器B(192.168.8.11)是亚马逊ec2服务器,操作如下:
将亚马逊pem的key上传服务器A(192.168.8.10),比如/key目录下:
ssh -i /key/key.pem -f -N –g -L 7002:192.168.8.12:22 [email protected]
2.3.2 windows方式
xshell软件方法:
服务器A(192.168.8.10)先通过xshell软件连接到服务器B(192.168.8.11)
然后进行如下设置:
保持一直连接:
增加跳转配置:
重新连接服务器B:
保持连接不要关闭
使用xshell连接localhost的7002端口就是访问192.168.8.12的22端口
2.3.3 优缺点
优点:
无需设置代理
缺点:
每个服务端口都需要配置不同的端口转发
2.4 远端端口转发
远程端口转发用于某些单向阻隔的内网环境,比如说NAT,网络防火墙。在NAT设备之后的内网主机可以直接访问公网主机,但外网主机却无法访问内网主机的服务。如果内网主机向外网主机建立一个远程转发端口,就可以让外网主机通过该端口访问该内网主机的服务。可以把这个内网主机理解为“内应”和“开门者”。
使用场景
已知服务器A可以通过SSH访问登录服务器B,但服务器B不能访问服务器A,服务器B和服务器C可以相互访问。若服务器C想访问服务器A的某个端口
服务器C(192.168.8.12)通过服务器B(192.168.8.11)访问服务器A(192.168.8.10)某个端口
2.4.1 linux方式
命令格式
ssh -R [bind_address:]port:host:hostport
参数说明
bind_address 指定绑定的IP地址,默认情况会绑定在本地的回环地址(即127.0.0.1),如果空值或者为*会绑定本地所有的IP地址,如果希望绑定的端口仅供本机使用,可以指定为localhost。
port 指定本地绑定的端口
host 指定数据包转发源地址的IP,如果源主机和ssh server是同一台主机时该参数指定为localhost
host_port 指定数据包转发源端口
l 免密钥方式
如果使用免密钥方式,首先需要将服务器A(192.168.8.10)能免密钥访问服务器B(192.168.8.11)
服务器A(192.168.8.10)操作:
ssh-keygen
一直回车
将服务器A(192.168.8.10)的id_rsa.pub内容放到服务器B(192.168.8.11).ssh/authorized_keys里面
服务器A(192.168.8.10)操作:
ssh -f -N –g -R 22:192.168.8.11:7003 [email protected]
然后直接访问192.168.8.11的7003端口就是访问192.168.8.10的22端口
ssh [email protected] –p 7003
2.4.2 windows方式
xshell软件方法:
服务器A(192.168.8.10)先通过xshell软件连接到服务器B(192.168.8.11)
然后进行如下设置:
保持一直连接:
增加跳转配置:
重新连接服务器B:
保持连接不要关闭
使用xshell连接192.168.8.11的7003端口就是访问192.168.8.10的22端口
2.4.3 优缺点
优点:
可以穿越防火墙和NAT设备
缺点:
每个服务都需要配置不同的端口转发
本文出自 “桃子技术” 博客,请务必保留此出处http://taozijishu.blog.51cto.com/11320335/1971141
以上是关于ssh隧道理解的主要内容,如果未能解决你的问题,请参考以下文章
红蓝对抗之隧道技术第二篇(reGeorg内网穿透SSH隧道本地Socks代理SSH远程转发Earthworm Socks5代理Tunna正向代理ICMP隧道DNS隧道Frp穿透)
红蓝对抗之隧道技术第二篇(reGeorg内网穿透SSH隧道本地Socks代理SSH远程转发Earthworm Socks5代理Tunna正向代理ICMP隧道DNS隧道Frp穿透)