Shadowsocks + GfwList 实现 OpenWRT / LEDE 路由器自动翻墙

本站发布的三种 shadowsocks 在 openwrt 上的自动翻墙方案:

1、Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动翻墙
2、Shadowsocks + Redsocks 实现 OpenWRT 路由器自动翻墙 (停止更新)
3、Shadowsocks + GfwList 实现 OpenWRT / LEDE 路由器自动翻墙

本方案依靠GFWList,List中的域名站点走代理,不在List中的域名不走代理,根据域名判断。然而其实本质上依然是根据IP判断是否代理IP走代理,dnsmasq-full可以将解析域名得到的IP加到一个ipset中,利用这个ipset来判断走不走代理。实际是完成了gfwlist(域名列表)到dnsmasq的ipset规则再到IP地址的转换。同样,本方案依然可以搭配ChinaDNS搭配使用,也可以使用ss-tunnel,或者是自己的DNS服务器。

本方案的优点明确,只有被墙的站点才走代理,但是gfwlist并不能100%涵盖被墙站点,而且有些国外站点直连速度远不如走代理,特别是你代理服务器速度较快,希望通过代理加速国外访问时,此方案就不是那么好用了。请酌情选择你所使用的方案。

注:由于近期OPENWRT/LEDE的一系列变化,以及作者aa65535的一系列更改,本文需要更新,下面的步骤仅供参考!本人应该会在近期休假期间更新本文。不排除鸽的可能:)

一、安装

方法一: 添加作者的软件源,直接利用opkg命令安装 (此方式快捷方便,推荐!)

软件源位置:http://openwrt-dist.sourceforge.net/packages/

前提是所用网络环境直连sourceforge.net和downloads.lede-project.org没有问题。此处仅提供LEDE 17.X 的步骤。

首先添加 a65535 的 gpg key,只有这样,第三方的包才能通过签名验证。执行:

打开Luci,定位到“系统”-“软件包”-“配置”选项卡,在“自定义feeds”末尾加入两行并点击“提交”:

请根据自己的CPU架构(可以执行 opkg print-architecture 查看,或者参考“发行版软件源”里的URL里的文本),将mipsel_24kc替换成相应的文本,最后点击提交。

然后执行命令 opkg update 更新软件列表,然后执行下列命令安装依赖包以及shadowsocks相关的软件:


方法二: 手动下载软件包,上传至路由器后安装

依赖列表
LEDE 安装步骤
二、配置shadowsocks

1、配置 /etc/shadowsocks.json ,格式如下:

请自行修改好服务器IP、端口号、密码、加密方式。

新建文件: /etc/init.d/shadowsocks :

修改文件权限:

然后启动shadowsocks,并设置开机运行:

最后检查一下是否正常启动了:

如果未能正确启动,尝试手动执行,看看报什么错:

额外的优化:

开启 TCP Fast Open (TCP快速打开,缩略为TFO)

需求: 系统内核版本≥3.7,shadowsocks-libev≥3.0.4,shadowsocks服务端开启tcp fast open。

修改 /etc/sysctl.conf ,加入如下一行:

执行如下命令使之生效:

配置文件 /etc/shadowsocks.json 增加一行:

最后重启一下shadowsocks即可:

 

2、配置dnsmasq和ipset

2.1. 将如下规则加入到“网络→防火墙→自定义规则”中(最后的1080是shadowsocks的本地端口 酌情修改):

如果你需要

2.2. 修改dnsmasq配置:

OPENWRT:

修改 /etc/dnsmasq.conf,在最后加入 conf-dir=/etc/dnsmasq.d

LEDE:

执行:

如果返回值为 uci: Entry not found 或者其他非  /etc/dnsmasq.d 的值,则执行:

2.3 添加gfwlist和China-List配置文件:

新建并进入目录  /etc/dnsmasq.d ,下载 dnsmasq_gfwlist_ipset.conf 后放入该目录。

自动生成配置文件的脚本,本人放在这里:https://github.com/cokebar/gfwlist2dnsmasq

