OpenWrt Shadowsocks 安装&配置指南

简介

本文先介绍了 OpenWrt Shadowsocks 及其配套软件的逻辑架构,然后详细说明了它们的安装、配置过程,最终实现国内 IP 直连,其余走代理的黑名单规则透明翻墙路由器。

提示:要使用 GFWList 白名单规则(即仅被 GFW 封锁的流量走代理),请参阅:《OpenWrt Shadowsocks GFWlist 配置教程》。博主推荐使用本文所述的 CHNRoutes 黑名单规则,能够避免部分 GFWList 遗漏的网站无法访问,并且加速外网访问速度(依赖 Shadowsocks Server 的网络性能)。

软件逻辑架构

Shadowsocks for OpenWrt 是基于 shadowsocks-libev 移植的,包含 ss-local、ss-redir ss-tunnel 三个组件。此外,一个完整的 Shadowsocks 透明代理解决方案还包括 ChinaDNS 和远程 Shadowsocks 服务器等配套服务,整体逻辑架构图如下

OpenWrt Shdowsocks 逻辑架构图
OpenWrt Shdowsocks 逻辑架构图 (仅单向数据流)

其中,ss-redir 负责将 OpenWrt 的 TCP/UDP 出口流量透明地转发至境外 shadowsocks 代理服务器;ss-local 是本地 SOCKS5 代理服务器,可额外地为浏览器等客户端应用提供 SOCKS5 代理服务;Dnsmaq 是 OpenWrt 的默认 DNS 转发服务,本方案中负责接收来自局域网的 DNS 请求后转发给 ChinaDNS 处理;ChinaDNS 是一个开源的防 DNS 污染解决方案,它通过 ss-tunnel 转发 DNS 请求到墙外服务器,从而获取无污染的解析结果。

Step 1 – 安装 Shadowsocks

首先,由于 OpenWrt 内建的 wget 不支持 TLS,无法下载 HTTPS 网站上的软件包,因此 SSH 进入 OpenWrt 命令行后先安装好整版的 wget 和 CA 证书软件包

# opkg update
# opkg install wget ca-certificates

接着安装 shadowsocks  UDP-Relay (UDP 转发)功能依赖的软件包 iptables-mod-tproxy

# opkg install iptables-mod-tproxy

最后,前往下列项目主页下载安装最新预编译版本 shadowsocks-libev 及其 luci 前端。注意,要选择 current 目录下正确的硬件架构版本,使用 opkg print-architecture 命令查看你的路由器硬件架构,例如博主是 x86_64

提示:(推荐)使用软件源方式安装 Shadowsocks,方法见下文

# cd /tmp
# wget https://xxx.ipk
# opkg install xxx.ipk

openwrt-dist 软件源安装方法:

添加软件源公钥

# wget http://openwrt-dist.sourceforge.net/packages/openwrt-dist.pub
# opkg-key add openwrt-dist.pub

添加软件源到配置文件,注意命令中 x86_64 替换为你的硬件架构

# vim /etc/opkg/customfeeds.conf

src/gz openwrt_dist http://openwrt-dist.sourceforge.net/packages/base/x86_64
src/gz openwrt_dist_luci http://openwrt-dist.sourceforge.net/packages/luci

安装 shadowsocks-libev、luci-app-shadowsocks

# opkg update
# opkg install shadowsocks-libev
# opkg install luci-app-shadowsocks

Step 2 – 安装 ChinaDNS

国内运营商网络 DNS 污染严重,导致大量境外域名无法正确解析,而 shadowsocks-libev 本身并没有解决 DNS 污染问题,需要配合 ChinaDNS 来解决此问题,其解决 DNS 污染的思路如下:

ChinaDNS 分国内 DNS 和可信 DNS。ChinaDNS 会同时向国内 DNS 和可信 DNS 发请求,如果可信 DNS 先返回,则采用可信 DNS 的数据;如果国内 DNS 先返回,又分两种情况,返回的数据是国内的 IP, 则采用,否则丢弃并转而采用可信 DNS 的结果。

前往下列项目主页下载安装最新版本 ChinaDNS (选择 current 目录下特定硬件平台版本) 及其 luci APP

# cd /tmp
# wget https://xxx.ipk
# opkg install xxx.ipk

如果先前你按本文所述方法添加了 openwrt-dist 源,也可直接命令行安装

# opkg install ChinaDNS
# opkg install luci-app-chinadns

立即更新 ChinaDNS 的国内 IP 路由表 /etc/chinadns_chnroute.txt

