今天发现上不了中文维基百科(zh.wikipedia.org),用了 VPN 也上不了。ping 了一下,发现得到的 IP 和世界各地的不一样。应该是 DNS 污染的问题。
几年前有个叫 DNSCrypt 的工具,可以加密 DNS 查询,就是解决这种问题的。但已经好久不更新了,于是找找有没有新的继承者。顺着 github 的源码库找到一个叫做 dnscrypt-proxy 的项目一直在更新。试试用一下。
项目地址:
使用方法挺简单,下载了压缩包之后执行如下命令:
dnscrypt-proxy -R--install
然后把自己的 DNS 改成 127.0.0.1 就行。
但比较麻烦的是找到合适自己的 DNS 服务器,也就是命令里的 name
参数。这个项目的 DNS 服务器需要特殊的服务器程序才可以运作,因此要么自己搭,要么从公共的服务里找。
公共的 name
可以在压缩包里的 dnscrypt-resolvers.csv
找到。
列表里提供的 DNS 服务器不一定好用,因此写了一个 node.js 脚本找最快的。
var csv = require('csv');var fs = require('fs');var url = require('url');var ping = require('ping');var Promise = require('bluebird');var data = fs.readFileSync('dnscrypt-resolvers.csv').toString();csv.parse(data, function(err, data) { var filtered = []; data.forEach(function(record) { var name = record[0]; if (name === 'Name') { return; } var address = url.parse('http://' + record[10]).hostname; if (address.match(':')) { console.log('ipv6:', address); return; } console.log('ping:', name); filtered.push({ name: name, host: address }); }); var result = []; filtered.reduce(function(cur, next) { return cur.then(function() { return new Promise(function(resolve, reject) { // console.log('ping:', next.name); ping.promise.probe(next.host, { timeout: 1 }).then(function(res) { var output = res.output; var time = output.match(/time=(\d+)ms/i)[1]; console.log('name: %s, address: %s, time: %s', next.name, next.host, time); // console.log(res); result.push({name: next.name, host: next.host, time: time}); resolve(); }).catch(function() { console.log('timeout'); resolve(); });; }); }); }, Promise.resolve()).then(function() { result.sort(function(a, b) { return a.time - b.time; }); console.log(result); });});
找到最快的之后,用这个命令检查一下服务器支持的功能:
dnscrypt-proxy -R--test=0
根据自己的情况选合适的。
如果注重隐私要选服务器不记录日志的
讨厌被审查的要选有加密功能的
全部设置完成后,清下 DNS 缓存:
ipconfig /flushdns
之后就能上中文维基百科了,也不用 VPN,速度还可以。