自从把路由器刷成 openwrt 后,解决了在学校免流量上网和自由访问 Google 的问题,觉得整个世界都美好了,把自己的折腾记录整理一下分享出来。
思路
- 学校 ipv4 收费,但 ipv6 免费,那么创建一个走 ipv6 的代理,让下载等耗流量的任务走这个代理,就可以节省流量,甚至所有流量走代理。这一步通过
shadowsocks
实现。 - 有了代理实际上已经可以自由访问 Google 了,但是还需要手动设置代理,我希望路由器下面的设备能够自动实现流量分流。用
ipset
配合dnsmasq
实现。 - 最后还要解决 dns 污染的问题,有下面几种方法:
- 使用非 53 端口的 DNS 服务器,使用方便,但是支持非 53 端口的 DNS 不多。
opendns
- 使用 tcp 协议查询。
pdnsd
- 使用隧道把本地 53 端口的 UDP 请求转发到远程去解析。
ss-tunnel
- 设置两个 DNS,一个在国内,一个在国外,当国内解析的结果被污染,使用国外 DNS 服务器的解析结果。
chinadns
- 使用非 53 端口的 DNS 服务器,使用方便,但是支持非 53 端口的 DNS 不多。
- 我使用了第 2 种方案,利用 pdnsd 得到一个通过 tcp 向上游 dns 服务器查询的本地 dns 服务器,然后利用 dnsmasq 指定有需要的域名通过 pdnsd 解析,可以保证获取到正确的 ip。
Shadowsocks
- shadowsocks 官网已经上不去了,可以点 这里 下载编译好的 ipk 包。1.4.7 版本加入了 rc4-md5 的加密方式,速度比 aes-256 快很多,加密方式最好用 rc4-md5
- 开始之前,需要一台 shadowsocks 的服务器,修改配置
server_ip:"::"
监听 ipv6 和 ipv4 - 解压后根据自己路由器的 cpu 型号选择合适的包通过 scp 上传到 /tmp。以 wndr3800 为例,ar71xx 平台,通过下面的命令安装(先安装 libpolarssl 解决依赖)
1 2 3 | opkg update opkg install libpolarssl opkg install /tmp/shadowsocks-libev-polarssl_1.4.7_ar71xx.ipk |
安装之后还需要做一个 libpolarssl.so.7 的链接,否则 shadowsocks 不能启动
1 | ln -s /usr/lib/libpolarssl.so /usr/lib/libpolarssl.so.7 |
- shadowsocks 安装后有三个命令,
ss-local
启动 sock5 代理,ss-redir
启动透明代理,ss-tunnel
启动隧道。我使用了ss-local
和ss-redir
- 分别建立
ss-local
和ss-redir
的配置文件
1 2 3 4 5 6 7 8 9 | #/etc/shadowsocks.json { “server”:“ 服务器 ipv6 地址 ”, “server_port”:8888, # 服务器端口 “local_port”:1080, # 本地 sock5 代理端口 “password”:“1111”, “timeout”:300, “method”:“rc4-md5” } |
ss-redir
的配置除 local_port
以外,其他都和上面的配置相同,例子中使用 1080 端口。
- 修改配置文件
/etc/init.d/shadowsocks
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/bin/sh /etc/rc.common # Copyright (C) 2006-2011 OpenWrt.org START=95 SERVICE_USE_PID=1 SERVICE_WRITE_PID=1 SERVICE_DAEMONIZE=1 start() { service_start /usr/bin/ss-local -c /etc/shadowsocks.json service_start /usr/bin/ss-redir -c /etc/ss-redir.json } stop() { service_stop /usr/bin/ss-local service_stop /usr/bin/ss-redir } |
添加执行权限,设置开机启动
1 2 | chmod +x /etc/init.d/shadowsocks /etc/init.d/shadowsocks enable |
shadowsocks 配置完成!
pdnsd
安装
1 2 | opkg update opkg install pdnsd |
配置/etc/init.d/pdnsd.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | global { perm_cache=1024; cache_dir=“/var/pdnsd”; run_as=“nobody”; server_port = 1053; server_ip = 127.0.0.1; status_ctl = on; query_method=tcp_only; min_ttl=15m; max_ttl=1w; timeout=10; } server { label= “googledns”; ip = 8.8.8.8; root_server = on; uptest = none; } |
设置开机启动
1 2 | /etc/init.d/pdnsd enable /etc/init.d/pdnsd restart |
完成!
ipset 和 dnsmasq
openwrt 默认安装的 dnsmasq 不支持 ipset,需要先卸载,换成 dnsmasq-full
1 2 3 4 | opkg update opkg install kmod-ipt-ipset ipset ipset-dns opkg remove dnsmasq opkg install dnsmasq-full |
配置/etc/dnsmasq.conf
1 2 3 4 5 6 7 8 9 10 11 12 | server=/google.com/127.0.0.1#1053 server=/googleusercontent.com/127.0.0.1#1053 server=/gstatic.com/127.0.0.1#1053 server=/googlehosted.com/127.0.0.1#1053 server=/golang.org/127.0.0.1#1053 server=/googleapis.com/127.0.0.1#1053 ipset=/google.com/letitgo ipset=/googleusercontent.com/letitgo ipset=/gstatic.com/letitgo ipset=/googlehosted.com/letitgo ipset=/golang.org/letitgo ipset=/googleapis.com/letitgo |
按照这种格式指定特定的域名走代理。server=/google.com/127.0.0.1#1053
的含义是 google.com 通过本地 1053 端口解析地址ipset=/google.com/letitgo
的含义给 google.com 的数据包打上标记,一会配置 iptables
时会用到
接下来配置 iptables
,在/etc/firewall.user
里加上两行
1 2 |
|
作用是把打上了标记的数据包重定向到 ss-redir 的透明代理端口
重启 dnsmasq
和firewall
就可以实现流量自动分流了
1 2 | /etc/init.d/dnsmasq restart /etc/init.d/firewall restart |
以后只要修改 dnsmasq
的配置文件就可以指定更多的地址走代理
路由器上还开着 ss-local
, 下载时可以使用 Proxifier
做全局代理节省流量
正文完
发表至: 未分类
2015-11-15