﻿Pcap_DNSProxy 项目的 GitHub 页面：
https://github.com/chengr28/Pcap_DNSProxy

Pcap_DNSProxy 项目的 Sourceforge 页面：
https://sourceforge.net/projects/pcap-dnsproxy


* 更多程序以及配置的详细情况，参见 ReadMe(..).txt


-------------------------------------------------------------------------------


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

1.准备程序编译环境：编译前需要使用包管理工具安装，或者需要自行编译和安装依赖库
  * 依赖工具/库列表：
    * 源代码编译器，必须完整支持 C++ 14 标准，可任选其一：
      * GCC/g++ 最低版本要求为 5.0
      * Clang/LLVM 最低版本要求为 3.4
    * CMake
    * LibEvent
    * LibPcap
      * 编译时如果剥离 LibPcap 的依赖则可跳过编译和安装下表的依赖库和工具，具体参见下文的介绍，不建议使用
    * Libsodium
      * 编译时如果剥离 Libsodium 的依赖则可跳过编译和安装下表的依赖库和工具，具体参见下文的介绍，不建议使用
    * OpenSSL
      * 编译时如果剥离 OpenSSL 的依赖则可跳过编译和安装下表的依赖库和工具，具体参见下文的介绍，不建议使用

2.编译 Pcap_DNSProxy 程序并配置程序属性
  * 使用终端进入 Source/Auxiliary/Scripts 目录，使用 chmod 755 CMake_Build.sh 使脚本获得执行权限
  * 使用 ./CMake_Build.sh 执行编译程序
    * 脚本所进行的操作：
      * CMake 将编译并在 Release 目录生成 Pcap_DNSProxy 程序
      * 从 ExampleConfig 目录和 Scripts 目录复制所需的脚本和默认配置文件到 Release 目录，并设置基本读写可执行权限
    * 添加参数 --enable-static 即 ./CMake_Build.sh --enable-static 可启用静态编译
  * 使用 ./CMake_Build.sh 脚本时可提供的参数：
    * 执行时使用 ./CMake_Build.sh --disable-libpcap --disable-libsodium --disable-tls 可剥离对对应库的依赖，不建议使用
    * 剥离后编译时将不再需要该库的支持，但同时将完全失去使用该库所支持的功能，且运行时将不会产生任何提示，慎用！

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

4.请按照下文 正常工作查看方法 一节，先对程序是否在正常工作进行测试再修改网络配置！

5.配置系统 DNS 服务器设置
  * 可参见 https://developers.google.com/speed/public-dns/docs/using 中 Changing your DNS servers settings 中 Linux 一节
  * 图形界面以 GNOME 3 为例：
    * 打开所有程序列表，并 -> 设置 - 硬件分类 - 网络
    * 如果要对当前的网络配置进行编辑 -> 单击齿轮按钮
    * 选中 IPv4
      * DNS 栏目中，将自动拨向关闭
      * 在服务器中填入 127.0.0.1 并应用
    * 选中 IPv6
      * DNS 栏目中，将自动拨向关闭
      * 在服务器中填入 ::1 并应用
    * 请务必确保只填入这两个地址，填入其它地址可能会导致系统选择其它 DNS 服务器绕过程序的代理
    * 重启网络连接
  * 直接修改系统文件修改 DNS 服务器设置：
    * 自动获取地址(DHCP)时：
      * 以 root 权限进入 /etc/dhcp 或 /etc/dhcp3 目录（视乎 dhclient.conf 文件位置）
      * 直接修改 dhclient.conf 文件，修改或添加 prepend domain-name-servers 一项即可
      * 如果 prepend domain-name-servers 一项被 # 注释则需要把注释去掉以使配置生效，不需要添加新的条目
      * dhclient.conf 文件可能存在多个 prepend domain-name-servers 项，是各个网络接口的配置项目，直接修改总的配置项目即可
      * 使用 service network(/networking) restart 或 ifdown/ifup 或 ifconfig stop/start 重启网络服务/网络端口
    * 非自动获取地址(DHCP)时：
      * 以 root 权限进入 /etc 目录
      * 直接修改 resolv.conf 文件里的 nameserver 即可
      * 如果重启后配置被覆盖，则需要修改或新建 /etc/resolvconf/resolv.conf.d 文件，内容和 resolv.conf 一样
      * 使用 service network(/networking) restart 或 ifdown/ifup 或 ifconfig stop/start 重启网络服务/网络端口


-------------------------------------------------------------------------------


重启服务方法：
* Systemd 部分：
  1.打开终端，使用 su 获得 root 权限
  2.使用 systemctl restart Pcap_DNSProxy 直接重启服务即可
  3.也可以先 systemctl stop Pcap_DNSProxy 停止服务，稍等一段时间再 systemctl start Pcap_DNSProxy 启动服务即可
