暑假了,弟弟来这里,顺便把我买的 MW4530R 从家里带过来了,花了两天时间重新刷了一下 OpenWrt 固件并设置了 Shadowsocks 的透明代理,顺便把 Chromecast 不能更新的问题解决了,这里将整个过程记录一下。

更新 OpenWrt 固件

以前在淘宝购买的时候就已经刷好了 OpenWrt 的固件了,固件版本比较老,会产生一系列的问题,浪费了我很多时间,所以第一步应该更新固件到 OpenWrt trunk 版本,其他版本会存在软件包过旧,造成 Shadowsocks 不能正常使用的问题。

OpenWrt trunk 源下载对应平台的固件,我的路由器是 MW4530R,是 ar71xx 平台的,并且直接通过 web 端升级,就下载了 openwrt-ar71xx-generic-mw4530r-v1-squashfs-factory.bin

刷机过后 telnet 修改密码,Opkg 安装 luci 等这些就不赘述了。

现在稳定版分支已经支持了,直接到 OpenWrt 官网下载稳定版就行了。由于我已经刷过 OpenWrt 了,所以选择了 sysupgrade 版本,请注意选择版本。Barrier Breaker 固件下载地址

安装 Shadowsocks

Shadowsocks 官网下载对应平台的 ipk 软件包,我的是 1.4.6_ar71xx.ipk现在可以直接从源中安装了

opkg update
opkg install shadowsocks-client

会自动安装依赖软件包。如果你和我一样不幸的 downloads.openwrt.org 被墙了,由于 opkg 使用的是 wget 来进行下载的,可以在本机用 goagent 设置好 http 代理,并在路由器上配置 http_proxy 环境变量来设置全局代理,记得把 HTTP_PROXYhttp_proxy 都设置好。

安装好了可以配置一下 Shadowsocks 配置文件,一般放在 /etc/config/ 下。注意启动时会提示 libpolarssl.so.5,这里只需要创建一个软链接就行了。现在已经不需要这样做了。

安装并配置 iptable

为了实现 iptables 流量转发到端口的功能,即支持 --to-ports 参数,需要安装 iptables-mod-nat-extra 包

opkg update
opke install iptables-mod-nat-extra

使用 bestroutetb 配置 iptable

按照项目说明安装。

那么怎么生成 iptable 的脚本呢?请参照 AustinChou 的这篇 ShadowSocks on OpenWRT 中提供的方法。原链接已失效,请直接下载这个脚本放到刚刚 clone 的项目根目录下,然后运行脚本就行了。由于 bestroutetb 变化比较大,此方法失效,我写了一个脚本,没有测试,有问题请反馈。记得替换 MY_SS-REDIR_SERVER_IP 为自己的 shadowsocks 所在的 ip 地址

生成的文件格式同 https://gist.github.com/everyx/1c27825a02236d2bc144

scp 传送到路由器中,我这里直接就用原名了,并放在 /usr/bin/ 中,即 /usr/bin/iptables.shadow

解决 dns 污染

虽然设置了白名单,让白名单内的网站都不通过代理,但是由于 dns 污染的原因,有时候根本就不能得到正确的 ip 地址,所以要解决 dns 污染的问题,这里提供三种方法。

1. 配置 pdnsd 解决 dns 污染(不推荐)

opkg update
opkg install pdnsd

具体配置参见配置一台基于openWRT的路由器使用shadowsocks并智能穿墙的 pdnsd 的配置小节

启动 pdnsd 并设置开机启动

/etc/init.d/pdnsd enable
/etc/init.d/pdnsd start

2. 使用 shadowsocks 提供的 ss-tunnel 解决 dns 污染(不推荐)

关于 ss-tunnel 的 udp 转发功能具体请见shadowsocks-android 的 DNS (UDP) 转发功能 - V2EX。你需要 1.4 以上的 libev 或 nodejs 实现的服务器端。如果和我一样是用的 libev 版本,那么启动时加上 -u 参数就行了。

使用一下命令来在本地 1053 端口开启转发服务。

ss-tunnel -c /etc/config/rpvhost.json -l 1053 -L 8.8.8.8:53 -u

这样你就可以通过本地的 1053 端口实现 udp 转发了,这里将 1053 的请求都转发到 google 的 public dns。

