单独一台机器测试OpenVPN加密隧道的问题和解决

其实这篇文章和OpenVPN的关系倒不是很大,只是通过OpenVPN测试时暴露出的问题。这篇文章里面倒是包含了很多IP路由以及conntrack的细节内容。
       有时候,为了节省机器,我希望在一台设备上模拟多个设备,当然,使用网络命名空间是可以的,但是我的内核版本不支持...所以我希望使用纯协议栈的方法来做到。此时需要解决的问题并不比程序员在编写多线程程序时要少。你要知道什么是共享的,什么是独享的,什么时候什么字段会被什么模块修改...诸如此类,不一而足...

       先不谈OpenVPN,仅仅考虑一台机器上两个网卡的情况,如果你ping一个网卡上配置的地址,事实上结果是不会经过这个网卡的,因为在路由模块中,协议栈会发现这事实上是自己和自己通信,因此会直接bypass掉真实网卡。现在加入OpenVPN,我希望的是数据包通过下面这个图上所标示的路径发出去,但事实上没有,原因的注释也在图中:


技术分享


无论你怎么用OpenVPN进行隔离,协议栈还是会发现tun1上的IP是本地IP之一。事实上,conntrack1和conntrack2也是相同的保存在同一处的同一个conntrack。虽然是同一个conntrack,但是却在同一台机器上被处理了两次,是为conntrack1和conntrack2。虽然这没有什么问题,但是我不是把conntrack模块给改了吗?改了之后就有问题了,因为我把route信息cache在了conntrack结构体中,这样一来,上面conntrack1和conntrack2的路由信息明显不可能是同一个,所以就会有问题。在这个场景下,不能用conntrack来cache路由信息。

       上图所示,错误原因也已经给出了,一些额外的分析也做过了,那么正确的方式应该是什么样的呢?下图给出:


技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。