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的查询到远程自建服务器
root@OpenWrt:/etc/dnsmasq.d# vi /etc/init.d/shadowsocks
#!/bin/sh /etc/rc.common
# Author: https://github.com/softwaredownload/openwrt-fanqiang
# Last Update: 2018-09-27
START=95
SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
start() {
echo 'server=/#/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-libev/config.json -f /var/run/shadowsocks.pid -u
service_start /usr/bin/ss-tunnel -b 0.0.0.0 -c /etc/shadowsocks-libev/config.json -l 3210 -L 8.8.4.4:53 -u
/usr/bin/ss-firewall-asia
#/usr/bin/ss-firewall-global
#/usr/bin/ss-firewall-china
}
stop() {
echo 'server=/#/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
service_stop /usr/bin/obfs-local
killall ss-redir
killall ss-tunnel
killall obfs-local
/etc/init.d/firewall restart
}
shadowsocks本地客户端配置文件start stop函数说明:
-
echo 'server=/#/114.114.114.114' > /etc/dnsmasq.d/gfwlist.conf
停止shadowsocks翻墙服务时,要把泛匹配域名的解析转发到国内的dns服务器,这里是114
原来用的是 sed 替换字符串的方法, 有几次发现 gfwlist.conf 被意外清空,导致翻墙失,败原因不理,。现改用 echo 清空文件并添加字符串的方法后,即使 gfwlist.conf 内容被清除,也能在重启 shadowsocks 后重新写入
-
echo 'server=/#/114.114.114.114' > /etc/dnsmasq.d/gfwlist.conf
开启翻墙服务时,如果以前停止过shadowsocks翻墙服务,确保泛匹配域名的解析通过ss-tunnel 3210端口转发
-
service_start /usr/bin/ss-tunnel -b 0.0.0.0 -c /etc/shadowsocks-libev/config.json -l 3210 -L 8.8.4.4:53 -u
监听本地3210端口,转发到自己的服务器的53端口向8.8.4.4查询DNS
-
dnsmasq只是负责域名查询分配转发,查询到IP地址后,是否需要通过shdowsocks加密请求内容,要在ss-firewall-...里进行设置
三个
/usr/bin/ss-firewall-...
启用其中一个浏览外网时建议启用
/usr/bin/ss-firewall-global
全局翻墙,既节省了路由器的计算资源,又避免一些意想不到的问题 -
运行
/etc/init.d/shadowsocks stop
有时并没有结束ss-redir 或ss-tunnel进程这会导致修改
shadowsocks.conf
后需要重启路由器才能生效。加上killall
强制杀掉进程避免重启。(2016-01-19) (注:即使加了 killall,有时还是不能杀掉进程,这种情况就只能重启路由器了。也就是说,修改了翻墙配置,有时必须重启路由器才能生效) -
ss-redir 加上 -u 参数
据tefiszx的建议:
-
youtube目前使用quic,udp协议是首选,目前路由器的ss配合iptables只能转发tcp流量,最新版的youtube的app会出现断流,而网页端播放目前没问题(chrome必须关闭quic)
-
很多游戏的网络版都使用udp协议。目前的转发存在一定的局限性
-
在转发tcp流量的基础上增加转发upd后,ss就成为准vpn了。应用面更
-
已经找到youtube安卓客户端3秒断流的解决办法。方法如下:
- 修改/etc/init.d/shadowsocks文件,把ss-redir 加-u参数启动
- 修改/usr/bin/ss-firewall-*文件,在防火墙规则中增加一条iptables规则,将443端口的upd重定向到shadowsocks监听的端口即可
-
root@OpenWrt:~# cd /usr/bin
root@OpenWrt:~# touch ss-firewall-asia
root@OpenWrt:~# chmod +x ss-firewall-asia
root@OpenWrt:~# vi ss-firewall-asia
/usr/bin/shdowsocks-firewall-asia:
#!/bin/sh
# Author: https://github.com/softwaredownload/openwrt-fanqiang
# phoeagon tefiszx idonknown
# Last Update: 2018-10
#create new chains
iptables -t nat -N SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS_WHITELIST
# Ignore your shadowsocks server-s's addresses
# It's very IMPORTANT, just be careful
# you'd better add them in an individual file
for white_ip in `cat /etc/shadowsocks-libev/ip_server.txt`;
do
iptables -t nat -A SHADOWSOCKS -d "${white_ip}" -j RETURN
done
# Ignore Custom IP list
for white_ip in `cat /etc/shadowsocks-libev/ip_custom.txt`;
do
iptables -t nat -A SHADOWSOCKS -d "${white_ip}" -j RETURN
done
# for Chrome youtube
iptables -t nat -A SHADOWSOCKS -p udp --dport 443 -j REDIRECT --to-ports 7654
# Ignore LANs to bypass the proxy
# See Wikipedia and RFC5735 for full list of reserved networks.
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 TCP request 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
# Or ignore Asia IP address
for white_ip in `cat /etc/shadowsocks-libev/ip_asia.txt`;
do
iptables -t nat -A SHADOWSOCKS_WHITELIST -d "${white_ip}" -j MARK --set-mark 1
done
# Ignore China IP address
# See ashi009/bestroutetb for a highly optimized CHN route list.
#for white_ip in `cat /etc/shadowsocks-libev/ip_china.txt`;
#do
# iptables -t nat -A SHADOWSOCKS_WHITELIST -d "${white_ip}" -j MARK --set-mark 1
#done
OpenWrt路由器 iptables防火墙设置含义:
-
/etc/shadowsocks-libev/ip_server.txt
如果本地发出请求到shadowsocks服务端 IP,就返回,不作任何特殊处理
2018-10 起,防火墙规则中要忽略的 IP 列表分类保存到 /etc/shadowsocks-libev/ 目录下,这给我们修改带来了很大的便利。特别是你有多个VPS时,全写在 ip_server.txt 就行了
确保这几个 ip_*.txt 路由器 /etc/shadowsocks-libev 保存在目录下,否则会出错。可以到下面地址下载这几个文件:
-
/etc/shadowsocks-libev/ip_custom.txt
自定义的忽略 IP,这个文件很有必要,比如你在电脑WIFI连接的属性中设置一个国内某个特殊DNS地址,再把这个地上加到ip_custom.txt,DNS解析速度会非常快
默认启用的是 ss-firewall-asia ,即亚洲 IP 加入白名单,这样防火墙规则简单多了,但是有些 .tw .hk 网站可能打不开,把它们的 ip 加到 ip_custom.txt 就可以打开了
-
如果本地发出请求到局域网,也立即返回
本来计划启用 ip_lan.txt,但这样做有风险,如果你忘记在路由器里放置该文件,那么将无法登录路由器,只能重新刷固件
-
/etc/shadowsocks-libev/ip_asia.txt
如果发出请求到亚洲的IP地址,也立即返回
-
剩下的IP内容请求,全部转发到shdowsocks-libev本地客户端ss-redir监听的端口,由ss-redir负责和服务端进行加密通讯。(手下报告访问youtube的屁民为个位数,白脸心里那个高兴啊。可惜经过加密,内容传输速度会有下降)
-
iptables -t nat -N SHADOWSOCKS_WHITELIST 相关行
首先运行全代理模式,然后再执行白名单。在白名单比较长时路由器冷启动的速度会比较快,如果启用了ip_china.txt,你会感觉到路由器启动速度快了好多倍。(Thanks Phoeagon)
一般不建议使用 ip_china.txt
预编译翻墙固件都带了这个文件,这个文件很长,因此配置不高的路由器DIR-505,预编译固件里应该“发出请求到亚洲的IP地址就立即返回”
每个请求都检测是否中国区IP,可能对路由器的压力较大,WNDR4300 路由器也是如此
从 2018-09 开始,默认配置启用 Ignore Asia IP address,这样路由器的压力就小得多了
如果你的路由器性能较好,可以手动启用 Ignore China IP address,并把Ignore Asia IP address段注释掉
-
iptables -t nat -A SHADOWSOCKS -p udp --dport 443 -j REDIRECT --to-ports 7654
据tefiszx建议,upd协议 443端口流量转发到shadowsocks 的本地端口,chrome 浏览器打开 youtube 可能更快
OpenWrt路由器防火墙设置重要说明:
-
你必须把上面的1.0.9.8换成你服务器真实的IP地址
-
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 7654
这里的7654
必须和OpenWrt路由器/etc/shadowsocks-libev/config.json
里的local_port
一样,也就是说,如果 /etc/shadowsocks-libev/config.json里local_port":1090
那这里的7654
也要改成1090
root@OpenWrt:~# /etc/init.d/shadowsocks start
root@OpenWrt:~# /etc/init.d/shadowsocks enable
root@OpenWrt:~# /etc/init.d/shadowsocks stop
root@OpenWrt:~# /etc/init.d/shadowsocks disable
说明:
- enable: 设置shadowsocks在OpenWrt路由器启动时自动启动
- start: 运行shadowsocks
- stop: 停止shdowsocks
- disable: 取消shadowsocks随机启动
确保所有设置无误后,可以启动测试一下:
root@OpenWrt:~# /etc/init.d/dnsmasq restart
root@OpenWrt:~# /etc/init.d/shadowsocks enable
root@OpenWrt:~# /etc/init.d/shadowsocks stop
root@OpenWrt:~# /etc/init.d/shadowsocks start
然后在Ubuntu电脑,手机等设备上打开youtube.com,twitter.com
git clone https://github.com/softwaredownload/openwrt-fanqiang
git clone 项目到本地后,可以进入 openwrt目录查看文件
如果所有设置都正确,应该可以较快速度打开被墙网站
相关资源: