完全屬於我自己的Blog,運行在我的路由器H218N上.記錄著我想記錄的文字.

04月 27

用dnsforwarder排除DNS污染,加速Android源码下载

起源是要在android上运行sshfs,在Google Play 上有一个现成的,但是是收费软件,在国内买不了,虽然有各种途径可以买到,但是本着不折腾会死精神,在找到了这个项目android_external_sshfs,但是要有编译过cyanogenmod的环境才能编译出来.

然后就先折腾 cyanogenmod 编译吧.不搞不知道,一搞才发现掉大坑里了.新建了个Ubuntu 12.04虚拟机,在这里面搞,编译可以暂停了嘛(虚拟机休眠啊,快照什么的)~

按照Android的的文档搞好了准备环境,用 repo sync -j40 开始下载源码了.可以这下载速度啊...我是12M的宽带,40个并发啊,怎么速度只有几个KB/s啊.不带这样欺负新手的啊!!!!看来是伟大的墙又在发热发亮了.本来以为用goagent就能搞定了遂

export http_proxy="http://192.168.1.161:8087"
export https_proxy="http://192.168.1.161:8087"

可是没用啊,速度一点都没用提高...看来goagent不是万能的.

想起前段时间搞路由器自动翻*墙是用到的DNS解析软件dnsforwarder提供了强大的郁闷解析服务.
遂在虚拟机里

$ git clone https://github.com/holmium/dnsforwarder.git
$ cd dnsforwarder
$ ./configure
$ make -j4

configure没通过,装上各种dev库,
最后就报错了

dnsforwarder/missing: line 81: aclocal-1.14: command not found
WARNING: 'aclocal-1.14' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
make: *** [aclocal.m4] Error 127

貌似是autoconf的问题,直觉告诉这种库的错误不好搞.搞不好就把系统的库弄挂了.
转战到虚拟机的宿主,Mac OS X编译.
configure没问题,可能是缺了些什么库,编译的时候有问题了.
祭出Homebrew,不想搞乱整个系统的PATH变量

$ brew install gcc
$ export PATH=/usr/local/Cellar/gcc/4.8.2/bin:$PATH
$ cd /usr/local/Cellar/gcc/4.8.2/bin
$ ln -s gcc-4.8 gcc #g++ 神马的同样处理

重新configure后,编译就通过了,
加上 --enable-static再编译一次,就没有各种库依赖的问题.依赖库问题解决后再用XCode编译一次,发现编译出来的程序体积会小12%哦~

wiki找到默认配置文件,修改成如下

# DNS 转发器的配置文件
# Configure File for dnsforwarder
# 此配置文件最好是 ANSI 编码的

# 相对路径的写法
# Windows:
# 支持用 `% %' 包围起来的相对路径,比如 `%SYSTEMROOT%\System32\drivers\etc\hosts'。
# `%PROGRAMDIRECTORY%' 表示程序所在的文件夹。
# Linux:
# 支持类似 `${HOME}' 的变量,比如 `${HOME}\hosts'。
# `${PROGRAMDIRECTORY}' 表示程序的配置文件夹,一般为 `/root/.dnsforwarder/',执行 `dnsforwarder -p' 可以获得具体的位置。

##################################################
#
# 本地
#
##################################################

# LocalInterface <IP>
# 设置在本地开启的界面,可以是本地回环地址 (127.0.0.1) ,本地局域网,以及互联网 (since 2.2)
# 如果是 IPv6 地址,请在地址两端加上方括号,例如 [::1] (本地回环)、[fe80::699c:f79a:9bb6:1] (since 2.3)
LocalInterface 0.0.0.0

# LocalPort <NUM>
# 本地开启的端口 (since 2.2)
LocalPort 53

# OpenLocalTCP <BOOLEAN>
# 在本地开启TCP,以便接收TCP协议的查询 (since 2.2)
# 可选值:`false' 或 `true'
OpenLocalTCP false

##################################################
#
# IP 选择策略
#
##################################################

#########################
# 服务器地址
#########################

# 您可以设置两组上游服务器,
# 一组是用 TCP 协议的服务器 (由 `TCPServer' 指定),
# 另一组是用 UDP 协议的服务器 (由 `UDPServer' 指定)