# wget -O /tmp/delegated-apnic-latest 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' && awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' /tmp/delegated-apnic-latest > /etc/chinadns_chnroute.txt

编辑 crontab 任务计划,每周一凌晨 3 点更新 chinadns_chnroute.txt

# crontab -e

0 3 * * 1    wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest -O /tmp/delegated-apnic-latest && awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' /tmp/delegated-apnic-latest > /etc/chinadns_chnroute.txt

# /etc/init.d/cron start
# /etc/init.d/cron enable

验证 crontab 任务是否正确执行

# logread | grep crond

注意:不要直接使用 vim 编辑 /etc/crontabs/root 文件;更新任务已经过优化,网络连接失败的情况下不会覆写 /etc/chinadns_chnroute.txt;你也可使用 ipip.net 整理好的国内 IP,可能更为准确,更新命令:

wget --no-check-certificate https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt -O /tmp/china_ip_list.txt && mv /tmp/china_ip_list.txt /etc/chinadns_chnroute.txt

安装好后如图所示:

Step 3 – 配置 Shadowsocks

  • Servers Manage

管理 Shadowsocks 服务器节点。按照实际情况填写你的 Shadowsocks 代理服务器信息即可。

注意:如果要开启 TCP Fast Open 选项,需要修改 sysctl.conf 添加一行net.ipv4.tcp_fastopen = 3,然后使之生效。命令如下

# echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf
# sysctl -p
  • General Settings

使能 Transparent ProxyPort Forward,其中 UDP-Relay 是 UDP 转发功能,这里要将其开启,其余配置项保持默认即可。

  • Access Control

Shadowsocks 的访问规则控制。一种合适规则是国外网站走 Shadowsocks 代理而国内网站直连,这样通常还可以加速国外网站,配置如下:

Bypassed IP List 选择 ChinaDNS CHNRoute

Step 4 – 配置 ChinaDNS

勾选 Also filter results inside China from foreign DNS servers、将上游 DNS 修改为 114.114.114.114,127.0.0.1:5300 (前者用于解析国内域名,后者为 ss-tunnel 提供的 DNS 端口转发服务,将由远程服务器解析国外网站),然后启动 ChinaDNS。

如图所示

ChinaDNS 配置示例
ChinaDNS 配置示例

Step 5 – 配置 Dnsmasq

OpenWrt 管理面 Network -> DHCP and DNS

DNS forwardings 修改为 127.0.0.1#5353 即 ChinaDNS 监听的端口;勾选 Ignore resolve file

提示:Ignore resolve file 指的是忽略 /etc/resolv.conf 中的 DNS ,即 WAN 口的 DNS,默认是电信运营商分配的 DNS;要恢复默认选项(取消勾选),在 填入 /tmp/resolv.conf.auto

 

Step 6 – 让路由器自身也翻墙(可选)

到此步骤为止,之前的配置已足以让接入局域网的设备正常翻墙,但为了让路由器自身发起的连接也能够翻墙成功,需要将 WAN 口默认使用的运营商 DNS 修改为 ChinaDNS

如图所示,在 Network - Interfaces - WAN - Advanced Settings 中去掉 Use DNS servers advertised by peer ,并在配置栏中填入 127.0.0.1

OpenWrt WAN DNS config

至此,一切准备就绪,Enjoy yourself! 🙂

相关文章Shadowsocks 客户端使用教程


广告:正在寻找服务器搭建 ss-server?使用博主的推广链接购买 Vultr VPS,使用满 $10 双方将各获得 $10 优惠。此活动永久有效。

2019 限时活动:点此链接购买 Vultr VPS,可获取 $50 优惠券。

