@lniwn
2017-09-29T15:27:55.000000Z
字数 7012
阅读 5556
Linux
本教程基于梅林原版固件
下载分区工具MiniTool Partition,对U盘进行分区,如图,我分为两个区,3G的ext3用于安置Entware,剩余的ntfs格式,用于存储数据。
将格式化好的U盘插入路由器,然后就准备安装Entware了。
1) 清理/opt文件夹
一定要先清理/opt文件夹再安装,否则很可能会出现各种error。
rm -rf /opt
entware-setup.sh
没有出现任何error的话,就表示安装成功了,否则重新执行一遍上面的命令。
接下来就可以使用opkg仓库了:
opkg update
opkg list
在我的机器上执行结果如下:
由于opkg安装在tmp目录,重启之后就没有了,所以需要一个自动挂载脚本,使之重启生效,这里使用分区label来进行挂载。
1) 查看挂载路径df -h
这里需要挂载的路径为/tmp/mnt/entware
2) 生成脚本并永久写入nvram
cat << EOF > /tmp/script_usbmount.tmp
if [ \$1 = "/tmp/mnt/entware" ]
then
ln -sf \$1 /tmp/opt
/opt/etc/init.d/rc.unslung start
fi
EOF
nvram set script_usbmount="`cat /tmp/script_usbmount.tmp`"
cat << EOF > /tmp/script_usbumount.tmp
if [ \$1 = "/tmp/mnt/entware" ]
then
/opt/etc/init.d/rc.unslung stop
fi
EOF
nvram set script_usbumount="`cat /tmp/script_usbumount.tmp`"
nvram commit
reboot
记得使用实际的usb挂载路径替换/tmp/mnt/entware
dnscrypt-wrapper用于进行加密的dns查询,防止dns污染,其依赖libsodium和libevent2。
1) 安装autoconfig
apt-get install autoconf
2) 安装libsodium
cd ~
wget https://download.libsodium.org/libsodium/releases/libsodium-stable.tar.gz
tar xf libsodium-stable.tar.gz
cd libsodium-stable
CFLAGS="-O3 -fPIC" ./configure
make
make install
ldconfig
3) 安装libevent2
cd ~
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
tar xf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable
./configure --prefix=/usr
make
make install
echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
4) 安装dnscrypt-wrapper
cd ~
git clone --recursive git://github.com/Cofyc/dnscrypt-wrapper.git
cd dnscrypt-wrapper
make configure
./configure
make && make install
如果中间出错,请按照提示信息修改,然后删除dnscrypt-wrapper文件夹下的configure文件,再重新编译,否则会提示make: configure up to date
。
成功安装后,会出现如下信息
install -d -m 755 '/usr/local/bin'
install -p dnscrypt-wrapper '/usr/local/bin'
5) 生成密钥
生成密钥对
cd ~
mkdir dnskey
//新建一个目录来存放证书
cd dnskey
//生成提供商密钥对
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
然后创建启动脚本:
#!/bin/bash
dnscrypt-wrapper --resolver-address=8.8.8.8:53 --listen-address=0.0.0.0:5353 \
--provider-name=2.dnscrypt-cert.oaoa.me \
--crypt-secretkey-file=/home/lniwn/local/dnskey/ssl.key \
--provider-cert-file=/home/lniwn/local/dnskey/ssl.cert -d \
--logfile=/var/log/dnscrypt-wraper.log
以后则只需要使用 sh start-dnscrypt-wrapper.sh 就可以启动了。至于关闭嘛,使用命令“killall dnscrypt-wrapper”。
最后加入开机启动项
如果使用Ubuntu 16.10以上,可以参考这篇文章,接着直接在/etc/rc.local
中添加如下代码即可:
sh /home/lniwn/local/dnskey/start-dnscrypt-wrapper.sh
采用的传输方案是dnsmasq + dnsmasq-china-list + ss-tunnel(dnscrypt-proxy) + iptables + accelerated-china-ip + ss-redir
数据包流程:
常见问题可以参考这里
china_iptable.sh(开机启动):
#!/bin/sh
modprobe xt_set.ko
iptables -t nat -N SHADOWSOCKS
#Bypass LAN IP
#Bypass SS and Intranet IP
#iptables -t nat -A SHADOWSOCKS -d x.x.x.x -j RETURN # SS Server IP
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
#iptables -t nat -A OUTPUT -d x.x.x.x -j RETURN # SS Server IP
iptables -t nat -A OUTPUT -d 0.0.0.0/8 -j RETURN
iptables -t nat -A OUTPUT -d 10.0.0.0/8 -j RETURN
iptables -t nat -A OUTPUT -d 127.0.0.0/8 -j RETURN
iptables -t nat -A OUTPUT -d 169.254.0.0/16 -j RETURN
iptables -t nat -A OUTPUT -d 172.16.0.0/12 -j RETURN
iptables -t nat -A OUTPUT -d 192.168.0.0/16 -j RETURN
iptables -t nat -A OUTPUT -d 224.0.0.0/4 -j RETURN
iptables -t nat -A OUTPUT -d 240.0.0.0/4 -j RETURN
#CN IP load and bypass
ipset restore </jffs/configs/china_ipset.conf
iptables -t nat -A SHADOWSOCKS -m set --match-set china_ipset dst -j RETURN
iptables -t nat -A OUTPUT -m set --match-set china_ipset dst -j RETURN
#Redirect Other IP
iptables -t nat -A PREROUTING ! -p icmp -j SHADOWSOCKS
iptables -t nat -A OUTPUT ! -p icmp -j SHADOWSOCKS
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里去
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。
no-resolv
min-cache-ttl=600
#cache-size=1500 # cache-size=0表示禁用缓存功能
conf-dir=/jffs/configs/dnsmasq.d/,*.conf
server=/#/127.0.0.1#65053
第一次查询
第二次查询
第一次查询,需要去上游服务器查(dnscrypt-proxy或ss-tunnel),TTL 294,耗时201ms;第二次查询,缓存命中,TTL 596(min-cache-ttl参数生效),耗时2ms。
dnsmasq的上游服务器必须采用udp查询dns,否则不会进行缓存。
更多dnsmasq的参数说明,请参照man page。
okpg install lsof # 安装lsof工具
lsof -i :5353 # 查看端口号对应的pid 1078
ls -l /proc/1078/exe # 查看进程路径
service restart_dnsmasq
echo "export TZ=$(cat /etc/TZ)" >> /opt/etc/profile
opkg install fake-hwclock