# 选项 `PrimaryServer' 用来指定首选的服务器(同时也指定了协议)
# 任何不在排除列表 (或者 GFW List) 中的域都会优先通过首选服务器及其协议来查询,
# 在排除列表 (或者 GFW List) 中的域会优先使用另一组服务器并通过另一种协议查询。
# PrimaryServer
# 首选服务器 (since 2.2)
# 可选值:`TCP' 或 `UDP'
PrimaryServer UDP

# TCPServer <IP[:PORT]>
# 指定用 TCP 协议查询的上游服务器 (since 2.2)
# 可以指定多个服务器,服务器之间用半角逗号隔开 (since 2.3)
# 如果不加端口号,则默认为 53 (since 2.3)
# 例如 192.168.1.2:500 以及 4.2.2.2 (since 2.3)
# 对于IPv6地址,请在地址两端加方括号,例如 [2001:4860:4860::8888] 以及加端口的形式 [2001:4860:4860::8888]:53 (since 2.3)
TCPServer 8.8.4.4,8.8.8.8

# UDPServer <IP[:PORT]>
# 指定用 UDP 协议查询的上游服务器 (since 2.2)
# 可以指定多个服务器,服务器之间用半角逗号隔开 (since 2.3)
# 如果不加端口号,则默认为 53 (since 2.3)
# 例如 192.168.1.2:500 以及 4.2.2.2 (since 2.3)
# 对于IPv6地址,请在地址两端加方括号,例如 [2001:4860:4860::8888] 以及加端口的形式 [2001:4860:4860::8888]:53 (since 2.3)
UDPServer 208.67.220.220,8.8.8.8,114.114.115.115

# DedicatedServer <DOMAIN1 SERVER_IP1>,<DOMAIN2 SERVER_IP2>,...
# 为某些域名指定专门的查询服务器,而不使用服务器列表(`TCPServer' 和 `UDPServer')中的服务器 (since 2.5 b1)
# 格式为:域名 服务器地址
#
# 例如:DedicatedServer www.google.com 8.8.8.8
# 这样所有对域名 www.google.com 的查询都通过 8.8.8.8 这个服务器来进行
# 如果所指定的域名不在排除列表中,那么将通过 `PrimaryServer' 所指定的协议与服务器通讯,
# 否则将通过另一种协议与服务器通讯。
# 不同项之间用半角逗号 (`,') 分隔,同时注意最后不要有逗号
# 可以有多条 `DedicatedServer' 选项
DedicatedServer

#########################
# 服务器选项
#########################

# ParallelQuery <BOOLEAN>
# 是否启用 UDP 并发查询 (since 2.6 b1)
# 并发查询指的是,向所有指定的 UDP 服务器发送查询请求,取最先接受到的有效回复作为查询结果,并丢弃其余的回复
# 开启此选项必须保证 `UDPServer' 中的服务器都是 IPv4 或者都是 IPv6 的
# 此选项不影响 `DedicatedServer' 的设置,也就是说,对于已经指定专用服务器的域名,只通过专用服务器进行查询
# 可选值:`false' 或 `true'
ParallelQuery true

# UDPAntiPollution <BOOLEAN>
# 是否开启 UDP 防污染 (since 2.6 b1)
# “防污染”指的是过滤伪造的 DNS 数据包
# 开启时需要保证 `UDPServer' 中存在国外的 DNS 服务器,如果配合使用 `UDPBlock_IP' 选项将大大提高过滤的精确度
# 可选值:`false' 或 `true'
UDPAntiPollution true