然后在 dnsmasq,将特定域名的解析使用本地 1053 端口来解析。这里直接在 /etc/dnsmasq.conf 后面加上

#Google and Youtube
server=/.google.com/127.0.0.1#1053
server=/.google.com.hk/127.0.0.1#1053
server=/.gstatic.com/127.0.0.1#1053  
server=/.ggpht.com/127.0.0.1#1053
server=/.googleusercontent.com/127.0.0.1#1053
server=/.appspot.com/127.0.0.1#1053
server=/.googlecode.com/127.0.0.1#1053
server=/.googleapis.com/127.0.0.1#1053
server=/.gmail.com/127.0.0.1#1053
server=/.google-analytics.com/127.0.0.1#1053
server=/.youtube.com/127.0.0.1#1053
server=/.googlevideo.com/127.0.0.1#1053
server=/.youtube-nocookie.com/127.0.0.1#1053
server=/.ytimg.com/127.0.0.1#1053
server=/.blogspot.com/127.0.0.1#1053
server=/.blogger.com/127.0.0.1#1053

#FaceBook
server=/.facebook.com/127.0.0.1#1053
server=/.thefacebook.com/127.0.0.1#1053
server=/.facebook.net/127.0.0.1#1053
server=/.fbcdn.net/127.0.0.1#1053
server=/.akamaihd.net/127.0.0.1#1053

#Twitter
server=/.twitter.com/127.0.0.1#1053
server=/.t.co/127.0.0.1#1053
server=/.bitly.com/127.0.0.1#1053
server=/.twimg.com/127.0.0.1#1053
server=/.tinypic.com/127.0.0.1#1053
server=/.yfrog.com/127.0.0.1#1053  

3. 「推荐」使用 ChinaDNS 解决 dns 污染

@clowwindy 的作品,无需服务器,自动优化解析效果,也是最方便的一个方法了。

首先来安装 ChinaDNS for OpenWrt。点击下载 ChinaDNS for OpenWrt ar71xx

opkg install ChinaDNS-C_1.0.0_ar71xx.ipk  # 安装
/etc/init.d/chinadns start                # 运行
/etc/init.d/chinadns enable               # 开机启动

推荐使用 ChinaDNS 的方案来解决 dns 污染的问题,主要有以下优点:

  1. 不用配置服务端。
  2. 无需多余配置,运行即可使用。
  3. 自动优化国内国外解析。

运行 iptable 设置脚本并启动 ss-redir

/usr/bin/iptables.shadow  # 设置路由:
/usr/bin/ss-redir -c /etc/config/shadowsocks.json &   # 启动 shadowsocks

解决 Chromecast 不能更新的问题

由于 Chromecast 固执的只用自家的 dns 服务,也就是 8.8.8.8 和 8.8.4.4,在国内基本上解析不到真正的 ip 了,所以这里要将所有 8.8.8.8 和 8.8.4.4 的 53 端口 的 udp 查询转到其他 dns。这里提供两种方法。

1. 使用 UnoDNS(不推荐)

获取离你最近的服务器,我这里是 176.34.53.14,然后登陆 openwrt 设置 iptable

iptables -I PREROUTING -t nat -p udp -d 8.8.4.4 --dport 53 -j DNAT --to-destination 176.34.53.14
iptables -I PREROUTING -t nat -p udp -d 8.8.8.8 --dport 53 -j DNAT --to-destination 176.34.53.14

使用这个能够观看一些存在地区限制的视频。

2. 使用本地的 dns 服务(推荐)

由于前面已经解决了 dns 污染,所以我们可以用本地的 dns 服务就行了。

# 转发到本地 53 端口
iptables -I PREROUTING -t nat -p udp -d 8.8.4.4 --dport 53 -j REDIRECT --to-ports 53
iptables -I PREROUTING -t nat -p udp -d 8.8.8.8 --dport 53 -j REDIRECT --to-ports 53

然后打开 Chromecast 就可以更新了,终于可以用 Cast Screen 了,哈哈。

参考

  1. 配置一台基于openWRT的路由器使用shadowsocks并智能穿墙
  2. ShadowSocks on OpenWRT
  3. DD-WRT : UnoTelly Customer Service