配置 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
# 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

  • /usr/bin/ss-firewall-...

    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监听的端口即可

配置iptables防火墙转发IP和端口

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 保存在目录下,否则会出错。可以到下面地址下载这几个文件:

    https://github.com/softwaredownload/openwrt-fanqiang/tree/master/openwrt/default/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

控制shadowsocks本地客户端的方法

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随机启动

启动并测试shadowsocks-libev本地客户端

确保所有设置无误后,可以启动测试一下:

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.comtwitter.com

下载配置文件的最新版

git clone https://github.com/softwaredownload/openwrt-fanqiang

git clone 项目到本地后,可以进入 openwrt目录查看文件

如果所有设置都正确,应该可以较快速度打开被墙网站

相关资源: