配置OpenWrt shadowsocks路由器智能自动翻墙
OpenWrt路由器用dnsmasq转发国内重要域名查询
OpenWrt默认自带dnsmasq,我们只要配置一下就好了。ssh登录OpenWrt路由器后:
建立dnsmasq.d目录:
root@OpenWrt:~# mkdir /etc/dnsmasq.d root@OpenWrt:~# echo "conf-dir=/etc/dnsmasq.d" >> /etc/dnsmasq.conf
OpenWrt安装GNU wget以支持https下载,下载国内重要网站名单,用国内域名服务器查询iP地址
root@OpenWrt:~# cd /etc/dnsmasq.d root@OpenWrt:/etc/dnsmasq.d# opkg install wget root@OpenWrt:/etc/dnsmasq.d# wget -4 --no-check-certificate -O /etc/dnsmasq.d/accelerated-domains.china.conf https://github.com/felixonmars/dnsmasq-china-list/raw/master/accelerated-domains.china.conf root@OpenWrt:/etc/dnsmasq.d# wget -4 --no-check-certificate -O /etc/dnsmasq.d/bogus-nxdomain.china.conf https://github.com/felixonmars/dnsmasq-china-list/raw/master/bogus-nxdomain.china.conf
注:accelerated-domains.china.conf 文件中的条目举例:
server=/10010.com/114.114.114.114 server=/115.com/114.114.114.114
意思是,访问10010.com这个结尾的域名时,dnsmasq会转发到国内的域名服务器114.114.114.114进行dns查询。
gfwlist.conf: 其他域名,转发到shdowsocks-libev ss-tunnel指定的端口dns查询
root@OpenWrt:/etc/dnsmasq.d# echo "server=/#/127.0.0.1#3210" > gfwlist.conf
上面#是通配符,代表泛匹配所有域名。dnsmasq匹配域名的特点是详细特征优先匹配,因此会先匹配accelerated-domains.china.conf上的域名,如果不匹配,再匹配这条规则:转发到本地端口3210进行域名查询。
后面我们会配置shdowsocks-libev的本地客户端ss-tunnel转发本地端口3210的查询到远程自建服务器。
配置shdowsocks本地客户端ss-redir启动和停止函数
root@OpenWrt:/etc/dnsmasq.d# vi /etc/init.d/shadowsocks
/etc/init.d/shadowsocks:
#!/bin/sh /etc/rc.common
# Author: https://github.com/softwaredownload/openwrt-fanqiang
# Date: 2015-12
START=95
SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
start() {
sed -i 's/114.114.114.114/127.0.0.1#3210/' /etc/dnsmasq.d/gfwlist.conf
/etc/init.d/dnsmasq restart
service_start /usr/bin/ss-redir -b 0.0.0.0 -c /etc/shadowsocks.json -f /var/run/shadowsocks.pid
service_start /usr/bin/ss-tunnel -b 0.0.0.0 -c /etc/shadowsocks.json -l 3210 -L 8.8.8.8:53 -u
/usr/bin/shadowsocks-firewall
}
stop() {
sed -i 's/127.0.0.1#3210/114.114.114.114/' /etc/dnsmasq.d/gfwlist.conf
/etc/init.d/dnsmasq restart
service_stop /usr/bin/ss-redir
service_stop /usr/bin/ss-tunnel
killall ss-redir
killall ss-tunnel
/etc/init.d/firewall restart
}
shadowsocks本地客户端配置文件start stop函数说明:
- sed -i 's/127.0.0.1#3210/114.114.114.114/' /etc/dnsmasq.d/gfwlist.conf
停止shadowsocks翻墙服务时,要把泛匹配域名的解析转发到国内的dns服务器,这里是114 - sed -i 's/114.114.114.114/127.0.0.1#3210/' /etc/dnsmasq.d/gfwlist.conf
开启翻墙服务时,如果以前停止过shadowsocks翻墙服务,要把泛匹配域名的解析改成通过ss-tunnel 3210端口转发 - service_start /usr/bin/ss-tunnel -b 0.0.0.0 -c /etc/shadowsocks.json -l 3210 -L 8.8.8.8:53 -u
监听本地3210端口,转发到自己的服务器的53端口向8.8.8.8查询DNS - /usr/bin/shadowsocks-firewall
dnsmasq只是负责域名查询分配转发,查询到IP地址后,是否需要通过shdowsocks加密请求内容,要在shdowsocks-firewall里进行设置 - 运行
/etc/init.d/shadowsocks stop
有时并没有结束ss-redir 或ss-tunnel进程,这会导致修改shadowsocks.conf
后需要重启路由器才能生效。加上killall
强制杀掉进程避免重启。(2016-01-19)
(注:即使加了 killall,有时还是不能杀掉进程,这种情况就只能重启路由器了。也就是说,修改了翻墙配置,有时必须重启路由器才能生效)
配置iptables防火墙转发IP和端口
root@OpenWrt:~# cd /usr/bin
root@OpenWrt:~# touch shadowsocks-firewall
root@OpenWrt:~# chmod +x shadowsocks-firewall
root@OpenWrt:~# vi shadowsocks-firewall
/usr/bin/shdowsocks-firewall:
#!/bin/sh
# Author: https://github.com/softwaredownload/openwrt-fanqiang
# Date: 2015-12-23
#create a new chain named SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS_WHITELIST
# Ignore your shadowsocks server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A SHADOWSOCKS -d 1.0.9.8 -j RETURN
#for hulu.com
iptables -t nat -A SHADOWSOCKS -p tcp --dport 1935 -j REDIRECT --to-ports 7654
iptables -t nat -A SHADOWSOCKS -p udp --dport 1935 -j REDIRECT --to-ports 7654
# Ignore LANs IP address
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
# Check whitelist
iptables -t nat -A SHADOWSOCKS -j SHADOWSOCKS_WHITELIST
iptables -t nat -A SHADOWSOCKS -m mark --mark 1 -j RETURN
# Anything else should be redirected to shadowsocks's local port
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 7654
# Apply the rules
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
# Ignore China IP address
for white_ip in `cat /etc/chinadns_chnroute.txt`;
do
iptables -t nat -A SHADOWSOCKS_WHITELIST -d "${white_ip}" -j MARK --set-mark 1
done
# Ignore Asia IP address
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 1.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 14.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 27.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 36.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 39.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 42.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 49.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 58.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 59.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 60.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 61.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 101.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 103.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 106.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 110.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 111.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 112.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 113.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 114.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 115.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 116.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 117.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 118.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 119.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 120.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 121.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 122.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 123.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 124.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 125.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 126.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 169.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 175.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 180.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 182.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 183.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 202.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 203.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 210.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 211.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 218.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 219.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 220.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 221.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 222.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 223.0.0.0/8 -j MARK --set-mark 1
OpenWrt路由器 iptables防火墙设置含义
- 如果本地发出请求到shadowsocks服务端所在的服务器,就返回,不作任何特殊处理。
- 如果本地发出请求到局域网,也立即返回
- 如果发出请求到中国的IP地址,也立即返回
chinadns_chnroute.txt是中国IP地址,见 https://github.com/softwaredownload/openwrt-fanqiang/blob/master/openwrt/default/etc/chinadns_chnroute.txt
预编译翻墙固件都带了这个文件。这个文件很长,因此配置不高的路由器DIR-505,预编译固件里改成了“发出请求到亚洲的IP地址就立即返回”,见文件 https://github.com/softwaredownload/openwrt-fanqiang/blob/master/openwrt/dir505/usr/bin/shadowsocks-firewall - 剩下的IP内容请求,全部转发到shdowsocks-libev本地客户端ss-redir监听的端口,由ss-redir负责和服务端进行加密通讯。(手下报告访问youtube的屁民为个位数,领导心里那个高兴啊。可惜经过加密,内容传输速度会有下降)
- 首先运行全代理模式,然后再执行白名单。在白名单比较长时冷启动的速度会比较快。(Thanks Phoeagon)
- 中国的IP列表比较长,如果你的路由器硬件配置不是太好,可以把Ignore China IP address段注释掉,启用Ignore Asia IP address段
OpenWrt路由器防火墙设置重要说明:
- 你必须把上面的1.0.9.8换成你服务器真实的IP地址
- iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 7654 这里的7654必须和OpenWrt路由器 /etc/shadowsocks.json里的 local_port一样,也就是说,如果 /etc/shadowsocks.json里 "local_port":1090, 那这里的7654也要改成1090
- 其他可以保持默认
控制shadowsocks本地客户端的方法
root@OpenWrt:~# /etc/init.d/shadowsocks stop
root@OpenWrt:~# /etc/init.d/shadowsocks start
root@OpenWrt:~# /etc/init.d/shadowsocks enable
root@OpenWrt:~# /etc/init.d/shadowsocks disable
说明:
- stop: 停止shdowsocks
- start: 运行shadowsocks
- enable: 设置shadowsocks在OpenWrt路由器启动时自动启动
- disable: 取消shadowsocks随机启动
启动并测试shadowsocks-libev本地客户端
确保所有设置无误后,可以启动测试一下:
root@OpenWrt:~# /etc/init.d/dnsmasq restart
root@OpenWrt:~# /etc/init.d/shadowsocks stop
root@OpenWrt:~# /etc/init.d/shadowsocks start
root@OpenWrt:~# /etc/init.d/shadowsocks enable
然后在Ubuntu电脑,手机等设备上打开youtube.com,twitter.com
下载配置文件的最新版
git clone https://github.com/softwaredownload/openwrt-fanqiang
git clone 项目到本地后,可以进入 openwrt目录查看文件。
如果所有设置都正确,应该可以较快速度打开被墙网站。