openwrt使用ipset和shadowsocks实现自动代理

11,606次阅读
没有评论

自从把路由器刷成 openwrt 后,解决了在学校免流量上网和自由访问 Google 的问题,觉得整个世界都美好了,把自己的折腾记录整理一下分享出来。

思路

  • 学校 ipv4 收费,但 ipv6 免费,那么创建一个走 ipv6 的代理,让下载等耗流量的任务走这个代理,就可以节省流量,甚至所有流量走代理。这一步通过 shadowsocks 实现。
  • 有了代理实际上已经可以自由访问 Google 了,但是还需要手动设置代理,我希望路由器下面的设备能够自动实现流量分流。用 ipset 配合 dnsmasq 实现。
  • 最后还要解决 dns 污染的问题,有下面几种方法:
    1. 使用非 53 端口的 DNS 服务器,使用方便,但是支持非 53 端口的 DNS 不多。opendns
    2. 使用 tcp 协议查询。pdnsd
    3. 使用隧道把本地 53 端口的 UDP 请求转发到远程去解析。ss-tunnel
    4. 设置两个 DNS,一个在国内,一个在国外,当国内解析的结果被污染,使用国外 DNS 服务器的解析结果。chinadns
  • 我使用了第 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-localss-redir
  • 分别建立 ss-localss-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
ipset -N letitgo iphash
iptables -t nat -A PREROUTING -p tcp -m set –match-set letitgo dst -j REDIRECT –to-port 1080

作用是把打上了标记的数据包重定向到 ss-redir 的透明代理端口
重启 dnsmasqfirewall就可以实现流量自动分流了

1
2
/etc/init.d/dnsmasq restart
/etc/init.d/firewall restart

以后只要修改 dnsmasq 的配置文件就可以指定更多的地址走代理
路由器上还开着 ss-local, 下载时可以使用 Proxifier 做全局代理节省流量

正文完
 0
评论(没有评论)
验证码