# UDPBlock_IP <IP1>,<IP2>,.....
# 阻挡含有以下 IP 地址(只支持 IPv4 地址)的 UDP DNS 数据包 (since 2.6 b1)
# 仅对通过 UDP 服务器查询而来的 DNS 数据包有效
# 以下列表中已经含有部分伪造的 IP 地址,可以执行 `dnsforwarder -P' 来获取更多伪造的 IP 地址
# 如果 `UDPAntiPollution' 为 `false',此选项无效
UDPBlock_IP 1.1.1.1,118.5.49.6,128.121.126.139,141.101.114.4,141.101.115.4,159.106.121.75,159.24.3.173,169.132.13.103,188.5.4.96,189.163.17.5,190.93.244.4,190.93.245.4,190.93.246.4,190.93.247.4,192.67.198.6,197.4.4.12,198.105.254.11,202.106.1.2,202.181.7.85,203.161.230.171,203.98.7.65,207.12.88.98,208.56.31.43,209.145.54.50,209.220.30.174,209.36.73.33,209.85.229.138,211.94.66.147,213.169.251.35,216.221.188.182,216.234.179.13,23.89.5.60,243.185.187.30,243.185.187.39,249.129.46.48,253.157.14.165,255.255.255.255,31.13.68.8,31.13.68.16,31.13.68.33,31.13.68.49,31.13.70.1,31.13.70.17,37.61.54.158,4.36.66.178,46.82.174.68,49.2.123.56,54.76.135.1,59.24.3.173,64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,66.45.252.237,67.215.65.132,69.55.52.253,72.14.205.104,72.14.205.99,74.125.127.102,74.125.155.102,74.125.39.102,74.125.39.113,77.4.7.92,78.16.49.15,8.7.198.45,93.46.8.89

# IPSubstituting <IP1 IP'1>,<IP2 IP'2>,.....
# 替换 DNS 数据包中的 IP 地址(只支持 IPv4 地址) (since 5.0.1)
# 例如:
# IPSubstituting 127.0.0.1 1.2.0.127
# 的效果是把 DNS 数据包中所有的 127.0.0.1 地址替换为 1.0.0.127
# 仅替换通过服务器(TCP 和 UDP)查询而来的 DNS 数据包,对于缓存中和 Hosts 中的结果无效
# 多条替换项目用半角逗号 (`,') 分隔,也可以写多行 `IPSubstituting'
IPSubstituting

#########################
# 排除列表
#########################

# ExcludedDomain <DOMAIN1>,<DOMAIN2>,.....
# 排除列表,每个域之间用半角逗号 (`,') 分隔,同时注意最后不要有逗号 (since 2.2)
# 支持通配符。 (since 2.2.2)
# 一个项目如果不含通配符,则从域名尾部开始匹配,例如 `123.com' 则会匹配所有以 `123.com' 结尾的域名。
# 如果含通配符则严格按照通配符来匹配。
# 可以有多条 `ExcludedDomain' 选项 (since 2.2.2)
ExcludedDomain

# ExcludedList <PATH>
# 从文件载入到排除列表 (since 5.0.3)
ExcludedList 

# GfwList <STRING>
# 加载 GFW List (since 2.2.3)
# GFW List 中的域名将被添加到排除列表
# 如果保留为空,则不载入 GFW List
GfwList https://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt

# GfwListBase64Decode <BOOLEAN>
# GFW List 是否需要 Base64 解码
# 可选值:`false' 或 `true'
GfwListBase64Decode true

# GfwListUpdateInterval <NUM>
# 重新载入 GFW List 的间隔时间,秒 (since 2.2.4)
# -1 表示不重新载入
# 如果保留为空。则使用默认值 (21600)
GfwListUpdateInterval 21600

# GfwListRetryInterval <NUM>
# 当下载 GFW List 失败后的重试时间,秒 (since 2.2.4)
# 如果保留为空,则使用默认值 (30)
GfwListRetryInterval 30

# GfwListDownloadPath <PATH>
# GFW List 下载到本地文件的路径 (since 2.3)
# 支持相对路径 (since 5.0.3)
# 如果保留为空,则默认在与程序所在相同的文件夹内(Windows)或程序的配置文件夹内(Linux)
GfwListDownloadPath

#########################
# Hosts
#########################

# Hosts <PATH>
# Hosts 文件路径,可以是本地 Hosts 文件 (支持相对路径, since 5.0.3),也可以是网络上的 Hosts 文件 (以 http:// 或者 https:// 开头)。 (since 2.2)
# 例如 C:\Windows\System32\drivers\etc\hosts 或 /etc/hosts 或 http://xxx.com/hosts
# 在 Hosts 文件中,支持通配符 (`*' 和 `?') (只能在域名中出现通配符)
# 路径两头不要加引号
# Hosts 文件必须是原始格式,不能是压缩文件或者 HTML 文件
# Hosts 文件最好是 ANSI 编码的
# Hosts 中的 IPv6 地址不用加方括号
# 如果保留为空,则不从文件载入 Hosts
Hosts

