其实这篇文章和Open×××的关系倒不是很大,只是通过Open×××测试时暴露出的问题。这篇文章里面倒是包含了很多IP路由以及conntrack的细节内容。
       有时候,为了节省机器,我希望在一台设备上模拟多个设备,当然,使用网络命名空间是可以的,但是我的内核版本不支持...所以我希望使用纯协议栈的方法来 做到。此时需要解决的问题并不比程序员在编写多线程程序时要少。你要知道什么是共享的,什么是独享的,什么时候什么字段会被什么模块修改...诸如此类, 不一而足...
       先不谈Open×××,仅仅考虑一台机器上两个网卡的情况,如果你ping一个网卡上配置的地址,事实上结果是不会经过这个网卡的,因为在路由模块中,协 议栈会发现这事实上是自己和自己通信,因此会直接bypass掉真实网卡。现在加入Open×××,我希望的是数据包通过下面这个图上所标示的路径发出 去,但事实上没有,原因的注释也在图中:
wKiom1Sx6u_wEPqfAAOS5Abx48U547.jpg无论你怎么用Open×××进行隔离,协议栈还是会发现tun1上的IP是本地IP之一。事实 上,conntrack1和conntrack2也是相同的保存在同一处的同一个conntrack。虽然是同一个conntrack,但是却在同一台机 器上被处理了两次,是为conntrack1和conntrack2。虽然这没有什么问题,但是我不是把conntrack模块给改了吗?改了之后就有问 题了,因为我把route信息cache在了conntrack结构体中,这样一来,上面conntrack1和conntrack2的路由信息明显不可 能是同一个,所以就会有问题。在这个场景下,不能用conntrack来cache路由信息。
       上图所示,错误原因也已经给出了,一些额外的分析也做过了,那么正确的方式应该是什么样的呢?下图给出:
wKioL1Sx68yglWfeAAMKpGrSbZk107.jpg