一.问题

     最近在折腾anyconnect,拿来玩战地1,主要还是因为某sock在我这蜜汁校园网下太不稳定了,而常规的vpn又被ban协议了(好像我把系统玩坏了,我才不会承认呢!),然后要处理dns的问题,因为要做no-route分流必须考虑到cdn的问题,不然就没意义了,所以就把前一段时间折腾的Pcap_dnsproxy拿出来了,简单的配置了一下让它监听内网tunnel,然后改了下ocserv的配置文件将dns也设置为内网tunnel的ip,然后就好了,不过我在玩了一段时间后总是发现Pcap_dnsproxy会dead,主要状况是进程还在,但是对任何查询都无响应,即使是在服务器上dig也是如此,这就很尴尬了。

二.分析

      碰到问题去翻log是个好习惯,而且配合谷歌食用风味更佳(雾),然而这次翻到的log却没有给我直接找到解决方法,log里除了标示着程序启动读取config的输出以外就只有一条错误了(因为这条错误刷屏了……)

错误:Network Error: Socket initialization error, error code is 97

啥也看不出是吧,通过谷歌搜索这句话,可以看到github上一个Pcap_dnsproxy的issue里有出现,开始很惊喜,然而看了下发现并没有解决,只是一提,不过也给了一部分信息,项目的作者说97是协议不支持,程序无法初始化监听,那么问题就来了,是啥协议啥监听不成功?

把程序的配置文件从头翻到尾,只有TCP/UDP/IPV4/IPV6这几个是可以作为监听配置的,然后进一步分析,TCP和UDP是肯定不会有问题的(有问题这台机器还能跑啥),那么就是IPV6的锅了,很简单,因为我用的是阿里云的机器,不支持IPV6,好了,那我把所有IPV6的监听全部干掉,在对配置文件一番修改之后,啥也没变,还是这样(大写的尴尬)……

这到底是为什么呢?

我纠结了好久,于是决定反过来,既然程序关掉IPV6没有作用,那我就让机器支持IPV6,哪怕是fe80这样的本机IPV6,这儿的思路主要是在ECS上ping6 ::1是会报错的

错误:socket: Address family not supported by protocol

和程序的报错有点相像,我觉得我找到了关键。于是我开始搜索centos6开启IPV6,发现一堆关闭的教程……就是找不到开启的。好吧,那我按照关闭的教程反着来总行了吧,很遗憾……不行,关闭的教程里添加的内容我根本没找到,这怎么办呢?我执行modprobe ipv6提示模块关闭,咦,这就有意思了,通过检查我发现模块是存在的,但是为啥会关闭呢?肯定是有配置文件在生效,翻了下modprobe的配置文件目录,发现有个modprobe.d的文件夹,里面就有个disable_ipv6.conf的文件,看了下内容,就是它了,注释掉内容,重启,OK,ping6 ::1成功。

接着我把Pcap_dnsproxy的错误日志清空,然后重启程序,在后台跑了一会儿,发现错误日志空空的,搞定!所以说这个问题其实是Pcap_dnsproxy的一个BUG,即无法关闭IPV6的监听,起码是初始化监听这一步骤,而且在后续运行过程中还会不断重试,导致最终程序出错。当然这也和阿里云ECS的模板有关,一般的即使不支持IPV6也会有个本机IPV6地址,而阿里云这儿彻底关闭了IPV6的协议支持,导致了这个问题的出现。


Senraの小窝原创文章,转载请注明来自:记一个Pcap_DNSProxy的BUG