01
简介
隧道是把一种网络协议封装进另外一种网络协议进行传输的技术。SSH构建隧道有三种方式: 本地转发、远程转发、动态转发。本次只使用到第一、三种方式来构建多级跳板。
02
原理
本地转发: 将本地的端口与远程机器上的端口构建映射关系。其原理是本地机器上分配一个端口进行侦听,一旦该端口有了连接,就将数据经过通道转发给远端机器上的端口。其格式为:
ssh -C -f -N -L listen_port:DST_Host:DST_port user@Tunnel_Host -p Tunnel_Host_sshport
动态转发: 对于本地转发,存在两个一一对应的端口,分别位于SSH的客户端和服务端; 动态转发的目标端口则是不固定的,其原理是在本地机器上分配了一个端口进行侦听,一旦该端口有了连接,转发出去的数据由发起的请求来决定交给远端机器的哪个端口。其格式为:
ssh -C -f -N -D listen_port user@Tunnel_Host -p Tunnel_Host_sshport
参数说明:
# -N 不打开远程shell,处于等待状态,只是搭好了隧道,不ssh连接远端。用于转发端口(PS:无 ssh登陆日志)
利用ssh构建多级跳板,就是先用本地转发将远端机器的ssh端口与本地端口做映射,然后再通过本地端口继续与其他远端机器的ssh端口构建映射,直至最后一跳时采用任意动态端口转发(建立socks服务器)。
最后本地使用socks代理工具进行配置,就可以根据需要让应用按照之前构建的隧道进行通信。
示例:两级跳板,系统为linux,实验环境:
# Client A:Windows Localhost
第一层转发:
A(localhost:12345)->B(192.168.1.39:22)->C(192.168.1.42:55)
ssh -Nf -C -L 12345:192.168.1.42:55 rootB@192.168.1.39 -p 22
这一步是做了本地12345端口到远程C的55端口映射,A与B之间的通信是SSH加密通信。
第二层转发:
ssh(localhost:9833) -> tunnel2(localhost:12345)
ssh -Nf -C -D localhost:9833 rootC@localhost -p 12345
这一步只绑定本地端口(9833),虽然是与本地的12345通信,但实质是通过tunnel1与C建立了动态转发关系。此时C充当Socks代理服务器的⻆色。
Ref:
http://linux.51yip.com/search/ssh https://blog.csdn.net/king\_cpp\_py/article/details/79560606
03
服务器配置
修改SSH端口: 在/etc/ssh/sshd_config修改Port为想要的端口,检查AllowTcpForwarding的值是否为Yes(允许远程主机本地端口转发),如果需要绑定到0.0.0.0机器上,则检查GatewayPorts的值是否为Yes。然后执行
service sshd restart
SSH IP访问限制:
sudo vi /etc/hosts.allow
sshd:192.168.0.1
sudo vi /etc/hosts.deny
sshd:ALL
在这两个文件中的配置是立即生效,本机测试需要在新窗口中进行。
Ref:
3209/article/details/17683939
04
使用工具配置
1.使用mobaxterm配置tunnel
打开mobaxterm,在tools中的network中选择MobaSSHTunnel,在弹出的对话框中选择New SSH tunnel
在端口转发配置窗口中选择Local port forwarding,按照提示填写信息
点击save保存回到MobaSSHTunnel对话框,再次添加新的tunnel,选择Dynamic port forwarding
示例配置结果如下:
依次启用tunnel,提示输入相对应的密码,确认保存密码
在所有tunnel通道启用完后,点击各tunnel尾部的闪电标识符,启用Autoreconnect,确保断线自动重连。(使用autossh也能实现连接断开之后自动重连功能)
☞注意:Mobaxterm免费版只能使用两个tunnel,xshell不限。
2.本机使用proxifier代理
打开proxifier,选择Profile -> Proxy Server -> add,根据实际填写对应的端口信息(此处应为9833)
然后保存,弹出规则变更提示框,点击是即可。之后可以用其为各类应用进行socks代理,最终通过C访问目标。