分类: 其他

SSR GFW模式元老级bug定位

SSR GFW模式元老级bug定位无评论

2017年11月30日 at 下午4:32分类:其他 阅读: 1,164 次

GFW一般采用ipset来实现,将GFW中的域名列表所对应的IP地址设置成一个集合,然后将这个集合发给代理。

这个过程详细流程如下:
1、计算机访问gfw列表网站
2、路由器的dnsmasq收到请求后进行域名解析
3、在路由器上通过dnsmasq的配置规则将域名解析发给pdnsd进行域名解析,避免域名污染
server=/.google.com/127.0.0.1#5353
ipset=/.google.com/ssr
4、解析后的IP自动加入名为ssr的ipset集合
5、ssr设置防火墙规则,将ssr集合转给代理处理
REDIRECT tcp -- anywhere anywhere match-set ssr dst redir ports 1234

目前的问题:
一、ssr和广告屏蔽列表模式冲突
广告屏蔽列表模式也使用了ipset,列表中有些网站和gfw网站重复
ipset=/www.google.com/adblock
这样当用户访问www.google.com时,解析后的IP加入了adblock,并没有加入ssr,导致出现失败
dnsmasq开启--log-queries参数后的显示:
Thu Nov 30 15:32:20 2017 daemon.warn dnsmasq-dhcp[17710]: DHCP packet received on eth1 which has no address
Thu Nov 30 15:32:31 2017 daemon.info dnsmasq[17710]: query[A] www.google.com from 192.168.1.155
Thu Nov 30 15:32:31 2017 daemon.info dnsmasq[17710]: forwarded www.google.com to 127.0.0.1
Thu Nov 30 15:32:31 2017 daemon.info dnsmasq[17710]: ipset add adblock 216.58.200.36 www.google.com
Thu Nov 30 15:32:31 2017 daemon.info dnsmasq[17710]: reply www.google.com is 216.58.200.36
被adblock截胡了。
解决方法:将adblock.conf与gfw列表重复的网站删除

二、dnsmasq缓存问题
用户发起的dns请求,dnsmasq会进行缓存,如果ssr不是从开机启动,那么有可能出现,用户访问google,dnsmasq直接返回缓存中的IP地址,而不会再一次进行域名解析,自然也不会加入ipset
Thu Nov 30 16:18:44 2017 daemon.info dnsmasq[8337]: query[A] www.google.com from 192.168.1.155
Thu Nov 30 16:18:44 2017 daemon.info dnsmasq[8337]: cached www.google.com is 216.58.200.36
Thu Nov 30 16:19:40 2017 daemon.info dnsmasq[8337]: query[A] www.youtube.com from 192.168.1.155
Thu Nov 30 16:19:40 2017 daemon.info dnsmasq[8337]: cached www.youtube.com is
Thu Nov 30 16:19:40 2017 daemon.info dnsmasq[8337]: cached youtube-ui.l.google.com is
Thu Nov 30 16:19:40 2017 daemon.info dnsmasq[8337]: cached youtube-ui-china.l.google.com is 74.125.203.101
Thu Nov 30 16:19:40 2017 daemon.info dnsmasq[8337]: cached youtube-ui-china.l.google.com is 74.125.203.139
Thu Nov 30 16:19:40 2017 daemon.info dnsmasq[8337]: cached youtube-ui-china.l.google.com is 74.125.203.113
Thu Nov 30 16:19:40 2017 daemon.info dnsmasq[8337]: cached youtube-ui-china.l.google.com is 74.125.203.100
Thu Nov 30 16:19:40 2017 daemon.info dnsmasq[8337]: cached youtube-ui-china.l.google.com is 74.125.203.138
Thu Nov 30 16:19:40 2017 daemon.info dnsmasq[8337]: cached youtube-ui-china.l.google.com is 74.125.203.102
这时只要把dnsmasq重新复位,就可以再次进行域名解析并加入ipset:
Thu Nov 30 16:35:58 2017 daemon.info dnsmasq[17436]: query[A] www.google.com from 192.168.1.155
Thu Nov 30 16:35:58 2017 daemon.info dnsmasq[17436]: forwarded www.google.com to 127.0.0.1
Thu Nov 30 16:35:58 2017 daemon.info dnsmasq[17436]: ipset add ssr 216.58.200.36 www.google.com
Thu Nov 30 16:35:58 2017 daemon.info dnsmasq[17436]: reply www.google.com is 216.58.200.36
解决方法:
每次启动ssr时重启dnsmasq

