![OpenVPN 使用自定义脚本修改传入流量或有效负载](https://linux22.com/image/770417/OpenVPN%20%E4%BD%BF%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E8%84%9A%E6%9C%AC%E4%BF%AE%E6%94%B9%E4%BC%A0%E5%85%A5%E6%B5%81%E9%87%8F%E6%88%96%E6%9C%89%E6%95%88%E8%B4%9F%E8%BD%BD.png)
我最近设置了 OpenVPN 并使用 Dnsmasq 作为 DNS,想做一些我似乎找不到任何相关信息的事情。
这是我目前的理解,基于我目前在服务器上设置的内容。
A. 客户端连接到 OpenVPN,比如通过手机
B. 客户端发送流量,即打开一个网站,比如 YouTube
C. OpenVPN 服务器接受请求。
D. 将请求转发到目标服务器,即 YouTube。
E. YouTube 做出回应。
F. OpenVPN 将 A 的响应转发给客户端
当然,以上内容过于简单化了。
我想做的事?
在阶段 C 和 D 之间,例如在 OpenVPN 接受请求(或从目标服务器获得响应,即 D->C)之后,我想要处理实际数据。
例如一个典型的用例。
在 D 和 C 之间,我想将有效载荷传递给例如 Python 脚本,在将有效载荷包装并发送到客户端之前,将网页 html 中的所有“我爱你”文本更改为“我恨你”。
问题
OpenVPN 是否有任何形式的“生命周期挂钩”,让我基本上可以监听和改变请求的有效负载?
我知道 OpenVPN 的任何入站或出站连接都是“Fort Knox”安全的。我对响应有效负载在服务器上裸露这一点很感兴趣。
我有哪些可用的选项?我是否需要使用不同的软件包/软件来实现这样的结果?
答案1
您的想法不可行,原因如下:
1)
据我记得,OpenVPN 本身没有在转发之前将来自 VPN 连接的数据传输到自定义进程的功能。
快速参考:检查 TCP/IP 在 OSI 堆栈中的使用位置。
OpenVPN 位于 OSI 堆栈的第 3 层(网络层),而 TCP 包属于第 4 层(传输层)。
您的问题仅仅因为这个原因就超出了 OpenVPN 想要实现的范围。
您唯一可以操纵的是当客户端连接或断开连接时发生的情况。
您可以通过以下设置在服务器配置文件中定义这些情况:
# client connected to VPN server
client-connect "/script/client_connect.sh"
# client disconnected from VPN server
client-disconnect "/script/client_disconnect.sh"
您的自定义脚本可用的所有环境变量都可以在这里找到:
但本质上,您可以监控的唯一信息是使用哪个客户端证书来连接到服务器以及为客户端分配了哪个 IP 地址,然后根据谁连接以及当他们再次断开连接时要做什么在服务器上制定一些自定义逻辑。
一种典型的设置可能是实现动态 DNS 服务器端或执行一些自定义路由,例如根据哪个 VPN 连接启动而进行故障转移路由。
2)
参考来自维基百科:
本质上,您想要做的是根据源地址或目标地址来操作数据字段。
这也称为中间人攻击。
正如您所发现的,通过监听 OpenVPN 接口很难做到这一点,因为所有内容都是加密的。实际情况是,发往 Internet 的 IPv4 数据包被封装在另一个发往 OpenVPN 服务器的 IPv4 数据包中。
封装的IPv4数据包存储在上图中的数据字段中。
它是从 VPN 服务器转发到互联网的解封装数据包。
但有一个警告:
我假设 VPN 客户端会不是具有公共 IP 地址。这意味着在 Internet 上联系任何主机之前,会涉及 NAT 转换,并且源地址会被重写为 VPN 服务器的地址。
同样,当主机回复答复时,我们发现目标 IPv4 地址与 VPN 服务器相同。
这意味着为了操作数据字段,我们需要跟踪network address translation table
(又名 NAT)中正在使用的端口。
使用的端口通常是动态的,因为多个 VPN 客户端可以通过 VPN 和 NAT 连接到 Internet,并且每个 TCP 会话(邮件、Web、ssh 等)都使用不同的端口。
所以如果你想操纵解密的 TCP 数据包它必须在解密之后但在 NAT 中转换之前发生。
理论上,您可以使用拦截数据包iptables
,但当 VPN 和 NAT 位于同一台机器上时,这并不容易。
另一种方法是直接攻击加密的 OpenVPN 流量,因为您控制 OpenVPN 服务器意味着您还可以控制服务器和客户端上使用的证书和私钥。
这是一种典型的中间人攻击。不过我不知道这是怎么做到的。:-)
...但这引出了我的最后一个论点:
3)
互联网上的大部分流量都是 TLS 加密的。
因此,即使您已经解密了 OpenVPN 流量,仍然需要破解另一层加密才能操纵数据字段的内容。
由于您无法控制会话所使用的加密密钥,因此这一部分比攻击加密的 OpenVPN 流量更难攻击。
即使你尝试解密 TLS 流量并重新加密内容,以便最终用户看起来加密流量确实来自 YouTube 或其他地方,但这仍然是徒劳的,因为你用于加密 https 流量的证书是不可信通过最终用户计算机上的浏览器。
仅这一点就可以使你的中间人攻击变得无效。
现在这已经接近对你的问题的完整回答了。
还有其他角度可以攻击 TCP 会话,但现在我们要将其作为一个高级领域,属于充满安全专家的论坛。
那部分远远超出了我的资格。:-)