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

下载配置文件的最新版

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

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

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

results matching ""

    No results matching ""