但是,如果你的计算机是在二级路由或多级路由器以下,而ssr在出口路由器,如果你复位了出口路由器,下级的dns缓存并不会更新,计算机发出的dns请求也不会转发给出口路由器,GFW模式自然也会失效,这种情况下,只能复位二级或多级路由器或重启路由器上的dnsmasq才能使GFW模式重新生效。

三、用户计算机dns缓存问题
用户计算机中也有dns缓存,比如你访问过google,进行过域名解析,计算机会将域名和IP的对应关系保存,下一次再访问时,就不需要再进行域名解析。
如果计算机缓存后再启动ssr,此时访问google,由于没有域名解析过程,google对应的ip地址并没有加入ipset,也不会转发给代理处理,自然也无法访问,这种情况下只有重启计算机或者在计算机上命令行执行:
ipconfig/flushdns

这种情况下如果找到一种路由器通知计算机自动清理dns缓存的操作,那就可以做到用户无感知

目前暂时未找到好的方法解决,因此如果你重启了路由器或者重启了ssr或广告屏蔽服务,出现无法使用时,请复位计算机或手机,或者清除dns缓存!

交叉编译最新版本shadowsocks for ARM

交叉编译最新版本shadowsocks for ARM有1条评论

2017年11月23日 at 下午7:53分类:其他 阅读: 228 次

配置环境变量
export PATH=$PATH:/opt/ac1200g/asuswrt/release/src-rt-9.x/src/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin
export STAGING_DIR=/opt/ac1200g/asuswrt/release/src-rt-9.x/src/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/ac1200g/asuswrt/release/src-rt-9.x/src/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3/lib
export CC=arm-uclibc-linux-2.6.36-gcc
export CXX=arm-uclibc-linux-2.6.36-g++
export AR=arm-uclibc-linux-2.6.36-ar
export RANLIB=arm-uclibc-linux-2.6.36-ranlib
编译根目录
/home/yushi/ss
编译后存放位置
/home/yushi/ss/oss
最后编译文件在:
/home/yushi/ss/oss/shadowsocks-libev/bin

1、编译 libsodium
ver=1.0.12
wget --no-check-certificate https://download.libsodium.org/libsodium/releases/libsodium-$ver.tar.gz
tar zxf libsodium-$ver.tar.gz
cd libsodium-$ver
./configure --host=arm-linux --prefix=/home/yushi/ss/oss/libsodium --disable-ssp --disable-shared
make && make install

2、编译 libev

ver=4.24
wget http://dist.schmorp.de/libev/libev-$ver.tar.gz
tar zxf libev-$ver.tar.gz
cd libev-$ver
./configure --host=arm-linux --prefix=/home/yushi/ss/oss/libev --disable-shared
make && make install

3、编译 libudns

git clone https://github.com/shadowsocks/libudns
cd libudns
./autogen.sh
./configure --host=arm-linux --prefix=/home/yushi/ss/oss/libudns
make && make install

4、编译 pcre

ver=8.40
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-$ver.tar.gz
tar zxf pcre-$ver.tar.gz
cd pcre-$ver
./configure --host=arm-linux --prefix=/home/yushi/ss/oss/pcre --disable-shared --enable-utf8 --enable-unicode-properties
make && make install

5、编译 mbedTLS

ver=2.4.0
wget --no-check-certificate https://tls.mbed.org/download/mbedtls-$ver-gpl.tgz
tar zxf mbedtls-$ver-gpl.tgz
cd mbedtls-$ver
sed -i "s/DESTDIR=\/usr\/local/DESTDIR=\/home\/yushi\/ss\/oss\/mbedtls/g" Makefile
CC=arm-linux-gcc AR=arm-linux-ar LD=arm-linux-ld LDFLAGS=-static make install

6、编译c-ares
wget --no-check-certificate https://c-ares.haxx.se/download/c-ares-1.13.0.tar.gz
tar -xzvf c-ares-1.13.0.tar.gz
cd c-ares-1.13.0
./configure LDFLAGS=-static --host=arm-linux-gnueabi --prefix=/home/yushi/ss/oss/ares
make && make install