你可能需要自行修改这个文件,格式如下:

三、配置防污染DNS

1. 步骤一,有三个方案:

方案一 (由于不加密 所以有风险 不推荐):

在代理服务器上搭建DNS服务来解析国外网站,可用dnsmasq或者pdnsd,监听非53端口。

比如说DNS服务器IP是:3.4.5.6,端口是5050,那么使用替换功能将 /etc/dnsmasq.d/dnsmasq_list.conf 里面的 127.0.0.1#5353 全部替换成 3.4.5.6#5050 即可。

最后重启路由器即可。

方案二 (如果此方案较稳定那么推荐这个方案 不过不少ISP会出现UDP方式不稳定的情况,如果遇到请用方案三):

使用ss-tunnel转发UDP的DNS请求,修改 /etc/init.d/shadowsocks 文件,如需修改上游DNS,请修改 DNS=8.8.8.8:53 字段,本地端口修改 TUNNEL_PORT=5353 :

最后重启路由器即可。

方案三:使用dns-forwarder将DNS转成TCP后走ss代理解析:

dns-forwarder的安装可参考:《Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动翻墙》一文中的安装部分,到文中提到的地址,下载安装dnsforwarder_x.x.xx_xxxx.ipk,luciappdnsforwarder_x.x.xx_all.ipk即可。

配置也很简单,luci界面,“服务”→”DNS 转发”(英文界面是DNS Forwarder),如图配置:

最后需要在自定义防火墙规则里再增加一句,来确保8.8.8.8是走代理的:

其他TCP查询方式可以参考:

TCP 方式查询解决 DNS 污染问题


2. 步骤二

在WAN口配置中如图所示,将DNS手动指定为127.0.0.1:

ss222

最后在DHCP/DNS设置中将你的ISP的DNS填入(或者使用114DNS等公共DNS)

dnsmasq_localdns

 

最后你可能需要重启一下路由器,以及清空一下你的PC/PED设备的DNS缓存。


PS1:发现有不少人之前用过chnroute方案,然后改成gfwlist方案,此时记得把忽略解析文件的勾选去掉并把原来的设置填回去:

problem1

 

四、其他

一些强烈推荐的额外设置项(涉及到更新、维护)可以参考:《Shadowsocks for OpenWRT / LEDE 拾遗》

需要自己搭建服务器的,可以参考:shadowsocks – libev 服务端的部署

推荐的VPS商家见:https://cokebar.info/about

本博客有关 shadowsocks 文章合集目录

五、写在最后

本人作为一名普通使用者,水平有限,且文章也缺乏校审,肯定有错误存在,也有很多能改进的地方,如有意见或建议,请留言指出,万分感谢! 如果使用时遇到问题也欢迎留言,本人如果有空都会回复,不过请一定要将出错信息贴出来,有些错误信息需要到系统日志中查看。

 


参考文章:https//kyonli.com/p/18

