[关闭]
@lniwn 2017-09-29T15:27:55.000000Z 字数 7012 阅读 5556

ASUS RT-AC1900P折腾笔记

Linux


本教程基于梅林原版固件

U盘准备

下载分区工具MiniTool Partition,对U盘进行分区,如图,我分为两个区,3G的ext3用于安置Entware,剩余的ntfs格式,用于存储数据。
QQ截图20170918225353.png-101.7kB

安装Entware

将格式化好的U盘插入路由器,然后就准备安装Entware了。
1) 清理/opt文件夹
一定要先清理/opt文件夹再安装,否则很可能会出现各种error。

  1. rm -rf /opt
  2. entware-setup.sh

image.png-22.3kB
没有出现任何error的话,就表示安装成功了,否则重新执行一遍上面的命令。
接下来就可以使用opkg仓库了:

  1. opkg update
  2. opkg list

在我的机器上执行结果如下:
image.png-19kB

自动挂载优盘

由于opkg安装在tmp目录,重启之后就没有了,所以需要一个自动挂载脚本,使之重启生效,这里使用分区label来进行挂载。
1) 查看挂载路径df -h
image.png-18.1kB
这里需要挂载的路径为/tmp/mnt/entware
2) 生成脚本并永久写入nvram

  1. cat << EOF > /tmp/script_usbmount.tmp
  2. if [ \$1 = "/tmp/mnt/entware" ]
  3. then
  4. ln -sf \$1 /tmp/opt
  5. /opt/etc/init.d/rc.unslung start
  6. fi
  7. EOF
  8. nvram set script_usbmount="`cat /tmp/script_usbmount.tmp`"
  9. cat << EOF > /tmp/script_usbumount.tmp
  10. if [ \$1 = "/tmp/mnt/entware" ]
  11. then
  12. /opt/etc/init.d/rc.unslung stop
  13. fi
  14. EOF
  15. nvram set script_usbumount="`cat /tmp/script_usbumount.tmp`"
  16. nvram commit
  17. reboot

记得使用实际的usb挂载路径替换/tmp/mnt/entware

Server端编译dnscrypt-wrapper

dnscrypt-wrapper用于进行加密的dns查询,防止dns污染,其依赖libsodiumlibevent2
1) 安装autoconfig
apt-get install autoconf

2) 安装libsodium

  1. cd ~
  2. wget https://download.libsodium.org/libsodium/releases/libsodium-stable.tar.gz
  3. tar xf libsodium-stable.tar.gz
  4. cd libsodium-stable
  5. CFLAGS="-O3 -fPIC" ./configure
  6. make
  7. make install
  8. ldconfig

3) 安装libevent2

  1. cd ~
  2. wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
  3. tar xf libevent-2.1.8-stable.tar.gz
  4. cd libevent-2.1.8-stable
  5. ./configure --prefix=/usr
  6. make
  7. make install
  8. echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
  9. ldconfig

4) 安装dnscrypt-wrapper

  1. cd ~
  2. git clone --recursive git://github.com/Cofyc/dnscrypt-wrapper.git
  3. cd dnscrypt-wrapper
  4. make configure
  5. ./configure
  6. make && make install

如果中间出错,请按照提示信息修改,然后删除dnscrypt-wrapper文件夹下的configure文件,再重新编译,否则会提示make: configure up to date
成功安装后,会出现如下信息

  1. install -d -m 755 '/usr/local/bin'
  2. install -p dnscrypt-wrapper '/usr/local/bin'

5) 生成密钥

生成密钥对

  1. cd ~
  2. mkdir dnskey
  3. //新建一个目录来存放证书
  4. cd dnskey
  5. //生成提供商密钥对
  6. dnscrypt-wrapper --gen-provider-keypair