7、编译 shadowsocks-libev

ver=3.0.2
git clone https://github.com/shadowsocks/shadowsocks-libev
cd shadowsocks-libev
git submodule update --init --recursive
./autogen.sh
LIBS="-lpthread -lm" LDFLAGS="-Wl,-static -static -static-libgcc -L/home/yushi/ss/oss/ares/lib -L/home/yushi/ss/oss/libudns/lib -L/home/yushi/ss/oss/libev/lib" CFLAGS="-I/home/yushi/ss/oss/libudns/include -I/home/yushi/ss/oss/libev/include -I/home/yushi/ss/oss/ares/include" ./configure --host=arm-linux --prefix=/home/yushi/ss/oss/shadowsocks-libev --disable-ssp --disable-documentation --with-mbedtls=/home/yushi/ss/oss/mbedtls --with-pcre=/home/yushi/ss/oss/pcre --with-sodium=/home/yushi/ss/oss/libsodium
make && make install

8、编译 simple-obfs
ver=0.0.2
git clone https://github.com/shadowsocks/simple-obfs
cd simple-obfs
git checkout v$ver -b v$ver
git submodule init && git submodule update
./autogen.sh
LIBS="-lpthread -lm" LDFLAGS="-Wl,-static -static -static-libgcc -L/home/yushi/ss/oss/libsodium/lib -L/home/yushi/ss/oss/libudns/lib -L/home/yushi/ss/oss/libev/lib" CFLAGS="-I/home/yushi/ss/oss/libsodium/include -I/home/yushi/ss/oss/libudns/include -I/home/yushi/ss/oss/libev/include" ./configure --host=arm-linux --prefix=/home/yushi/ss/oss/shadowsocks-libev --disable-ssp --disable-documentation
make && make install

9、压缩
find /home/yushi/ss/oss/shadowsocks-libev/bin ! -name 'ss-nat' -type f | xargs arm-uclibc-strip
find /home/yushi/ss/oss/shadowsocks-libev/bin ! -name 'ss-nat' -type f | xargs upx

123system黑色星期五优惠主机实测

123system黑色星期五优惠主机实测无评论

2017年11月16日 at 上午11:58分类:其他 阅读: 1,111 次

昨天撸了一台优惠主机,3年34.5美元
基本配置:

购买链接
原价69美元,加入购物车后输入优惠码Halloween50off可以五折,即3年34.5美元

购买之后暂用做本站的镜像网站,网址:
http://www.yithinker.com

探针信息:

100m测试文件下载地址:
http://www.yithinker.com/100mb.test

性能测试数据:

国内ping数据:

ssr速度:

补充:
高峰期的网速比较着急,各位看着办

估计用kcptun、finalspeed会有所改善,但是需要双边加速

24小时实时监测数据:
http://blog.iytc.net/iot/web.html
检测方法:联通20Mbps,每隔20分钟下载一个2M文件

网友反馈此主机对联通线路很友好,对电信线路就完蛋,电信下载有的地区高,有的地区很低

在我已经购买的主机对比中,woohosting比这个好一点,$15/年,KVM主机

woo购买链接

如果不差钱的可以选vultr,最低$2.5/月,KVM主机,不过很多地区已经没有,我用的是$5/月,稳定性不错

vultr购买链接

woo和vultr主机24小时长期监测数据也是这个网址:
http://blog.iytc.net/iot/web.html

总之一句话,一分钱一分货!

交叉编译nginx for arm 版本

交叉编译nginx for arm 版本无评论

2017年11月5日 at 下午2:45分类:其他 阅读: 303 次

1、下载源码
先新建一个目录ss:
mkdir ss
全路径为/home/yushi/ss/

然后进入ss目录,下载源码
nginx依赖两个库zlib、pcre
wget https://downloads.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz
tar zxvf zlib-1.2.11.tar.gz

wget http://ftp.cs.stanford.edu/pub/exim/pcre/pcre-8.39.tar.gz
tar zxvf pcre-8.39.tar.gz

