之前看到有人分享通过dnsmasq的ipset功能简化流量重定向试了下发现很不错。这里分享一下。

使用ipset的主要优势在于直接将所有被污染的域名解析结果交给ipset,不需要动态维护IP列表,在路由上更智能。主要适用于访问和谐站点较少,或者较固定的人群。

本文默认为ar71xx平台,并使用openwrt trunk版本,请按照您的需要自行更改。

本文包括三个部分:

  1. 安装相应软件包
  2. 配置dnsmasq和ipset
  3. 【可选】使用pdnsd获取更优的解析结果。
  4. DEBUG

一、安装需要的软件包

需要从外部下载以后安装的:
shadowsocks:推荐从http://sourceforge.net/projects/openwrt-dist/files/shadowsocks-libev/ 下载。
·
我的做法是下载下来在本地用nginx建一个http服务器,然后在路由器上去wget。另外的普遍做法是用winscp直接上传到路由器,共参考选择。

开始安装:

opkg update //安装前必须更新包数据库缓存。
opkg install ipset iptables-mod-nat-extra
opkg install dnsmasq-full --force-overwrite //官方提供的dnsmasq-full提供了ipset相关 的功能,需要加后面的参数进行强制覆盖安装。

某些 版本ipset安装后会报类似下面的错误:

kmod: failed to insert /lib/modules/3.10.44/ip_set.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ip.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ipmac.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_port.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_ip.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_ipport.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_ipportip.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_ipportnet.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_net.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_netiface.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_netport.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_list_set.ko
kmod: failed to insert /lib/modules/3.10.44/xt_set.ko

需要重新启动以后ipset 才能正常使用。

这里假设你已经下好上文中的dnsmasq和shadowsocks并且进入了存放这两个文件的文件夹。

安装shadowsocks:

opkg install shadowsocks-libev-polarssl_1.4.5_ar71xx.ipk

新版本不需要处理libpolarssl的问题,老版本shadowsocks编译的时候链接的是libpolarssl.so.5,所以我们需要做一个libpolarssl.so.5软链接出来,否则shadowsocks不能启动且不会有任何报错。

ln -s /usr/lib/libpolarssl.so  /usr/lib/libpolarssl.so.5

同时你需要自行编辑下/etc/shadowsocks.json,把正确的shadowsocks服务器信息填进去。

另外因为我们需要用到的是ss-redir而不是ss-local。所以请用编辑器打开/etc/init.d/shadowsocks 然后把里面所有的ss-local全部换成ss-redir(一共两处),然后:

/etc/init.d/shadowsocks enable //让shadowsocks自动启动

考虑到之前ipset的问题。到这里我们先重启一下吧,咱们重启以后见 丷丷。

二、配置dnsmasq和ipset

我们先用ipset创建一个set,这里我创建的set名字为setmefree(没有逼格啊没有逼格),然后将这个set中所有IP均转发到shadowsocks(这里本机的shadowsocks监听的是默认的1080端口)。
建议将下面的命令写入 /etc/rc.local 。每次开机自动运行。

ipset -N setmefree iphash
iptables -t nat -A PREROUTING -p tcp -m set --match-set setmefree dst -j REDIRECT --to-port 1080

设置 dnsmasq 对某些域名使用opendns进行解析并且加入setmefree这个set:
为了保持配置文件整洁,建议在 /etc/dnsmasq.conf 最后加入:

conf-dir=/etc/dnsmasq.d

然后新建目录 /etc/dnsmasq.d ,在里面加入一个 conf,名字任选。譬如 /etc/dnsmasq.d/fuckgfw.conf , 下面是我的文件内容,你可以按自己需要整理自己的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#Google and Youtube
server=/.google.com/208.67.222.222#443
server=/.google.com.hk/208.67.222.222#443
server=/.gstatic.com/208.67.222.222#443
server=/.ggpht.com/208.67.222.222#443
server=/.google.com/208.67.222.222#443
server=/.google.com.hk/208.67.222.222#443
server=/.gstatic.com/208.67.222.222#443
server=/.ggpht.com/208.67.222.222#443
server=/.googleusercontent.com/208.67.222.222#443
server=/.appspot.com/208.67.222.222#443
server=/.googlecode.com/208.67.222.222#443
server=/.googleapis.com/208.67.222.222#443
server=/.gmail.com/208.67.222.222#443
server=/.google-analytics.com/208.67.222.222#443
server=/.youtube.com/208.67.222.222#443
server=/.googlevideo.com/208.67.222.222#443
server=/.youtube-nocookie.com/208.67.222.222#443
server=/.ytimg.com/208.67.222.222#443
server=/.blogspot.com/208.67.222.222#443
server=/.blogger.com/208.67.222.222#443
server=/.google.co.jp/208.67.222.222#443
server=/.google.co.uk/208.67.222.222#443

#FaceBook
server=/.facebook.com/208.67.222.222#443
server=/.thefacebook.com/208.67.222.222#443
server=/.facebook.net/208.67.222.222#443
server=/.fbcdn.net/208.67.222.222#443
server=/.akamaihd.net/208.67.222.222#443