《OpenWrt Shadowsocks 安装&配置指南》上有39条评论

  1. 还有我看你的示意图,貌似只有DNS查询才分区分国内和国外分别查询。
    但是DNS查询完之后,的所有通讯,全部都是交给SS服务器完成的,这岂不就是全局代理了么?访问国内网站的时候性能是不是会有问题呢?

    1. 不是的。一方面 ChinaDNS 解决了 DNS 污染问题,这是独立于Shadowsocks 之外的; 另一方面,Shadowsocks 本身具有访问控制(Access Control)功能,通过 Bypassed IP List 决定不同 IP 的代理规则(本案例下是国内不走代理)。

  2. 100%按照你的步骤做的,但是无法FQ的。
    局域网访问正常。但是外网无法访问。
    配置和你的完全一样。

  3. 在OpenWRT18.06.1上安装shadowsocks无论是自带的,还是openwrt-dist.sourceforge.net上的,界面上已显示ss_local等已运行,就是不能代理。请问是什么原因。
    另外在PC上安装PC端的SS客户端,运行正常。

          1. 确实是dns问题,不使用Chinadns部分国外网站是可以访问的,但是谷歌不行,估计是dns污染。chinadns的日志咋看?logread没看到啥。

          2. 你仔细看一下OpenWrt系统DNS是否指向ChinaDNS(127.0.0.1:5353端口),ChinaDNS指向Shadowsocks(127.0.0.1:5300)。你也可以绕过ChinaDNS,直接指向Shadowsocks来测试一下问题所在。另外,由于存在缓存,你可能要重启一下路由器。

          3. 我看了一下配置,貌似没问题,能说一下咋明确的确认么?我试试直接指向shadowsocks的dns试试。多谢

  4. 感谢博主的教程。在这篇文章的帮助下成功通过路由器翻出去了。不过我发现别的网站都没问题,就是”google.com”上不去(手机电脑都上不去),提示“Your connection is not private”;清除了一下浏览器缓存,提示403错误,“You don’t have authorization to view this page.”;换用电脑上的shadowsocks的话google.com能正常使用。不知博主有没有遇见过这种问题?

  5. 这个文章很不错,对我帮助挺大,谢谢
    我以前一直使用openwrt中默认的版本,后来使用这个方式可以直接安装最新的ss版本
    不过最新牌的luci好像没有单独设置路由器的ss-server功能选项了,是吗?
    楼主有没有在路由器上面安装ss-server来当服务器,供客户端方问?我在国外一个路由器上面安装好了ss-server,不管怎么设置,总是有一部分的https网站不能访问,一部分能够正常访问,新旧版本,包括dns转发都设置过,加不加chinadns都一样,因为路由器在国外,所以不需要dns转发,就是不能正常使用,是不是路由器的openwrt的包不完全呢?
    一部分网站不能访问,提示ERR_CONNECTION_CLOSED或者ERR_SSL_PROTOCOL_ERROR,后台日志错误 ERROR: getpeername: Socket not connected,实在是没有找到办法.
    多谢

  6. 我想請問一下,shadowsocks for openwrt 在代理服務器的部分只能填寫 ip,不能填寫 domain name,這個有辦法解決嗎?因為我使用的服務商提供的是 domain name,估計 ip 是會浮動的。

    1. 目前的版本是不具备这个功能的,你可以到项目主页给作者提需求。我想到的一种解决办法是写一个计划任务,内容是定期解析服务商的域名然后将结果更新到 Shadowsocks 的配置中。

  7. 您好,您安装的是openwrt18.06吗?为什么我从软件包下载的是shaoesocks-libev ,和您这个不一样呢?能教教我怎么配置吗?

    1. 您好,Shadowsocks for OpenWrt 就是基于 shadowsocks-libev 移植开发的,所以你评论所说的是正常的。此外,可以描述一下你的具体问题?

      1. 非常感谢您的回复,我感觉这个配置非常的复杂,具体的说分三个部分,由于不能贴上图片,我只能尽量说明白,希望您能够看明白。
        包括三个部分:Local Instances;Remote Servers 和 Redir Rules。
        1. Local instances,就是本地设置了,我的和这个帖子(http://www.right.com.cn/forum/thread-325781-1-1.html)里面的图片一致。(由于您的博客里面无法贴出图片,而且这个我用语言也描述部清楚,只好引用别的网站,见谅)。
        2.Remote Servers,这个我还算清楚,我的和这个帖子(https://github.com/openwrt/packages/issues/4614)里面的Remote servers一样,但我不是很了解那个 KEY(base64 encoding)这个选项是什么意思。
        3.Redir Rules,这个应该是规则了,这个我是完全不知道怎么弄了,我的和这个帖子一模一样(https://github.com/shadowsocks/openwrt-shadowsocks/commit/ad53569e9b487ffd9e68cdf6e6ece8066b63f669#comments)。

        1. # opkg install ChinaDNS
          # opkg install luci-app-chinadns
          这两个安装包根本就不存在,或许您自己添加了别的源,但博客里面并没有提示。

          1. 其实有提示,不过确实不明显
            提示是:“如果先前你已添加了 openwrt-dist 软件源,也可直接命令行安装”
            这个软件源就是文章一开始添加的那个。现在稍微修改了一下文章。

发表评论

电子邮件可用于接收评论通知,但不会被公开。必填项已用 * 标注。