My Blog, written in golang!

在dd-wrt上安装dnsmasq-full和ipset

发表于 2017/01/14 13:53  |  分类于 dd-wrt

上一篇中我们成功安装了shadowsocks,并能正常使用。但是所有流量都会经过shadowsocks,这不是我们想要的。

所以我们需要更智能的代理方式,比如只代理gfwlist中的网站,其他网站直连

dnsmasq+ipset+iptables+ss-redir透明代理的组合可以很方便的实现这样的需求。

但是dd-wrt自带的dnsmasq和iptables并不支持ipset。我们通过安装entware-ng中的dnsmasq-fulliptables来解决。同时安装chinadns来解决dns污染。

  1. 安装必要的软件

    # opkg install dnsmasq-full iptables chinadns
    
  2. 取消dnsmasq-full自启动

    /opt/etc/init.d/S56dnsmasq中的ENABLED=yes修改成ENABLED=no

  3. 通过下面的命令来替换系统的dnsmasq和iptables

    # stopservice dnsmasq
    # stopservice iptables
    # mount -o bind /opt/sbin/dnsmasq /usr/sbin/dnsmasq
    # mount -o bind /opt/sbin/iptables /usr/sbin/iptables
    # startservice dnsmasq
    # startservice iptables
    
  4. 使用chinadns

    1. 启动chinadns

      # mv /opt/etc/chinadns_chnroute.txt /opt/etc/chinadns_chnroute.txt.bak
      # curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' >  /opt/etc/chinadns_chnroute.txt
      # /opt/etc/init.d/S56chinadns start
      
    2. 配置[服务 - 服务 - DNSMasq 附加选项]后点击应用

然而我们依然缺少最关键的ipsetentware-ng中的ipset4并不能在dd-wrt的linux 4.4内核中使用)。

万幸的是,经过google后,发现已经有热心的网友编译了适合linux 4.4内核的ipset以及内核模块xt_set.ko

(2017/08/10更新)根据 https://github.com/jamesmacwhite/ipset-netgear-r7000-dd-wrt 编译得到 ipsetxt_set.ko

  1. 下载ipset并放到/opt/sbin/ipset(或者直接使用上述网址内的 ipsetxt_set.ko

  2. 下载xt_set.ko并放到/opt/lib/ipset/xt_set.ko

  3. 修改/opt/etc/init.d/S22shadowsocks,将PROCS=ss-local修改成PROCS=ss-redir,并重启shadowsocks

    # /opt/etc/init.d/S22shadowsocks restart
    
  4. 输入下面的命令来使用ipset

    # insmod /opt/lib/ipset/xt_set.ko
    # /opt/sbin/ipset create vpn iphash -exist
    # /opt/sbin/ipset flush vpn
    # /opt/sbin/iptables -t nat -A PREROUTING -p tcp -m set --match-set vpn dst -j REDIRECT --to-port 1080
    
  5. 使用dnsmasq-gfwlist.py将gfwlist转换成ipset规则,并放到/opt/etc/dnsmasq.d/gfwlist.conf

    # python dnsmasq-gfwlist.py
    # cp gfwlist.conf /opt/etc/dnsmasq.d/gfwlist.conf
    
  6. [服务 - 服务 - DNSMasq 附加选项]增加conf-dir=/opt/etc/dnsmasq.d/,*.conf后点击应用

最后,我们可以将以上命令放到[管理 - 命令]里面,以达到开机启动的目的。

  1. [启动]中添加

    mount -o bind /jffs/opt /opt
    insmod /opt/lib/ipset/xt_set.ko
    stopservice dnsmasq
    stopservice iptables
    mount -o bind /opt/sbin/dnsmasq /usr/sbin/dnsmasq
    mount -o bind /opt/sbin/iptables /usr/sbin/iptables
    startservice dnsmasq
    startservice iptables
    /opt/etc/init.d/rc.unslung start
    /opt/sbin/ipset create vpn iphash -exist
    /opt/sbin/ipset flush vpn
    
  2. [防火墙]中添加

    /opt/sbin/iptables -t nat -D PREROUTING -p tcp -m set --match-set vpn dst -j REDIRECT --to-port 1080
    /opt/sbin/iptables -t nat -A PREROUTING -p tcp -m set --match-set vpn dst -j REDIRECT --to-port 1080
    

至此,透明代理配置完成。连上路由器后应该能顺利打开google等qiang外网站了。


ipsetxt_set.ko以及dnsmasq-gfwlist.py来自以下地址,表示感谢!

http://koolshare.cn/thread-47381-1-1.html
http://www.dd-wrt.com/phpBB2/viewtopic.php?p=1044858
https://gist.github.com/lanceliao/85cd3fcf1303dba2498c