openwrt上利用shadowsocks自动翻墙

  1. 配置okpg,禁用签名验证
    1. 注释option check_signature 1
  2. 修改/etc/opkg/distfeeds.conf
    1. 使用国内镜像:
      sed -i 's/downloads.openwrt.org/mirrors.ustc.edu.cn\/openwrt/g' /etc/opkg/distfeeds.conf
    2. 增加openwrt-dist源:
      #ShadowSocks
      src/gz openwrt_dist http://openwrt-dist.sourceforge.net/releases/x86/packages
      src/gz openwrt_dist_luci http://openwrt-dist.sourceforge.net/releases/luci/packages
      #或这个镜像:
      src/gz openwrt_dist http://openwrt-dist.thankgfw.ml/releases/ramips/packages
      src/gz openwrt_dist_luci http://openwrt-dist.thankgfw.ml/releases/luci/packages

此方案通过apnic分配给中国的IP地址作为判断依据,不再列表的就通过shadowsocks代理。简单粗暴,但是会影响整体速度。不理想,不推荐。

2.1. 安装软件

opkg update
opkg install ChinaDNS luci-app-chinadns
opkg install shadowsocks-libev-spec luci-app-shadowsocks-spec --force-depends
#应该一切正常,ps一下看看是否在运行;没有的话:
/etc/init.d/shadowsocks enable
/etc/init.d/shadowsocks start
/etc/init.d/chinadns enable
/etc/init.d/chinadns start

2.2. ChinaDNS配置

  1. 上游服务器:114.114.114.114,8.8.4.4
    可填入一系列的上游DNS服务器,根据实际情况来,可以保留默认,注意逗号后面不能有空格。有些ISP会封杀公共DNS,此时请将114DNS改为ISP的DNS;此处必须至少填入一个国内IP的DNS和一个国外IP的DNS,否则会造成ChinaDNS启动失败。
  2. 双向过滤: 勾选
    勾选时,当国外DNS服务器返回的查询结果是国内IP,或者当国内DNS服务器返回的查询结果是国外IP,则过滤掉这个结果(较为严格的模式);去掉勾选的话只是过滤国内DNS的国外IP结果。
  3. 本地端口:5353
    ChinaDNS所监听的端口。根据实际情况更改,注意不能和其他服务的端口重复(特别是dnsmasq和shadowsocks);保持默认值5353


2.3. DHCP/DNS设置

  1. 网络-“DHCP/DNS“设置,”DNS转发”填入127.0.0.1#5353 \\5353是ChinaDNS的端口,如果你在之前设置界面里改了,这里记得别填错。
  2. HOSTS和解析文件选项卡,勾中“忽略解析文件”.

2.4. Shadowsocks配置

  1. 填写ss服务器信息;
  2. Ignore List改成和ChinaDNS里一样的/etc/chinadns_chnroute.txt
  3. 去掉UDP转发

2.5. 更新/etc/chinadns_chnroute.txt

  1. CLI首次更新国内路由列表:
    wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /etc/chinadns_chnroute.txt
  2. GUI设置定时任务,定期更新/etc/chinadns_chnroute.txt
    0 4 * * * wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /etc/chinadns_chnroute.txt

2.6. 完成

内网里的电脑全部国内国外智能分流,并达到透明科学上网的目的。


  • 优点:
    1. 只有被列入GfwList内的域名才通过ShadowSocks代理,该方案效果不错,国内几乎不影响速度,也只有被墙的域名才走ss.
  • 缺点:
    1. 需要维护dnsmasq_list.conf,可能会有漏网之鱼.

3.1. 安装软件

shadowsocks-libev有两个版本:(shadowsocks-libev 和 shadowsocks-libev-spec) 要实施 shadowsocks + gfwlist 方案,只能安装 shadowsocks-libev,不带spec的版本,安装了的需要卸载再继续。

卸载如果报错,尝试:

opkg remove  shadowsocks-libev-spec --force-remove
#安装依赖包:
opkg install iptables-mod-nat-extra ipset libopenssl
#期间可能遇到如下错误提示:
#没关系这是因为安装的包需要重启系统,我们做完剩下的步骤最后再重启。
kmod : failed to insert /lib/modules/3.10.44/ip_set.ko
kmod : failed to insert /lib/modules/3.10.44/ip_set_bitmap_ip.ko
kmod : failed to insert /lib/modules/3.10.44/ip_set_bitmap_ipmac

重新安装:

opkg remove dnsmasq-full
opkg install dnsmasq-full

3.2. 配置/etc/shadowsocks.json

vim /etc/shadowsocks.json
{
    "server" : "x.x.x.x" ,
    "server_port" : "7777" ,
    "local_port" : "1080" ,
    "password" : "xxxxx" ,
    "timeout" : "1500" ,
    "method" : "aes-256-cfb"
}

3.3. 配置/etc/init.d/shadowsocks

#注释Client Mode
#把Proxy Mode的注释去掉
#打开ss-tunnel的DNS转发功能* \\
#!/bin/sh /etc/rc.common
START=95
SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
SERVICE_PID_FILE=/var/run/shadowsocks.pid
CONFIG=/etc/shadowsocks.json
#上游DNS
DNS =8.8.4.4:53
#本地端口
TUNNEL_PORT=5353
 
start () {
     # Client Mode
     #service_start /usr/bin/ss-local -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
     # Proxy Mode
    service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
     # ss-tunnel
    service_start /usr/bin/ss-tunnel -c $CONFIG -b 0.0.0.0 -u -l $TUNNEL_PORT -L $DNS
}
 
stop () {
     # Client Mode
     #service_stop /usr/bin/ss-local
     # Proxy Mode
    service_stop /usr/bin/ss-redir
     # ss-tunnel
    service_stop /usr/bin/ss-tunnel
}

3.4. 启动shadowsocks,并设置开机运行

/etc/init.d/shadowsocks enable
/etc/init.d/shadowsocks start

3.5. 配置dnsmasq和ipset

将如下规则加入自定义防火墙规则中,1080是shadowsocks的本地端口: 第一条是连入路由的设备走代理; 第二条是路由器自身走代理; 需要手动将路由器联网的interface的DNS服务器手动设置为127.0.0.1

ipset -N gfwlist iphash
iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080
iptables -t nat -A OUTPUT -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080

3.6. 修改 /etc/dnsmasq.conf

echo "conf-dir=/etc/dnsmasq.d" >> /etc/dnsmasq.conf
mkdir /etc/dnsmasq.d && cd /etc/dnsmasq.d/
  • 自动生成dnsmasq_list.conf 的脚本:1)
  • 你可能需要自行修改这个文件,格式如下:
  • 使用不受污染干扰的DNS解析该域名 可以将此IP改为自己使用的DNS服务器
  • server=/google.com/127.0.0.1#5353
  • 将解析出来的IP保存到名为gfwlist的ipset表中
  • ipset=/google.com/gfwlist

3.7. 最后配置

网络- 接口 - WAN - 高级 勾去 “使用局端通告的DNS” ; 使用自定义DNS:127.0.0.1; 网络- DHCP/DNS - “DNS转发”: 61.139.2.69

3.8. 完成,重启路由器

3.9. Debug

shadowsocks服务正常的情况下,以下端口应存在:

  1. 5353:本地监听DNS转发的端口
  2. 1080:本地ss代理监听的端口
  3. 7777:假如ss服务器的服务端口为7777,那么openwrt和ss服务器上该端口应该存在


  • openwrt/openwrt上利用shadowsocks自动翻墙.txt
  • 最后更改: 2019/04/16 18:31
  • (外部编辑)