记一个Pcap_DNSProxy的BUG

一.问题

     最近在折腾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的监听全部干掉,在对配置文件一番修改之后,啥也没变,还是这样(大写的尴尬)……

这到底是为什么呢? 阅读全文→

Centos6编译安装Pcap_DNSProxy——DNS防污染利器

一.缘起

最近有朋友提起自建dns的方案,我个人用的是dnsmasq+dnscrypt-proxy,他吐槽说我这个太麻烦,用pcap_dnsproxy一个就够了,然而……这玩意我上手之后发现编译起来简直是神坑,特别是对于centos6来说,感人肺腑= =……不过问题的出现就是为了解决吗,作者在说明里把依赖全列出来了,所以我折腾了下搞定了,在此记录一下,以方便其它有需要的人。

二.解铃

安装方法:
安装过程比较漫长而且操作比较复杂,请给予一定的耐心按照说明操作!

1.准备程序编译环境:编译前需要使用包管理工具安装,或者需要自行编译和安装依赖库
* 依赖工具/库列表:
* GCC/g++ 可访问 https://gcc.gnu.org 获取
* GCC 最低版本要求为 4.9 从此版本开始 GCC 完整支持 C++ 11 标准,4.9 之前的版本对 C++ 11 标准的实现有问题
* GCC 当前版本可使用 gcc --version 查看,使用旧版本 GCC 强行编译可能会出现无法预料的问题!
* Bison 可访问 https://www.gnu.org/software/bison 获取
* M4 可访问 https://www.gnu.org/software/m4 获取
* Flex 可访问 http://flex.sourceforge.net 获取
* CMake 可访问 https://cmake.org 获取
* LibPcap 可访问 http://www.tcpdump.org/#latest-release 获取
* 获得 root 权限后使用 ./configure -> make -> make install 即可
* 部分 Linux 发行版可能还需要 LibPcap-Dev 工具的支持
* Libsodium 可访问 https://github.com/jedisct1/libsodium 获取
* 编译时如果剥离 Libsodium 的依赖则可跳过编译和安装下表的依赖库和工具,具体参见下文的介绍,不建议使用
* Libsodium 的编译和安装依赖 Automake/Autoconf 套装工具:
* aclocal
* autoscan
* autoconf 可访问 https://www.gnu.org/software/autoconf 获取
* autoheader
* automake 可访问 https://www.gnu.org/software/automake 获取
* libtool 可访问 https://www.gnu.org/software/libtool 获取
* 获得 root 权限后进入目录,运行 ./autogen.sh -> ./configure -> make -> make install 即可
* 部分 Linux 发行版可能还需要 Libsodium-Dev 工具的支持
* 部分 Linux 发行版可能还需要运行 ldconfig 刷新系统的库缓存

2.编译 Pcap_DNSProxy 程序并配置程序属性
* 切勿更改脚本的换行格式 (UNIX/LF)
* 使用终端进入 Source/Scripts 目录,使用 chmod 755 CMake_Build.sh 使脚本获得执行权限
* 使用 ./CMake_Build.sh 执行编译程序
* 添加参数 --enable-static 即 ./CMake_Build.sh --enable-static 可启用静态编译
* 脚本所进行的操作:
* CMake 将编译并在 Release 目录生成 Pcap_DNSProxy 程序
* 设置 Pcap_DNSProxy 程序以及 PcapDNSProxyService 和 Pcap_DNSProxy.service 服务控制脚本的基本读写可执行权限
* 设置 Linux_(Un)Install.Systemd.sh 以及 Linux_(Un)Install.SysV.sh 服务控制安装脚本的基本读写可执行权限
* 从 ExampleConfig 复制默认配置文件到 Release 目录
* 执行时使用 ./CMake_Build.sh --disable-libsodium 可剥离 Libsodium 的依赖,不建议使用
* 剥离后编译时将不需要 Libsodium 库的支持
* 剥离后程序将完全失去支持 DNSCurve/DNSCrypt 协议的功能,且运行时将不会产生任何错误提示,慎用!

3.配置系统守护进程服务
* 由于不同的 Linux 发行版对系统服务和守护进程的处理方式不同,本步仅供参考
* 附带的 Linux_Install.Systemd.sh 脚本适用于默认使用 Systemd Init 的系统
* Linux Debian 8.x 官方发行版以及更新版本系统环境,经测试可直接使用
* 附带的 Linux_Install.SysV.sh 脚本适用于默认使用 System V Init 的系统
* Linux Debian 6.x - 7.x 官方发行版系统环境,经测试可直接使用
* 更多详情可参见下文其它 Linux 发行版服务的说明,以及所使用 Linux 发行版的官方说明
* 使用 Systemd Init 时:
* 进入 Release 目录并编辑 Pcap_DNSProxy.service 文件,编辑完成后保存:
* WorkingDirectory= 项为程序所在目录的绝对路径
* ExecStart= 项为程序所在目录的绝对路径,并在最后加上程序的名称
* 在 root 权限下使用 ./Linux_Install.Systemd.sh 执行服务安装脚本,脚本所进行的操作:
* 将 Pcap_DNSProxy.service 服务控制脚本的所有者更改为 root
* 安装服务控制脚本到 /etc/systemd/system 目录中
* 尝试启动 Pcap_DNSProxy 服务,并显示执行操作后服务的状态
* 以后每次系统启动都将自动启动服务
* 更多 Systemd 服务控制的方法,参见各 Linux 发行版官方文档的说明
* 使用 System V Init 时:
* 进入 Release 目录并编辑 PcapDNSProxyService 文件,编辑完成后保存:
* NAME 项为程序的名称
* PATH 项为程序的绝对路径
* 在 root 权限下使用 ./Linux_Install.SysV.sh 执行服务安装脚本,脚本所进行的操作:
* 将 PcapDNSProxyService 服务控制脚本的所有者更改为 root
* 安装服务控制脚本到 /etc/init.d 目录中
* 尝试启动 PcapDNSProxyService 服务,并显示执行操作后服务的状态
* 以后每次系统启动都将自动运行脚本启动服务
* 可直接输入 sh PcapDNSProxyService 不带参数查询用法
* start - 启动服务
* stop - 停止服务
* force-reload/restart - 重启服务
* status - 服务状态,如果 PID 为空则服务未启动

阅读全文→