OpenWrt 透明代理配置并解决 Chromecast 的更新问题
Jul 22, 2014暑假了,弟弟来这里,顺便把我买的 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_PROXY
和 http_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 污染的问题,主要有以下优点:
- 不用配置服务端。
- 无需多余配置,运行即可使用。
- 自动优化国内国外解析。
运行 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 了,哈哈。