显示标签为“DNS”的博文。显示所有博文
显示标签为“DNS”的博文。显示所有博文

2019年12月28日星期六

在路由器上定时预解析DNS,解决加密DNS(DNS-over-TLS)解析时间长的问题

下载地址

预备条件

  • Perl 5 
  • dnsmasq

使用方法

  1. 修改/etc/dnsmasq.conf,添加以下几行以启用日志记录功能,并把DNS解析最短过期时间调整为1小时
    log-async=20
    log-queries
    log-facility=/var/log/dnsmasq.log

    min-cache-ttl=3600

  2. get_popular_websites.pl, prefetch_domains.pl, env_var三个文件下载到路由器上,一般放在/usr/bin文件夹。
  3. 修改/etc/crond/root,将cron文件的内容添加到末尾。

原理与细节

通过定时提取dnsmasq的日志文件,统计每个域名的解析次数。大于ceil(exp($today/10 + 1))即把该域名作为经常访问的域名,并加入预解析名单。其中$today为当天的日数

解决OpenWRT上搭建PPTP服务器,Android客户端无DNS解析的问题

问题出在dnsmasq的设置上。在LuCI管理界面DHCP and DNS设置里,找到







2017年10月30日星期一

解决自编译pdnsd在Padavan下无法将缓存保存到硬盘上的问题

最近为了IPV6 DNS的需求自己编译了一份pdnsd,thread-lib选择的是NPTL。发现在Padavan下出现了无法保存缓存到硬盘上的问题,结合帮助文档以为是NPTL的问题,遂换成LinuxThread重新编译,结果照旧。
于是分析pdnsd的源代码,首先从处理缓存的cache.c源代码入手,找到read_disk_cache()函数,发现如下代码:
  if(memcmp(buf,cachverid,sizeof(cachverid))) {
   log_warn("Cache file %s ignored because of incompatible version identifier",path);
   goto free_data_fclose;
  }
结合日志中出现了这样一条错误信息,初步认为是pdnsd.cache文件开头少了“pd13”,加上后,查看除错日志,没有报错,但仍旧无法保存。
继续研究代码,发现write_disk_cache()函数,这个函数实现了把缓存写入硬盘的功能。回到main.c,来到这行代码:

 if(sig) DEBUG_MSG("Signal %i caught.\n",sig);
 write_disk_cache();

这个函数被执行的条件是sig不等于0。突然想起平时结束进程用的都是 kill -9(强制终止),怀疑是进程没有接收到信号就被终止了。于是将9改成15,果然缓存能够保存到硬盘上了。

2016年12月9日星期五

改变路由器DNS服务端口而不影响对内网正常DNS服务的方法

  在“绕过校园网无线认证,实现免账号上网”一文中,有一个步骤为设置OpenVPN端口为53。而我们知道,DNS服务器的端口也是53。如果不改变DNS服务器的端口,就无法将OpenVPN的端口成功设置为53。然而在修改dnsmasq配置文件将DNS服务端口改为5353后,内网无法正常解析DNS,因为没有做对应的端口映射。
  只需下面两条命令,即可让内网机器正常解析DNS。其中5353为修改后的DNS端口,192.168.1.1为路由器的IP地址。
iptables -t nat -A PREROUTING -d 192.168.1.1 -p udp --dport 53 -j DNAT --to 192.168.1.1:5353
iptables -t nat -A PREROUTING -d 192.168.1.1 -p tcp --dport 53 -j DNAT --to 192.168.1.1:5353