感谢Xuebing Wang老师的厚爱,加入了他的team,对嵌入式设备kernel进行了修改,从中才知道国人其实在嵌入式内核方面其实走在了世界前列

蒙赐一个nanopi-neo的小设备,家里本来是用hp5315的设备进行翻墙的,由于内核太低,无法使用ipset。所以迫不得已,升级到nanopi-neo

说一下过程:

一、下载官方映像文件nanopi-neo_FriendlyCore-Xenial_4.14.0_20171218.img.zip

注意,必须是4.14内核的,而不能是3.4.39内核的,因为ipset在3.4.39里缺xt_set模块

二、烧进8G的TF卡,ssh登录

nanopi缺省是DHCP启动的,扫描整个网段

nmap -p22 --open 192.168.92.0/24  

得到机器的大概ip,然后ssh上去,root密码是fa

三、安装ipset并检验一下

apt install ipset  
ipset list  
modporbe xt_set  
lsmod  

四、安装dnscrypt-proxy

apt install dnscrypt-proxy  

注意,这里dnscrypt-proxy是监听在127.0.2.1:53端口的,我们改一下,方法比较古怪,因为实际是systemctl控制了监听端口,直接改/etc/default/dnscrypt-proxy是无效的!!!

export SYSTEMD_EDITOR="vi"  
systemctl edit dnscrypt-proxy.socket  
输入以下内容
[Socket]
ListenStream=  
ListenDatagram=  
ListenStream=127.0.0.1:5353  
ListenDatagram=127.0.0.1:5353  

改好后重启,缺省用的是cisco这个开放dns

五、安装shadowsocks-libev
shadowsocks-libev是用c写的,占内存小,效率高,在这么小的个设备上,必须用这个

apt-get install software-properties-common -y  
add-apt-repository ppa:max-c-lv/shadowsocks-libev -y  
apt-get update  

编辑/etc/config.json文件

 {
    "server":"your-ss-server ip",
    "server_port":9001,
    "local_port":1080,
    "password":"type this user's password",
    "timeout":60,
    "method":"aes-256-cfb"
 }

运行:

ss-redir -c /etc/config.json  

同时单独建立一个DNS解析的通道,监听到本地端口4321,通过vps来转发请求到google的8.8.8.8:53

ss-tunnel -s your-ss-server-ip -p 9001 -m aes-256-cfb -k password -b 127.0.0.1 -l 4321 -L 8.8.8.8:53 -u  

这样本地就有了两个DNS,一个是dnscrypt-proxy,监听到5353,一个ss-tunnel,监听到4321

为什么要建立两个DNS呢?按道理是应该用4321,因为必须考虑就近原则,通过ss通道访问国外网站时,应该以vps返回的查询结果为准,dnscrypt-proxy很可能地址定位偏移了。

六、修改dns-masq
运行dnsmasq|grep ipset确认支持ipset
然后到 https://github.com/felixonmars/dnsmasq-china-list
把4个国内加速的conf拷贝出来放到/etc/dnsmasq.d目录

accelerated-domains.china.conf  
apple.china.conf  
bogus-nxdomain.china.conf  
google.china.conf  

然后拿到国内ip地址的范围,没用啊,只是记录一下,说不定将来有用。

wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /etc/chinadns_chnroute.txt  

拿到https://zohead.com/downloads/dnsmasq.tar.gz

解压放到/etc/dnsmasq.d目录下

最终/etc/dnsmasq.conf的内容:

domain-needed  
bogus-priv  
no-resolv  
no-poll  
conf-dir=/etc/dnsmasq.d  
address=/tms.can.cibntv.net/0.0.0.0  
server=114.114.114.114  
dhcp-range=192.168.2.50,192.168.2.100,72h  
dhcp-option=3,192.168.2.2  
dhcp-option=6,192.168.2.2  
cache-size=10000  
min-cache-ttl=1800  

最主要的就是dnsmasq.tar.gz的内容:

server=/12bet.com/127.0.0.1#5353  
ipset=/12bet.com/gfwlist  

很清晰,这里确定了12bet.com走本地5353端口进行dns查询,并且访问的包标记到ipset链gfwlist中,当然这里最好是用4321的dns,会符合就近解析原则

重启dnsmasq就ok了

七、准备iptable

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

这样一切就ok了。

comments powered by Disqus