OpenWrt Shadowsocks 安装&配置指南

简介

文章介绍了 OpenWrt 下 Shadowsocks 和其配套软件的逻辑通信架构以及安装、配置的详细过程,最终可在 OpenWrt 路由器上实现透明代理翻墙。

软件逻辑架构

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 转发服务器,本方案下 Dnsmaq 接收来自局域网的 DNS 请求后直接转发给 ChinaDNS 处理;ChinaDNS 利用国内 DNS 和 ss-tunnel 链接的境外 DNS,可解决 DNS 污染问题;ss-tunnel 负责转发本地 DNS 请求至 ss-server,借由 ss-server 连接指定的境外 DNS 服务器。

ChinaDNS 的原理,摘录如下:

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

安装 Shadowsocks

由于 OpenWrt 内建的 wget 不支持 TLS,无法下载 HTTPS 软件包,因此要先安装完整版的 wget 和 CA 证书软件包。

SSH 进入 OpenWrt 后执行

# 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

安装 ChinaDNS

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

前往下列项目主页下载安装最新版本 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

安装好后如图所示:

配置 Shadowsocks

  • Servers Manage

按照实际情况填写你的 Shadowsocks 代理服务器信息,无其他特别的配置。

  • General Settings

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

  • Access Control

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

Bypassed IP List 选择 ChinaDNS CHNRoute

配置 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 配置示例

配置 Dnsmasq

OpenWrt 管理面 Network -> DHCP and DNS

DNS forwardings 修改为 127.0.0.1#5353 即 ChinaDNS 监听的端口;勾选 Ignore resolve file(不使用 /etc/resolv.conf 中的 DNS 即电信运营商分配的 DNS)。

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

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


广告:如果你正在寻找服务器搭建 ss-server,可使用下面的链接购买 Vultr VPS,使用满 $10 双方将各获得 $10 优惠,优惠活动长期有效。

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

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

  2. 这个文章很不错,对我帮助挺大,谢谢
    我以前一直使用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,实在是没有找到办法.
    多谢

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

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

  4. 您好,您安装的是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 软件源,也可直接命令行安装”
            这个软件源就是文章一开始添加的那个。现在稍微修改了一下文章。

发表评论

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