601 条评论

  1. WarIsNotOver 回复

    请问gfwlist如何能保持更新呢?在chrome的SwitcyOmega插件里可以设置自动更新,更新源为:https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt

    1. WarIsNotOver 回复

      是不是到这里https://github.com/cokebar/gfwlist2dnsmasq,用你的Shell script转换出来就是最新的?或者直接下载你已经转好的。

      1. cokebar 文章作者 回复

        我的脚本转出来的就是最新的,我转好的那个每周更新一次

  2. 龙卷风 回复

    ipv6 环境下 iptable应该如何配置?

  3. Dingles 回复

    请问飞羽,最新版的dnsmasq2.8是不是已经包含了dnsmasq-full对ipset的支持了,我看官网的manpage里面有–ipset的选项,就是不知道openwrt里面的dnsmasq和dnsmasq-full是不是一样的

    1. cokebar 文章作者 回复

      dnsmasq是开源软件,openwrt只是用了它而已,dnsmasq编译时候有很多可调选项,ipset的支持就是可调的,支持ipset是可以的,编译时配置好相应的选项即可,不过编译后体积会更大一点,而且有需要额外引入ipset等依赖包,增加了对存储空间的需求;由于dnsmasq对ipset的支持功能本就用的人不多,而且openwrt面向路由器,固件不宜体积过大,因此官方编译时候分了dnsmasq, dnsmasq-full等多个版本,dnsmasq-full是全功能版本,依赖最多占用空间最大,rom里默认带的是dnsmasq,不支持ipset,体积较小

  4. 引用: 尝试使用Openwrt固件,发现几个问题 | ym满血复活

  5. googn 回复

    从博主的博客学到很多
    非常感谢博主。
    关于dns,建议增加方案四,个人已经使用很久
    安装dnscrypt-proxy即可,默认就是本地5353端口进行dns解析。
    其余配置,按照博主的内容就行。

    1. cokebar 文章作者 回复

      为了优化走代理时候的DNS解析,需要让代理服务器转发DNS请求,因此如果用dnscrypt,则需要在代理服务器上安装服务端程序,这对于大部分人是无法实现的

  6. dalton 回复

    方案3一点不过时,很好用,谢谢。
    一个小问题:手动添加条目,有什么快捷一些的办法呢?比如telegram的IP,很多条。我想维护自己的一个列表文件,里边只有单纯的IP,有没有现成的脚本把它变成dnsmasq可用的.conf?

    1. dalton 回复

      收回。这个问题太蠢了。

  7. dalton 回复

    综合了一下实现过程的shell命令,看会不会对大家有用:
    1,安装部分。为省事,wget用了不安全方式,不足为训。
    wget -qO /tmp/openwrt-dist.pub http://openwrt-dist.sourceforge.net/openwrt-dist.pub
    opkg-key add /tmp/openwrt-dist.pub
    ARCH=$(opkg print-architecture | awk ‘END{print $2}’)
    echo “src/gz openwrt_dist http://openwrt-dist.sourceforge.net/packages/base/$ARCH” >>/etc/opkg/customfeeds.conf
    echo “src/gz openwrt_dist_luci http://openwrt-dist.sourceforge.net/packages/luci” >>/etc/opkg/customfeeds.conf
    opkg update
    opkg install ip-full ipset iptables-mod-tproxy libpthread libustream-openssl coreutils-base64
    opkg install shadowsocks-libev luci-app-shadowsocks dns-forwarder luci-app-dns-forwarder
    二,配置SS服务器,还是在luci中操作较方便。然后:
    uci set dns-forwarder.@dns-forwarder[0].enable=’1′
    uci set dns-forwarder.@dns-forwarder[0].listen_port=’5353′
    uci commit dns-forwarder
    uci set shadowsocks.@access_control[0].wan_bp_list=’/dev/null’
    uci set shadowsocks.@access_control[0].wan_fw_ips=’8.8.8.8′
    uci add_list shadowsocks.@access_control[0].wan_bp_ips=’0.0.0.0/1′
    uci add_list shadowsocks.@access_control[0].wan_bp_ips=’128.0.0.0/1′
    uci add_list shadowsocks.@access_control[0].lan_target=’SS_SPEC_WAN_AC’
    uci commit shadwosocks
    /etc/init.d/shadowsocks restart
    三,dnsmasq部分
    cd
    wget –no-check-certificate https://github.com/cokebar/gfwlist2dnsmasq/raw/master/gfwlist2dnsmasq.sh
    mkdir /etc/dnsmasq.d
    sh gfwlist2dnsmasq.sh -i -d 127.0.0.1 -p 5353 -s ss_spec_dst_fw -o /etc/dnsmasq.d/dnsmasq_gfwlist.conf
    echo -e ‘conf-dir=/etc/dnsmasq.d\ncache-size=10000\nmin-cache-ttl=1800’>>/etc/dnsmasq.conf
    /etc/init.d/dnsmasq restart

    别的没了。

1 2 20 21 22 23 24

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请输入验证码 * 请输入正确的验证码