* SysV 部分：
  1.打开终端，使用 su 获得 root 权限
  2.使用 service PcapDNSProxyService restart 直接重启服务即可
  3.也可以先 service PcapDNSProxyService stop 停止服务，稍等一段时间再 service PcapDNSProxyService start 启动服务即可


小更新的方法（需要以管理员身份进行，如果配置文件的 Version 有更新需要进行大更新）：
* Systemd 部分：
  1.打开终端，使用 su 获得 root 权限
  2.使用 systemctl stop Pcap_DNSProxy 停止服务
  3.将目录内的所有可执行文件删除
  4.将新版本的 Pcap_DNSProxy 的所有可执行文件解压到相同位置
  5.使用 systemctl start Pcap_DNSProxy 启动服务
* SysV 部分：
  1.打开终端，使用 su 获得 root 权限
  2.使用 service PcapDNSProxyService stop 停止服务
  3.将目录内的所有可执行文件删除
  4.将新版本的 Pcap_DNSProxy 的所有可执行文件解压到相同位置
  5.使用 service PcapDNSProxyService start 启动服务


大更新的方法（需要以管理员身份进行，切勿直接覆盖，否则可能会造成不可预料的错误）：
* Systemd 部分：
  1.打开终端，使用 su 获得 root 权限并进入 Release 目录内
  2.使用 ./Linux_Uninstall.Systemd.sh 执行服务卸载脚本
  3.备份所有配置文件，删除所有 Pcap_DNSProxy 相关文件
  4.按照安装方法重新部署 Pcap_DNSProxy
    * 进行第 4 步前先将备份的配置文件还原到 Release 目录内
    * Config.conf 文件建议按照备份的配置文件重新设置一次，如直接覆盖可能会导致没有新功能的选项
* SysV 部分：
  1.打开终端，使用 su 获得 root 权限并进入 Release 目录内
  2.使用 ./Linux_Uninstall.SysV.sh 执行服务卸载脚本
  3.备份所有配置文件，删除所有 Pcap_DNSProxy 相关文件
  4.按照安装方法重新部署 Pcap_DNSProxy
    * 进行第 4 步前先将备份的配置文件还原到 Release 目录内
    * Config.conf 文件建议按照备份的配置文件重新设置一次，如直接覆盖可能会导致没有新功能的选项


卸载方法：
* 由于不同的 Linux 发行版对系统服务和守护进程的处理方式不同，本节仅供参考
1.还原系统网络配置
2.以 root 权限进入 Release 目录，执行 ./Linux_Uninstall.Systemd.sh 或 ./Linux_Uninstall.SysV.sh
3.删除所有 Pcap_DNSProxy 相关文件


-------------------------------------------------------------------------------


正常工作查看方法：

1.打开终端
2.输入 dig @127.0.0.1 www.google.com 或者 dig @::1 www.google.com 并回车
3.运行结果应类似：

   >dig www.google.com
   ; (1 server found)
   ;; global options: +cmd
   ;; Got answer:
   ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ..
   ;; flags: ..; QUERY: .., ANSWER: .., AUTHORITY: .., ADDITIONAL: ..

   ;; QUESTION SECTION:
   ;www.google.com.            IN    A

   ;; ANSWER SECTION:
   ..

   ;; Query time: .. msec
   ;; SERVER: ::1#53(::1)（视所在网络环境而定，本地监听协议为 IPv4 时为 127.0.0.1）
   ;; WHEN: ..
   ;; MSG SIZE  rcvd: ..

4.如非以上结果，请移步 Linux 版 FAQ 文档中 运行结果分析 一节


-------------------------------------------------------------------------------


其它 Linux 发行版服务的说明：

* Linux Debian 系列：
  * 官方发行版 8.x 以及更新版本默认需要使用 Systemd 管理系统服务
* Linux Red Hat 和 openSUSE 系列：
  * 使用 chkconfig 管理系统服务
  * 参见 https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/s2-services-chkconfig.html
* 如果需要自己编写服务启动脚本，请注意 Pcap_DNSProxyService 服务需要在以下模块初始化之后才能正常使用，建议尽量将优先级降低，否则将生成错误报告并直接退出：
  * 需要在挂载所有文件系统后
  * 需要初始化系统日志后
  * 需要在启动网络服务以及网络设备器初始化完毕后
  * 需要在系统时间被设置后
  * 需要在本机名称被设置后
* 也可直接将本程序加入启动项中，注意必须以 root 权限启动否则无法打开本地监听端口
  * 程序内置了设置守护进程的代码，启动后不会阻塞系统的运行