执行之后,在当前目录下会生成public.key和secret.key文件,确保secret.key文件安全地备份存储好。这里系统会反馈一个指纹信息"provider-key",这个信息就是客户端配置时候需要的“provider_public_key”!所以一定要保存好,类似这个样子:
4298:5F65:C295:DFAE:2BFB:20AD:5C47:F565:78EB:2404:EF83:198C:85DB:68F1:3E33:E952
如果你忘记了Provider public key,可以通过public.key来找回:
dnscrypt-wrapper --show-provider-publickey --provider-publickey-file ./public.key

然后生成用来加密DNS请求的crypt key和证书文件,证书是有期限的,默认是365天:

dnscrypt-wrapper --gen-crypt-keypair --crypt-secretkey-file=./ssl.key

接着用上面的ssl.key密钥对生成预签名证书:

dnscrypt-wrapper --gen-cert-file --crypt-secretkey-file=./ssl.key --provider-publickey-file=./public.key --provider-secretkey-file=./secret.key --cert-file-expire-days=365 --provider-cert-file=ssl.cert
然后在当前目录下就得到了ssl.cert证书文件。

简单解析下参数,–gen-cert-file表示要生成证书文件,然后生产证书文件需要提供前面生成的crypt key,就用–crypt-secretkey-file=./ssl.key,还需要前面生成的public.key和 secret.key文件,所以用–provider-publickey-file=./public.key –provider-secretkey-file=./secret.key指定,最后–cert-file-expire-days这个参数是可选的,指定证书的过期时间,默认是365天过期,然后–provider-cert-file=这个指定证书的保存路径。

这里值得注意的是,图中还有写record for XXX,这是给你做DNS记录的,这个可做可不做,如果你做域名的TXT记录的话,首先你要有个域名,然后增加2.dnscrypt-cert.yourdomain.com的TXT记录为图中的二进制证书内容,那么得到的效果是,启动dnscrypt-wrapper不必附带–provider-cert-file=XXX这个选项去指定证书文件,因为程序会会通过 provider-name 从 DNS 的TXT记录获取证书。

不过,一般情况下这个证书字符串太长了,很多dns解析商一般不允许设置这么长的字符串……当然你也可以搭建本地dns服务器来储存这玩意……但是因为dnscrypt-wrapper有–provider-cert-file=XXX的命令手动指定证书文件,所以这步不是必须的。当然如果可以通过域名来读取证书,那么在部署这个服务的时候会方便很多,以及证书的更新也方便很多。

经过上面的步骤应该生成了以下的文件:
public.key secret.key ssl.cert ssl.key

然后创建启动脚本:

  1. #!/bin/bash
  2. dnscrypt-wrapper --resolver-address=8.8.8.8:53 --listen-address=0.0.0.0:5353 \
  3. --provider-name=2.dnscrypt-cert.oaoa.me \
  4. --crypt-secretkey-file=/home/lniwn/local/dnskey/ssl.key \
  5. --provider-cert-file=/home/lniwn/local/dnskey/ssl.cert -d \
  6. --logfile=/var/log/dnscrypt-wraper.log

以后则只需要使用 sh start-dnscrypt-wrapper.sh 就可以启动了。至于关闭嘛,使用命令“killall dnscrypt-wrapper”。

最后加入开机启动项

如果使用Ubuntu 16.10以上,可以参考这篇文章,接着直接在/etc/rc.local中添加如下代码即可:

  1. sh /home/lniwn/local/dnskey/start-dnscrypt-wrapper.sh

安装SS

