原文链接:使用ssh隧道做三层流量代理
1、起因
看到一篇2017年的文章,其中提到了通过用SSH隧道作VPN的方法(https://artkond.com/2017/03/23/pivoting-guide/# vpn-over-ssh),文中说到在openssh4.3之后,我们可以通过SSH隧道在目标和本机添加两个tun设备,做三层的流量转发,可以认为是搭建了一个VPN。因为是三层的流量代理,最直接的作用是我们可以发送ping包和进行syn扫描,这就很舒服了,感觉在某些条件下会很香,所以进行学习和复现,以备不时之需。
2、适用范围
我首先去看了下openssh4.3版本在什么时间发布,确定一下这个功能的适用范围大不大如果太新的话,可能实战意义就不是那么大了。
从前边两张图可以看到,openssh4.3是在2006年年初发布的,从源码中看可能在2005年年底就有了这个功能,也就是说在十五年前的版本中就存在这个功能,这么看来这个功能的适用范围(4.3至今,目前最新版应该是8.4)可能不算太小。
3、复现过程
2017年的文章文中提到场景是当目标可以通过公网ip访问到时的情况,需要我们去主动访问目标的ssh服务,但是我们实战中的需求可能更多的是反向的,也就是说需要目标主动来访问我们在公网上的服务器。根据vpn的工作原理可以知道,只要对文中的命令稍作修改就可以完成我们的需求。
4、前提条件
· 不同于动态转发、远程转发和本地转发,由于需要添加tun设备,所以我们必须获取到目标的root权限。
· 允许root远程登录,并且启用tunnel功能,在sshd_config修改或添加如下内容:
- PermitRootLogin yes
- PermitTunnel yes
复制代码
5、tun粗略介绍
linux下有两种虚拟网络设备可供选择分别是tun和tap,tun工作在三层,而tap工作在二层,分别可以转发IP数据包和以太网帧。加入tun之后的数据包发送过程的一点个人的拙见。
一般的数据包发送过程:
加入了tun之后发送数据包:
socks代理可以看做是一个单向的管道,而tun作的三层代理可以看做是一个双向的管道,因为它在操作系统中的表现是一个网卡设备,所以可以用路由来控制数据包的流向。因为该代理工作在三层,所以对于直接调用四层API的应用程序(也就是工具)并不需要关心的其他细节。
VPS的话最好是KVM、Xen或者Hyper-V架构的这种完全的虚拟化,如果是Openvz这种直接调用母机内核虚拟化,如果母机内核不支持,你也没办法。(这个情况我没条件测试,仅作记录)
在linux2.4版本之后tun功能是默认编译进内核的,tap的功能最为模块编译(话虽这样说,但是现实情况不一定,直接上手测一下能不能用是最稳的)。可以使用modinfo tun命令查看是否支持tun功能。
也许你会收到如下的报错:
在新版本中默认安装的iproute2工具包也支持操作tun/tap的功能,可能tun/tap功能已经默认编译进内核。
怕是重名的功能,我特别去看了看它的源码是不是确实用了这个功能,发现确实tun/tap功能。
6、过程
首先需要获取到目标的root权限,使用root账号带-w参数登录我们的vps(当然也可以不返回shell)。
-w any:any时,系统自动选择下一个可用tun序号,当然也可以收到指定可用的tun序号,比如-w 0:0。
乍一看,可能会觉得在目标使用root登录我们的vps有点危险,不过让他不返回shell之后,目标进入我们的当前的会话应该也无法从已有的隧道spawn一个shell出来,并且在命令行参数中也无法看到密码,不考虑泄露ip的风险的话,实际上的风险是可控的。
然后是配置网卡,在我们的vps执行如下命令,设置本地网卡地址为1.1.1.1,掩码32位,因为是要建立一个点对点的连接,所以设置对端地址为1.1.1.2:
在目标执行执行如下命令,设置本地ip为1.1.1.2,32位掩码,同样是点对点连接,设置对面ip为1.1.1.1。
随后分别把目标和vps的网卡启动。
因为我们要将流量代理进目标内网,所以我们要在目标上开启内核流量转发功能,并且通过iptables把来自1.1.1.2的流量转发到eth0网卡上去。
然后在vps设置一个路由,把网关设置成对端的ip(也就是目标上的tun0的本地ip),把发向目标内网网段的流量通过点对点连接,也就是tun0转发进去。
至此,整个配置过程就结束了,理论上讲对端ip可以是任意的(任意一个用不到的ip),但本地ip一定是正确,因为会影响你接收ICMP error的数据包。
我在本地打开另一台win10机器。
在vps上ping一下它,成功ping通。
使用nc监听一个端口并传输数据,确定是本地机器。
目前看来使用是没有问题了,但是稳定性和隐蔽性有待进一步测试。
测试过程使用的命令文字版,为了方便复制:
- VPS:
- ip addr add 1.1.1.1/32 peer 1.1.1.2 dev tun0
- ip link set tun0 up
- route add -net 192.168.64.0/24 gw 1.1.1.2
- 目标:
- ip addr add 1.1.1.2/32 peer 1.1.1.1 dev tun0
- ip link set tun0 up
- echo 1 > /proc/sys/net/ipv4/ip_forward
- iptables -t nat -A POSTROUTING -s 1.1.1.1 -o eth0 -j MASQUERADE
复制代码
7、参考链接
https://unix.stackexchange.com/questions/198501/purpose-of-ip-addresses-on-tun-interface
https://developers.redhat.com/blog/2018/10/22/introduction-to-linux-interfaces-for-virtual-networking/
https://artkond.com/2017/03/23/pivoting-guide/
https://access.redhat.com/sites/default/files/attachments/rh_ip_command_cheatsheet_1214_jcs_print.pdf
|