Pages

Monday, 17 December 2018

基于 Google 的 DNS-over-HTTPS 加密域名解析服务器 HTTPS_DNS_PROXY

项目地址:
https://github.com/aarond10/https_dns_proxy
特色功能:
自从 Google 发布 DNS-Over-HTTPS 服务以来,其实有很多基于此服务写的程序,但是目前看起来这个项目实现的比较好:
C++ 实现,执行文件很小 (30kiB,静态编译的版本约为 900k),比大多数用 Go 写的小得多
基于 Curl HTTP/2 API , 解析延迟极小
单线程无阻塞式查询,适用于嵌入式系统如路由器等
最好作为 DNSMASQ 这样带缓存的 DNS 服务器上游.
由于 Google 这个服务支持 EDNS SUBNET 的查询,所以理论上通过这个服务器查询的结果不会有 CDN 的问题,当然实际还需时间来证明。
Usage: https_dns_proxy [-a ] [-p ]
[-e ] [-d] [-u ] [-g ] [-b ]
[-l ]
-a listen_addr 监听地址. (127.0.0.1)
-p listen_port 监听端口. (5053)
-e subnet_addr edns-client-subnet edns 子网 “203.31.0.0/16”. 建议通过路由器外网地址来计算()
-d 后台运行.
-u user 用户名. (nobody)
-g group 用户组. (nobody)
-b dns_servers 用来解析 dns.google.com 的域名服务器. (8.8.8.8,8.8.4.4)
-t proxy_server 代理服务器,例如: socks5://127.0.0.1:1080,http://127.0.0.1:8080 (注意上面 dns.google.com 的解析不通过此代理!)
-l logfile 日志文件. (-)
-v 开启调试信息. (INFO)
上面的 subnet_addr 可以通过一些命令行获取,例如:
$(nvram get wan_ipaddr | cut -d "." -f 1-2).0.0/16
如果是内网,则应该用:
curl -sS ifconfig.co | cut -d "." -f 1-2
或者
wget http://ipecho.net/plain -O - -q | cut -d "." -f 1-2
这个在 Tomatoware 上静态编译稍微有点麻烦:
1. 首先要编译 curl (及其库)支持 http2,这样用到 nghttp2:
  1. git clone https://github.com/tatsuhiro-t/nghttp2.git
  2. cd nghttp2
  3. autoreconf -i
  4. automake
  5. autoconf
  6. ./configure --prefix=/mmc
  7. make
  8. make install
2. 编译 curl :
  1. #!/bin/sh
  2.  
  3. [ ! -e ./curl.pem ] && wget -qO curl.pem https://curl.haxx.se/ca/cacert.pem
  4.  
  5. [ -n "$1" ] && ssVersion=$1 || ssVersion="git"
  6.  
  7. mkdir -p done/${ssVersion}/OpenSSL-opt
  8.  
  9. echo "Compiling OpenSSL Version..."
  10. make clean
  11. [ ! -e /opt/sbin/curl.pem ] && cp ./curl.pem /opt/sbin/
  12. ./configure --prefix=/mmc --with-ca-bundle=/opt/sbin/curl.pem --with-nghttp2
  13. --disable-ldap
  14. make -j2 LDFLAGS="-all-static -s" LIBS="-ldl"
  15. [ $? -eq 0 ] || { echo "Compiling OpenSSL failed."; exit 1; }
  16. make install
  17. mv -f src/curl done/${ssVersion}/OpenSSL-opt/
  18.  
  19. echo -e "Compile Result:n"
  20.  
  21. file done/${ssVersion}/OpenSSL-opt/curl
  22.  
  23. echo ""
  24.  
  25. done/${ssVersion}/OpenSSL-opt/curl -V
3. 静态编译 https_dns_proxy,修改过的 CMakeList.txt:
project(HttpsDnsProxy)
cmake_minimum_required(VERSION 2.8)
#set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_BUILD_TYPE "Release")
# set(CMAKE_C_FLAGS "-Wall --pedantic -Wno-strict-aliasing")
set(NXJSON_DIR lib/nxjson/)
set(NXJSON_SRC ${NXJSON_DIR}/nxjson.c)
find_path(LIBCARES_INCLUDE_DIR ares.h)
find_path(LIBCURL_INCLUDE_DIR curl/curl.h)
find_path(LIBEV_INCLUDE_DIR ev.h)
include_directories(
${LIBCARES_INCLUDE_DIR} ${LIBCURL_INCLUDE_DIR}
${LIBEV_INCLUDE_DIR} ${NXJSON_DIR} src)
# The main binary
set(TARGET_NAME "https_dns_proxy")
aux_source_directory(src SRC_LIST)
set(SRC_LIST ${SRC_LIST} ${NXJSON_SRC})
add_executable(${TARGET_NAME} ${SRC_LIST})
#set(LIBS ${LIBS} cares curl ev resolv ssl crypto dl z m)
set(LIBS ${LIBS} cares curl ev resolv ssh2 ssl psl crypto dl z m nghttp2)
target_link_libraries(${TARGET_NAME} ${LIBS})
# Link to static libraries if needed
IF(STATIC_LIB)
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s -static")
ENDIF(STATIC_LIB)
install(CODE "MESSAGE(\"Please install manually for now.\")")
然后:
mkdir b
cd b
cmake -DSTATIC_LIB=ON ..
make
file ./https_dns_proxy
./https_dns_proxy: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, stripped

No comments:

Post a Comment