# HostsUpdateInterval <NUM>
# 重新载入 Hosts 文件的间隔时间,秒 (since 2.2)
# -1 表示不重新载入
# 如果保留为空,则使用默认值 (18000)
HostsUpdateInterval 18000

# HostsDownloadPath <PATH>
# 当 Hosts 为网络 Hosts 时,Hosts 文件的下载到本地文件的路径 (不是文件夹路径) (since 2.2)
# 例如 C:\Windows\Temp\hosts 或者 /tmp/hosts
# 支持相对路径 (since 5.0.3)
# 如果文件存在则覆盖
# 对本地 Hosts 文件此选项无效
# 如果保留为空,则默认在与程序所在相同的文件夹内(Windows)或程序的配置文件夹内(Linux)
HostsDownloadPath

# HostsScript <PATH>
# 当 Hosts 为网络 Hosts 时,在每次下载完 Hosts 文件后、加载 Hosts 文件之前执行的脚本 (since 2.2)
# 支持相对路径 (since 5.0.3)
# 对本地 Hosts 文件此选项无效
# 如果保留为空,则不执行脚本
HostsScript

# HostsRetryInterval <NUM>
# 当网络 Hosts 下载失败后的重试时间,秒 (since 2.2.2)
# 仅对网络 Hosts 有效
# 如果保留为空,则使用默认值 (30)
HostsRetryInterval 30

# AppendHosts <HOSTS>,<HOSTS>,<HOSTS>,...
# 附加的 Hosts,即使 `Hosts' 选项为空也照样载入 (since 2.2.2)
# <HOSTS>的写法与文件中的一样,同样支持通配符
# IPv6 地址不用加方括号
# 多条 Hosts 可以用半角逗号分隔开,也可以写多条 `AppendHosts'
# 比如可以写成:
#  AppendHosts 127.0.0.1 123.com,127.0.0.1 456.com,1.2.3.4 foobar.*
# 也可以分多条写:
#  AppendHosts 127.0.0.1 123.com
#  AppendHosts 127.0.0.1 456.com
#  AppendHosts 1.2.3.4 foobar.*
#
# 也可以定义 CName 的 Hosts 项,例如:
#  AppendHosts www.google.cn *.google.com
# 这样所有匹配 *.google.com 的域名都将指向 www.google.cn 的 IP 地址 (since 2.3)
#
# 如果使某些域名跳过在 Hosts 中的查询,可以
#  AppendHosts @@ *.012345.com
# 这样所有匹配 *.012345.com 的域名都不会在 Hosts 中查询
#
# 各种 Hosts 的优先级从高到低
# 带 `@@' 的禁止项
# 一般 Hosts 项
# CName Hosts 项
AppendHosts 74.125.128.82 android.googlesource.com, 192.30.252.129 *.github.com ,192.30.252.129 github.com 

##################################################
#
# 缓存控制
#
##################################################

# UseCache <BOOLEAN>
# 是否使用缓存(默认为文件缓存) (since 2.2)
# 可选值:`false' 或 `true'
UseCache true

# CacheSize <NUM>
# 缓存大小 (字节)
# 缓存大小不能小于 102400 (100KB) (since 2.3)
CacheSize 1048576

# MemoryCache <BOOLEAN>
# 是否使用内存缓存,而不是文件缓存 (since 2.3.2)
# 可选值:`false' 或 `true'
MemoryCache true

# CacheFile <PATH>
# 手工指定缓存文件 (不是文件夹) (since 2.3)
# 支持相对路径 (since 5.0.3)
# 如果保留为空,则默认在与程序所在相同的文件夹内(Windows)或程序的配置文件夹内(Linux)
# 如果 `MemoryCache' 为 `true',此选项无效
CacheFile