采用的传输方案是dnsmasq + dnsmasq-china-list + ss-tunnel(dnscrypt-proxy) + iptables + accelerated-china-ip + ss-redir
数据包流程:
image.png-67.9kB
常见问题可以参考这里
china_iptable.sh(开机启动):

  1. #!/bin/sh
  2. modprobe xt_set.ko
  3. iptables -t nat -N SHADOWSOCKS
  4. #Bypass LAN IP
  5. #Bypass SS and Intranet IP
  6. #iptables -t nat -A SHADOWSOCKS -d x.x.x.x -j RETURN # SS Server IP
  7. iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
  8. iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
  9. iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
  10. iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
  11. iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
  12. iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
  13. iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
  14. iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
  15. #iptables -t nat -A OUTPUT -d x.x.x.x -j RETURN # SS Server IP
  16. iptables -t nat -A OUTPUT -d 0.0.0.0/8 -j RETURN
  17. iptables -t nat -A OUTPUT -d 10.0.0.0/8 -j RETURN
  18. iptables -t nat -A OUTPUT -d 127.0.0.0/8 -j RETURN
  19. iptables -t nat -A OUTPUT -d 169.254.0.0/16 -j RETURN
  20. iptables -t nat -A OUTPUT -d 172.16.0.0/12 -j RETURN
  21. iptables -t nat -A OUTPUT -d 192.168.0.0/16 -j RETURN
  22. iptables -t nat -A OUTPUT -d 224.0.0.0/4 -j RETURN
  23. iptables -t nat -A OUTPUT -d 240.0.0.0/4 -j RETURN
  24. #CN IP load and bypass
  25. ipset restore </jffs/configs/china_ipset.conf
  26. iptables -t nat -A SHADOWSOCKS -m set --match-set china_ipset dst -j RETURN
  27. iptables -t nat -A OUTPUT -m set --match-set china_ipset dst -j RETURN
  28. #Redirect Other IP
  29. iptables -t nat -A PREROUTING ! -p icmp -j SHADOWSOCKS
  30. iptables -t nat -A OUTPUT ! -p icmp -j SHADOWSOCKS
  31. iptables -t nat -A SHADOWSOCKS ! -p icmp -j REDIRECT --to-ports 1080

china_ipset_init.sh(手动执行一次即可)

路由器自身流量不能翻墙解决方案

你好,是这样的,merlin改版固件的ss经历了太多的变化,去年为了给ss加上状态检测,需要路由器本身具有出墙能力,所以加了iptables -t nat -A OUTPUT -p tcp -j REDSOCKS2来着,但是这样一个很大的问题就是路由器所有外网访问都出墙了,遇到很多各种问题(具体什么问题我也记不得了,不过当时有人反对这么做),最后没办法,就限制了出墙范围,改成了这样iptables -t nat -A OUTPUT -p tcp -m set $MATCH_SET router dst -j REDIRECT --to-ports 1089,这样就只有/koolshare/ss/redchn/output.conf里的域名,就是router itself,路由器才会由ss去访问。
如果你需要用到entware官方源,可以把pkg.entware.net按照格式加到文件/koolshare/ss/redchn/output.conf里去

DNS加速

  1. ipset=/yahoo.com/google.com/vpn,search

这一行是指将yahoo.com和google.com的域名解析IP结果存储到vpn和search的ipset结果中,准备交给iptables识别和转发。
对白名单域名进行转发sudo iptables -t nat -I PREROUTING -m set --match-set 列表名 dst -j REDIRECT --to-ports 1080
当然,如果你是黑名单可以做DROP或者RETURN处理sudo iptables -t nat -I PREROUTING -m set --match-set 列表名 dst -j RETURN
如果IP集合不是目标地址而是原地址,可以把dst换成src。

  1. no-resolv
  2. min-cache-ttl=600
  3. #cache-size=1500 # cache-size=0表示禁用缓存功能
  4. conf-dir=/jffs/configs/dnsmasq.d/,*.conf
  5. server=/#/127.0.0.1#65053

第一次查询
image.png-52.5kB
第二次查询
image.png-54.7kB
第一次查询,需要去上游服务器查(dnscrypt-proxy或ss-tunnel),TTL 294,耗时201ms;第二次查询,缓存命中,TTL 596(min-cache-ttl参数生效),耗时2ms。
dnsmasq的上游服务器必须采用udp查询dns,否则不会进行缓存。
更多dnsmasq的参数说明,请参照man page

Merlin常用命令

  1. okpg install lsof # 安装lsof工具
  2. lsof -i :5353 # 查看端口号对应的pid 1078
  3. ls -l /proc/1078/exe # 查看进程路径

参考链接

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注