基于OpenWrt路由器的(不完全)自动翻墙方案

之前一直在用这篇文章里面的方法配置OpenWRT路由器翻墙, 但是最近伪大的防火墙又升级了,防DNS污染的招不管用了。所以紧急找了下面这个方法,需要一些人工维护工作,不完全自动了。

1. 方案

这个方案使用如下的技术手段:

2. 特点

这个自动翻墙方案有如下特点:

3. 准备工作

开始前我们需要做的准备有:

4. 安装步骤

接下来我们开始动手安装

  1. 远程登录OpenWrt路由器。如果不知道如何登录,看之前的第一次登录帮助。

  2. 下载安装ShadowSocks for OpenWrt。在这里(可能需要翻墙才能打开)

    • 可以找到源代码和编译好的安装包(只支持部分架构)。比如我的路由器是ar71xx架构,直接下载编译好的shadowsocks-libev-polarssl_1.4.6_ar71xx.ipk就可以了,可以运行:

              wget  http://shadowsocks.org/nightly/shadowsocks-libev-polarssl_1.4.6_ar71xx.ipk
              opkg  update
              opkg  install  libpolarssl
              opkg  install  shadowsocks-libev-polarssl_1.4.6_ar71xx.ipk`
  3. 尝试在路由器上运行ss-redir命令,如果打印出一堆帮助信息,说明安装正确了。如果打印出类似下面找不到链接库的错误:

            ss-redir: can't load library 'libpolarssl.so.5'

    这时就需要创建一个符号链接来解决这个问题:

            cd /usr/lib
            ln -s libpolarssl.so.1.3.4 libpolarssl.so.6
  4. 配置shadowsocks。编辑配置文件/etc/config/shadowsocks.json,将shadowsocks服务器参数写在这个配置文件里面。
    • 修改/etc/init.d/shadowsocks,把所有ss-local替换为ss-redir。
  5. 然后重启shadowsocks。

            /etc/init.d/shadowsocks enable
            /etc/init.d/shadowsocks restart
  6. 下载中国CDN域名列表,放在/etc/dnsmasq.d/目录下。(如果没有这个目录,先创建它。)

  7. 在/etc/dnsmasq.conf文件中加入如下一行:

            conf-dir=/etc/dnsmasq.d
  8. 重启dnsmasq:

            /etc/init.d/dnsmasq restart
  9. 创建一个新文件/etc/init.d/ss-tunnel,带如下内容:

            #!/bin/sh /etc/rc.common
    
            START=95
    
            SERVICE_USE_PID=1
            SERVICE_WRITE_PID=1
            SERVICE_DAEMONIZE=1
    
            CONFIG=/etc/shadowsocks.json
    
            start() {
                service_start /usr/bin/ss-tunnel -c $CONFIG -l 5353 -L 8.8.4.4:53 -u
            }
    
            stop() {
                service_stop /usr/bin/ss-tunnel
            }
  10. 运行下面这个命令来启动ss-tunnel:

            /etc/init.d/ss-tunnel enable
            /etc/init.d/ss-tunnel start
  11. 安装iptables nat-extra、geoip模块。

            opkg update
            opkg install iptables-mod-geoip
            opkg install iptables-mod-nat-extra
  12. 生成IP国家信息数据库。在某台Mac或者Linux上下载并解压缩xtables-addons源码

    • 然后按照这篇文档的步骤生成IP数据库。如果不介意较老的数据库,可以直接从这里下载一个生成好的。

  13. 将中国的IP信息(CN开始的文件)拷贝到路由器/usr/share/xt_geoip/BE或者/usr/share/xt_geoip/LE。
    • 是BE还是LE取决于你的路由器的CPU架构是Big Endian还是Little Endian。如果你不确定你的路由器是什么架构类型, 可以两个目录都放进去。
  14. 将如下防火墙规则写入 /etc/firewall.user 。将TCP流量重定向到shadowsocks。(假设shadowsocks的本地端口是1080)

            iptables -N fuckgfw -t nat
            iptables -F fuckgfw -t nat
    
            #bypass DNS servers
            iptables -A fuckgfw -t nat -p tcp -d 8.8.8.8 -j RETURN
            iptables -A fuckgfw -t nat -p tcp -d 8.8.4.4 -j RETURN
            iptables -A fuckgfw -t nat -p tcp -d 208.67.222.222 -j RETURN
            iptables -A fuckgfw -t nat -p tcp -d 208.67.220.220 -j RETURN
    
            #bypass local connections
            iptables -A fuckgfw -t nat -p tcp -d 192.168.0.0/16 -j RETURN
            iptables -A fuckgfw -t nat -p tcp -d 172.16.0.0/12 -j RETURN
            iptables -A fuckgfw -t nat -p tcp -d 10.0.0.0/8 -j RETURN
            iptables -A fuckgfw -t nat -p tcp -d 127.0.0.0/8 -j RETURN
    
            #bypass iOS notification, PPTP and other connections
            iptables -A fuckgfw -t nat -p tcp -d 17.0.0.0/8 --dport 5223 -j RETURN
            iptables -A fuckgfw -t nat -p tcp --dport 1723 -j RETURN
    
            #Redirect all others to Shadowsocks
            iptables -A fuckgfw -t nat -p tcp -j REDIRECT --to-port 1080
    
            #goto fuckgfw chain if the destination is not China IP
            iptables -A prerouting_rule -t nat -m geoip -p tcp ! --destination-country CN -j fuckgfw
  15. 重启firewall

         # /etc/init.d/firewall restart
  16. 这时可以测试自动翻墙功能是否工作。可以打开 http://icanhazip.com/ 这个网页,看看现在IP是不是你的国外ShadowSocks

    • 服务器的IP。然后打开 http://pv.sohu.com/cityjson 这个网页,看显示的是不是ISP提供的国内IP地址。 测试是否能打开facebook和youtube。如果都可以,大功告成!

5. 变化

本方案可以有以下一些变化的方案

ch3n2k.com | Copyright (c) 2004-2020 czk.