wget http://nginx.org/download/nginx-1.6.2.tar.gz
tar xvf nginx-1.6.2.tar.gz
mkdir nginx

2、修改nginx源码
1)auto/cc/conf
case $NGX_CC_NAME in
arm-linux-gcc)
# gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2
# 3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2
# 4.0.0, 4.0.1, 4.1.0

2)auto/types/sizeof
checking for $ngx_type size

END

ngx_size=4

。。。

#ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
ngx_test="gcc $CC_TEST_FLAGS $CC_AUX_FLAGS \

-o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"

#eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"

#if [ -x $NGX_AUTOTEST ]; then
# ngx_size=`$NGX_AUTOTEST`
# echo " $ngx_size bytes"
#fi

3)auto/feature
# /bin/sh is used to intercept "Killed" or "Abort trap" messages
#if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
echo " found"
ngx_found=yes

if test -n "$ngx_feature_name"; then
have=$ngx_have_feature . auto/have
fi

# else
# echo " found but is not working"
# fi

4)configure
if test -z "$NGX_PLATFORM"; then
echo "checking for OS"

#NGX_SYSTEM=`uname -s 2>/dev/null`
#NGX_RELEASE=`uname -r 2>/dev/null`
#NGX_MACHINE=`uname -m 2>/dev/null`

5)src/os/unix/ngx_time.h
#include
#include
#include
6)src/os/unix/ngx_errno.h
#define NGX_ELOOP ELOOP
#define NGX_EBADF EBADF
#define NGX_SYS_NERR 1
7)auto/lib/pcre/make
$PCRE/Makefile: $NGX_MAKEFILE
cd $PCRE \\
&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\
&& CC="\$(CC)" CFLAGS="$PCRE_OPT" \\
./configure --disable-shared $PCRE_CONF_OPT --host=arm-uclibc-linux

3、配置环境变量
用华硕的工具编译
export PATH=$PATH:/opt/ac1200g/asuswrt/release/src-rt-9.x/src/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin
export STAGING_DIR=/opt/ac1200g/asuswrt/release/src-rt-9.x/src/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/ac1200g/asuswrt/release/src-rt-9.x/src/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3/lib
export CC=arm-uclibc-linux-2.6.36-gcc
export CXX=arm-uclibc-linux-2.6.36-g++
export AR=arm-uclibc-linux-2.6.36-ar
export RANLIB=arm-uclibc-linux-2.6.36-ranlib
export NGX_SYSTEM=linux
export NGX_RELEASE=3.2-XT6
export NGX_MACHINE=arm

4、编译
./configure --with-zlib=/home/yushi/ss/zlib-1.2.11 --with-pcre=/home/yushi/ss/pcre-8.39 --prefix=/home/yushi/ss/nginx
make && make install

利用安卓手机远程控制Aria2

利用安卓手机远程控制Aria2无评论

2017年9月15日 at 下午10:06分类:其他 阅读: 3,003 次

本文介绍如何用安卓手机来远程控制路由器上的Aria2

路由器使用K3C定制版本

Aria2可以通过RPC进行远程控制,默认的端口是6800

一、DDNS或内网穿透
1、如果你有公网地址,先配置DDNS,然后通过端口映射将6800端口映射到K3C的6800端口

比如你的ddns为http://myweb.3322.org,那么aria2的远程rpc地址为
http://myweb.3322.org:6800
2、如果你路由器没有公网地址,那就需要进行内网穿透,目前版本的K3C固件还没有添加内网穿透应用,你可以借用其他路由器,比如K2P,假设K2P地址为192.168.2.1,K3C地址为192.168.2.100
先去www.ngrok.cc申请一个账号,开通免费的隧道

用前置域名的方式,比如前置域名为myaria

开通后配置K2P的Ngrok:

Token信息可以在网站上的“我的信息”菜单查看
配置生效后,你的aria2的远程rpc地址为
http://myaria.ngrok.cc
3、手机下载安装“Aria2下载管理器”
Aria2下载管理器_1.0.5
4、手机配置
进入账户管理

添加一个账号,比如用内网穿透的,注意这里的端口号是80

或者ddns的,这里的端口号是6800或者你指定映射的端口号

添加后在用户菜单点击刚才新建的账号开始连接,连接成功后可以添加/删除下载任务