之前写过使用shadowsocks搭建透明代理,由于shadowsocks使用的是tcp连接,而tcp连接速度比较好的服务器如阿里云香港都比较贵,基本看不起油管,最近比较火的kcptun是一个使用udp的加速代理,自带加密,只要不扩散基本没有隐私泄露危险,这个教程与shadowsocks基本相似。
大致原理:iptables转发出国ip数据到redsocks,然后redsocks转发给kcptun-client,kcptun-client发给kcptun-server,kcptun-server转发给要访问的墙外服务器。

1.解决dns解析被污染

1.安装chinadns和dnsmasq

git clone https://github.com/clowwindy/ChinaDNS
cd ChinaDNS
./configure && make
make install
apt-get install dnsmasq

dnsmasq是dns缓存服务器,目的是减少再次查询域名时间,首次dns查询可能200ms以上,再次查询只需要10ms。

2.编辑chinadns配置文件
添加开机启动脚本 /etc/init.d/chinadns
nano /etc/init.d/chinadns

#!/bin/sh
### BEGIN INIT INFO
# Provides: chinadns
# Required-Start: $network $local_fs $remote_fs $syslog
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start ChinaDNS at boot time
### END INIT INFO

DAEMON=/usr/local/bin/chinadns
DESC=ChinaDNS
NAME=chinadns
PIDFILE=/var/run/$NAME.pid

test -x $DAEMON || exit 0

case "$1" in start)
    echo -n "Starting $DESC: "
    $DAEMON \
        -m \
        -c /usr/local/share/chnroute.txt \
        -p 15353 \
        1> /var/log/$NAME.log \
        2> /var/log/$NAME.err.log &
    echo $! > $PIDFILE
    echo "$NAME."
    ;;
  stop)
    echo -n "Stopping $DESC: "
    kill `cat $PIDFILE`
    rm -f $PIDFILE
    echo "$NAME."
    ;;
  restart|force-reload)
    $0 stop
    sleep 1
    $0 start
    ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|force-reload}" >&2
    exit 1
    ;;
esac

exit 0

其中,-m 参数表示启用压缩指针(DNS pointer mutation),-c 指定 chnroute 文件,-p 指定监听的端口,没有指定将使用 dns 默认的 53 端口,-s 指定下游 dns 服务器。
更新chnroute文件,

cd /usr/local/share/
curl '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)) }' > chnroute.txt

可以用 crontab 添加定时任务,每周更新一次。
3.编辑dnsmasq配置文件

cd /etc/dnsmasq.s/
nano dnsmasq.conf
no-resolv
server=127.0.0.1#15353

2.数据穿过防火墙

下载对应的安装包,解压 https://github.com/xtaci/kcptun/releases
编辑配置文件client.json

{

"localaddr": ":8888",
"remoteaddr": "x.x.x.x:port",
"key": "password",
"crypt": "aes",
"mode": "fast2",
"conn": 1,
"autoexpire": 60,
"mtu": 1350,
"sndwnd": 128,
"rcvwnd": 1024,
"datashard": 5,
"parityshard": 5,
"dscp": 46,
"nocomp": false,
"acknodelay": false,
"nodelay": 0,
"interval": 40,
"resend": 0,
"nc": 0,
"sockbuf": 4194304,
"keepalive": 10 }

使用命令 client_darwin_amd64 -c client.json &启动,并把命令添加到rc.local实现开机启动

kcptun-server端安装方法见https://github.com/clangcn/kcp-server

3.解决墙内外数据分流

1.安装redsocks,和ipset

配置redsocks

redsocks {

local_ip = 0.0.0.0;
local_port = 12345; 
ip = 127.0.0.1;
port = 8888; }

配置完后记得重启redsocks

配置ipset

导入chnroutes

curl '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)) }' > chnroute.txt

ipset create chnroute hash:net

cat chnroute.txt xargs -I ip ipset add chnroute ip

ipset save chnroute > /etc/chnroute.ipset #保存ipset
ipset restore < /etc/chnroute.ipset #导入ipset

以上可以设置一个定时任务每周刷新一次chnroutes

2.配置iptabels
可以先iptables-save > iptables,然后编辑iptables,再iptables-restore < iptables
添加如下

-A PREROUTING -p tcp -j SHADOWSOCKS
-A OUTPUT -p tcp -j SHADOWSOCKS
-A SHADOWSOCKS -d x.x.x.x/32 -j RETURN #kcptun-server ip
-A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
-A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
-A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
-A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
-A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
-A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
-A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
-A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
-A SHADOWSOCKS -m set --match-set chnroute dst -j RETURN
-A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345

最后在rc.local添加iptables-restore < iptables,开机加载防火墙规则

4.上机测试

配置客户端网关和dns为树莓派地址,打开浏览器测试墙外网站

如果有问题,检查树莓派上几个服务配置完后是否重启,
使用ping,traceroute,dig,telnet等命令排查

Have a good luck!