#Twitter
server=/.twitter.com/208.67.222.222#443
server=/.t.co/208.67.222.222#443
server=/.bitly.com/208.67.222.222#443
server=/.twimg.com/208.67.222.222#443
server=/.tinypic.com/208.67.222.222#443
server=/.yfrog.com/208.67.222.222#443

#Dropbox
server=/.dropbox.com/208.67.222.222#443

#1024
server=/.t66y.com/208.67.222.222#443

#shadowsocks.org
server=/.shadowsocks.org/208.67.222.222#443

#btdigg
server=/.btdigg.org/208.67.222.222#443

#sf.net
server=/.sourceforge.net/208.67.222.222#443

#feedly
server=/.feedly.com/208.67.222.222#443

#github and fastly
server=/.github.com/208.67.222.222#443
server=/.fastly.com/208.67.222.222#443

#wikipedia
server=/.wikipedia.org/208.67.222.222#443
server=/.wikimedia.org/208.67.222.222#443
server=/.wiktionary.org/208.67.222.222#443

#xda
server=/.xda-developers.com/208.67.222.222#443

# Here Comes The ipset

#Google and Youtube
ipset=/.google.com/setmefree
ipset=/.google.com.hk/setmefree
ipset=/.gstatic.com/setmefree
ipset=/.ggpht.com/setmefree
ipset=/.googleusercontent.com/setmefree
ipset=/.appspot.com/setmefree
ipset=/.googlecode.com/setmefree
ipset=/.googleapis.com/setmefree
ipset=/.gmail.com/setmefree
ipset=/.google-analytics.com/setmefree
ipset=/.youtube.com/setmefree
ipset=/.googlevideo.com/setmefree
ipset=/.youtube-nocookie.com/setmefree
ipset=/.ytimg.com/setmefree
ipset=/.blogspot.com/setmefree
ipset=/.blogger.com/setmefree
ipset=/.google.co.jp/setmefree
ipset=/.google.co.uk/setmefree

#FaceBook
ipset=/.facebook.com/setmefree
ipset=/.thefacebook.com/setmefree
ipset=/.facebook.net/setmefree
ipset=/.fbcdn.net/setmefree
ipset=/.akamaihd.net/setmefree

#Twitter
ipset=/.twitter.com/setmefree
ipset=/.t.co/setmefree
ipset=/.bitly.com/setmefree
ipset=/.twimg.com/setmefree
ipset=/.tinypic.com/setmefree
ipset=/.yfrog.com/setmefree

#Dropbox
ipset=/.dropbox.com/setmefree

#1024
ipset=/.t66y.com/setmefree

#shadowsocks.org
ipset=/.shadowsocks.org/setmefree

#btdigg
ipset=/.btdigg.org/setmefree

#sf.net
ipset=/.sourceforge.net/setmefree

#feedly
ipset=/.feedly.com/setmefree

#github&fastly
ipset=/.github.com/setmefree
ipset=/.fastly.com/setmefree

#wikipedia
ipset=/.wikipedia.org/setmefree
ipset=/.wikimedia.org/setmefree
ipset=/.wiktionary.org/setmefree

#xda
ipset=/.xda-developers.com/setmefree

注意:

  1. 目前公共DNS有opendns监听非标准端口(443和5353),你也可以到这里查看由opennic提供的DNS:http://meo.ws/dnsrec.php (均监听以下端口54, 443, 1053, 1194, 5353, 8080,27015),当然你也可以自己建DNS服务器。关于DNS优化的讨论请参考下一节。
  2. 每条记录都需要跟一条ipset设置,不要忘了。

然后重启 dnsmasq:

/etc/init.d/dnsmasq restart

或者直接重新启动,顺便测试rc.local中的命令有没有成功运行。

三、【可选】使用pdnsd获取更优的解析结果。

注意:通过上面的配置您的openwrt穿墙已经应该正常了,下面仅作优化方面的讨论。

由于opendns是根据来源IP给出结果,导致的结果是直接在路由器上查询返回的是对应中国的IP,以youtube为例:

dig www.youtube.com @208.67.222.222 -p 443

给出的其中一个结果为:173.194.72.102,在VPS上ping(你应该能理解,所有过shadowsocks的流量事实上是由VPS中转的,所以我们测试的是VPS与该IP的连接情况)约33ms。而换用VPS当地的DNS可以将延迟降到1.45ms左右。个人认为还是很有意义的。当然其实如果不怕麻烦自建DNS是最好啦。

关于pdnsd的配置请参考上一篇

四、DEBUG

  1. 通过下面的命令查看set中的IP,这样可以确定解析是否正常,并且查看某网站是否正确的被加到了ipset:

    ipset list setmefree

通过下面的命令可以清理掉set中所有ip。更多的ipset用法请查看ipset help

ipset flush setmefree
  1. 以daemon模式运行shadowsocks前建议先试一下确保配置文件无误:

    ss-redir -c /etc/shadowsocks.json

更新记录:

2015年8月9日 修正一些说法,更新DNS配置文件。