树莓派使用kcptun搭建透明代理,看1080p油管
之前写过使用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.txtipset 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!