使用ssh隧道做三层流量代理

No.1
声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失 , 均由使用者本人负责 , 雷神众测以及文章作者不为此承担任何责任 。
雷神众测拥有对此文章的修改和解释权 。 如欲转载或传播此文章 , 必须保证此文章的完整性 , 包括版权声明等全部内容 。 未经雷神众测允许 , 不得任意修改或者增减此文章内容 , 不得以任何方式将其用于商业目的 。
No.2
起因
看到一篇2017年的文章 , 其中提到了通过用SSH隧道作VPN的方法(# vpn-over-ssh) , 文中说到在openssh4.3之后 , 我们可以通过SSH隧道在目标和本机添加两个tun设备 , 做三层的流量转发 , 可以认为是搭建了一个VPN 。 因为是三层的流量代理 , 最直接的作用是我们可以发送ping包和进行syn扫描 , 这就很舒服了 , 感觉在某些条件下会很香 , 所以进行学习和复现 , 以备不时之需 。
No.3 适用范围
我首先去看了下openssh4.3版本在什么时间发布 , 确定一下这个功能的适用范围大不大如果太新的话 , 可能实战意义就不是那么大了 。
使用ssh隧道做三层流量代理文章插图
使用ssh隧道做三层流量代理文章插图
从前边两张图可以看到 , openssh4.3是在2006年年初发布的 , 从源码中看可能在2005年年底就有了这个功能 , 也就是说在十五年前的版本中就存在这个功能 , 这么看来这个功能的适用范围(4.3至今 , 目前最新版应该是8.4)可能不算太小 。
No.4 复现过程
2017年的文章文中提到场景是当目标可以通过公网ip访问到时的情况 , 需要我们去主动访问目标的ssh服务 , 但是我们实战中的需求可能更多的是反向的 , 也就是说需要目标主动来访问我们在公网上的服务器 。 根据vpn的工作原理可以知道 , 只要对文中的命令稍作修改就可以完成我们的需求 。
No.5 前提条件
· 不同于动态转发、远程转发和本地转发 , 由于需要添加tun设备 , 所以我们必须获取到目标的root权限 。
· 允许root远程登录 , 并且启用tunnel功能 , 在sshd_config修改或添加如下内容:
PermitRootLogin yesPermitTunnel yesNo.6 tun粗略介绍
linux下有两种虚拟网络设备可供选择分别是tun和tap , tun工作在三层 , 而tap工作在二层 , 分别可以转发IP数据包和以太网帧 。 加入tun之后的数据包发送过程的一点个人的拙见 。
一般的数据包发送过程:
使用ssh隧道做三层流量代理文章插图
加入了tun之后发送数据包:
使用ssh隧道做三层流量代理文章插图
socks代理可以看做是一个单向的管道 , 而tun作的三层代理可以看做是一个双向的管道 , 因为它在操作系统中的表现是一个网卡设备 , 所以可以用路由来控制数据包的流向 。 因为该代理工作在三层 , 所以对于直接调用四层API的应用程序(也就是工具)并不需要关心的其他细节 。
VPS的话最好是KVM、Xen或者Hyper-V架构的这种完全的虚拟化 , 如果是Openvz这种直接调用母机内核虚拟化 , 如果母机内核不支持 , 你也没办法 。 (这个情况我没条件测试 , 仅作记录)
在linux2.4版本之后tun功能是默认编译进内核的 , tap的功能最为模块编译(话虽这样说 , 但是现实情况不一定 , 直接上手测一下能不能用是最稳的) 。 可以使用modinfo tun命令查看是否支持tun功能 。
使用ssh隧道做三层流量代理文章插图