都2019了,大部分网络协议都实现了加密,唯独DNS还在裸奔,下面是我使用过的实现方法,包括RFC标准和私有协议实现的,有些方法响应速度比较慢,基本不具备实用性的,就不列出来了
DNS-over-TLS
RFC标准,使用TLS协议来加密DNS报文,因为TLS有握手过程,响应速度中等,对网络质量要求比较高,个人条件下自己搭建需要企业级线路,成本较高,需要专用服务端及客户端来实现。可做为实现的有nginx/haproxy&bind9,Unbound,stunnel等开源项目,在使用了更为先进的TLS 1.3以及TCP Fast Open优化以后能近一步降低连接延时,因为大部分DNS-over-TLS服务器ip地址公开且使用特定端口,并且TLS1.2握手过程有特定特征,会被流量识别或探测到。
DNS-over-HTTPS
RFC标准,使用HTTPS(也就是HTTP-over-TLS)协议来封装DNS报文,从加密的角度来说本质上和DNS-over-TLS其实没有什么不同,响应速度中等,对网络质量要求同样比较高
Android 9以及主流浏览器(chrome&firefox)能直接支持DNS-over-HTTPS,如果做为系统层面上的实现,同样需要专用的服务端及客户端,虽然https协议被广泛使用,但如果探测包发送GET请求,响应为JSON编码的DNS解析,依然会被立刻封锁。
DNS-over-VPN-Tunnel
通过VPN Tunnel配合ip策略路由实现,首先需要在网络中的网关建立VPN Tunnel,比如OpenVPN,OCServ,Tinc等,并定义不使用远程网关,定义好对应table的default网关以后
使用ip策略路由ip rule add to 8.8.8.8 table vpn,这样只要是访问目标是8.8.8.8的报文就会通过VPN Tunnel,优点响应速度快,几乎和不加密的原生速度一样,
也不需要专用服务端及客户端,缺点,需要网关权限,整个DNS解析过程在网络中只有一部分是加密的,配置繁琐,需要搭建VPN服务器,完美实现需要一定的shell脚本编程能力
比如对VPN的连接监视断线重连等。
ss-tunnel
ss-tunnel是shadowsocks-libev里的一个组件,转发本地的DNS请求通过shadowsocks代理,优点响应速度快,配置方便简单,缺点是在网络中只有一部分是加密的,并且为私有协议。
/usr/bin/ss-tunnel -c /etc/shadowsocks.json -l 53 -L 8.8.8.8:53 -u
监听本地的53端口,远端DNS为8.8.8.8:53
没有评论:
发表评论