# IgnoreTTL <BOOLEAN>
# 是否忽略 TTL (since 2.2)
# 可选值:`false' 或 `true'
# 为 `true' 时将忽略 TTL,此时所有的缓存条目将不会被移除
# 为 `false' 时不忽略 TTL,缓存条目将会按照 TTL 的时间来移除
# 当 `UseCache' 的值为 `false' 时,此选项无效
IgnoreTTL false

# OverrideTTL <NUM>
# 强制使所有缓存的条目的 TTL 为 <NUM> (since 2.2)
# 若 <NUM> 为 -1,则表示不进行强制
# 当 `UseCache' 的值为 `false' 时,此选项无效
OverrideTTL -1

# MultipleTTL <NUM>
# 将所有缓存条目的 TTL 加倍,倍数为 <NUM> (since 2.2)
# 当 `UseCache' 的值为 `false' 时,此选项无效
# 当 `IgnoreTTL' 的值为 `true' 时,此选项无效
MultipleTTL 1

# ReloadCache <BOOLEAN>
# 当程序启动后是否重新载入已有的文件缓存 (since 2.2.3)
# 已有的缓存大小必须和 `CacheSize' 所指定的大小相等
# 可选值:`false' 或 `true'
# 如果 `MemoryCache' 的值为 `true',此选项无效
ReloadCache false

# OverwriteCache <BOOLEAN>
# 如果已有的文件缓存无法重载,是否直接将其覆盖掉 (since 2.3)
# 可选值:`false' 或 `true'
# 如果 `MemoryCache' 的值为 `true',此选项无效
# 如果 `ReloadCache' 的值为 `false',此选项无效
OverwriteCache false

##################################################
#
# 杂项
#
##################################################

# DisabledType <NUM1>,<NUM2>,.....
# 禁止查询的 DNS 类型列表,每个类型(用数字代表)之间用半角逗号 (`,') 分隔 (since 2.2)
# 所有的 DNS 类型:
# A          1   IPv4 地址
# AAAA       28   IPv6 地址
# APL        42
# CERT       37
# CNAME       5
# DHCID      49
# DLV     32769
# DNAME      39
# DNSKEY     48
# DS         43
# HIP        55
# IPSECKEY   45
# KEY        25
# KX         36
# LOC        29
# MX         15
# NAPTR      35
# NS          2   Name Server
# NSEC       47
# NSEC3      50
# NSEC3PARAM 51
# PTR        12   Domain pointer
# RRSIG      46
# RP         17
# SIG        24
# SOA         6   start of authority record
# SPF        99
# SRV        33
# SSHFP      44
# TA      32768
# TKEY      249
# TSIG      250
# TXT        16
# ANY       255
# AXFR      252
# IXFR      251
# OPT        41
DisabledType

# DisabledDomain <DOMAIN1>,<DOMAIN2>,.....
# 禁止查询的域列表,每个域之间用半角逗号 (`,') 分隔 (since 2.2)
# 支持通配符。 (since 2.2.2)
# 一个项目如果不含通配符,则从域名尾部开始匹配,例如 `123.com' 则会匹配所有以 `123.com' 结尾的域名。
# 如果含通配符则严格按照通配符来匹配。
# 可以有多条DisabledDomain (since 2.2.2)
DisabledDomain

# DisabledList <PATH>
# 从文件载入到禁用列表 (since 5.0.3)
DisabledList 

# RefusingResponseCode <NUM>
# 当拒绝一次查询(`DisabledType' 或者 `DisabledDomain')的时候所返回的状态码 (since 2.6 b1)
# 参见 RFC 1035,`4.1.1. Header section format',`Response code'
RefusingResponseCode 0

# DomainStatistic <BOOLEAN>
# 是否启用域名统计 (since 2.5 b1)
# 可选值:`false' 或 `true'
DomainStatistic false

# StatisticUpdateInterval <NUM>
# 域名统计刷新时间间隔(秒) (since 2.5 b1)
StatisticUpdateInterval 29

放到~/.dnsforwarder/config ,启动DNS解析服务

$ sudo ./dnsforwarder -f ~/.dnsforwarder/config

为虚拟机解析了github.com
解析了github.com

进去虚拟机,把DNS服务器指到宿主机就OK了~看看这下载速度~爽歪歪了~
解析了github.com

标签:android, dns污染, Github

还不快抢沙发

添加新评论