网件R7800 SS + ChinaDNS + KcpTun实现YouTuBe 4K流畅体验

本文最后更新于:2023年2月11日 凌晨

由于出口带宽的限制与拥塞,仅仅通过简单的V2ray+mKcp或者是SS+BBR实际上是很难达到YouTuBe 4K视频的流畅观影体验的,V2Ray+mKcp中由于对于kcp很难进一步定制,不像kcptun上层接口就支持灵活的定制,因此mKcp一直只能做到1080P流畅体验,切换到4K往往会比较卡顿,因此这边开始着手进行SS+Kcptun在R7800上的使用。

前言

如果有Netflix/Disney+/GPT的诉求,建议可以花4.8元(购买时输入优惠码new享8 折)买一个EFCloud,这个机场使用方法配套极其简单,全球有50+节点,也有Telegram群交流与教程,注册后有问题支持退款。另外主要是价格/性能最符合预期,通道多,有新加坡,美国等,我使用里面一个月10元一个月的200G套餐(最便宜有4.8元一个月100G的套餐,优惠券new享8折),可以作为媒体/GPT通道。

由于通过KcpTun相比于前面我们配置的V2ray来说没有复杂的混淆与动态端口,因此在一定情况下会相对轻量些,只需要不断怼流量,不过通过fast.com中测试下来的速度应该是不如V2ray方案(至少我这边测试下来的情况是的),但是测试耗时却会快很多很多,但是由于KcpTun可以有很灵活的配置,这边可以通过不断堆流量让整个速度稳定在较高的水平,因此这边的实际体验是通过SS+KcpTun可以流畅体验YouTuBe 4K视频,不过在看4K视频时R7800的CPU会稳定在30%左右:

I. 服务器端准备

这块请直接参看这篇文章: 翻墙的VPS选择与SS快速搭建与优化

这边可以特别留意的是,我这边由于一个月有1000G流量($5/月),因此我测试下来是丝毫无需顾忌流量的问题,为了确保尽可能的流畅体验,我的kcptun配置如下:

1
2
3
4
5
6
7
8
9
crypt:  blowfish
mode: fast2
mtu: 1350
sndwnd: 768
rcvwnd: 768
datashard: 10
parityshard: 3
dscp: 0
nocomp: true

II. 路由器配置Shadowsocks + ChinaDNS

首先建议可以先通过这篇文章中除V2ray部分的准备工作,然后我们再接下来操作。

1. 添加dist包

如果你不是r7800,你可以通过以下指令来确定自己的CPU架构, 然后做相应的调整:

1
opkg print-architecture|tail -n 1|awk '{print $2}'

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

1
2
wget http://openwrt-dist.sourceforge.net/packages/openwrt-dist.pub -O /tmp/openwrt-dist.pub
opkg-key add /tmp/openwrt-dist.pub

然后添加:

1
2
src/gz openwrt_dist http://openwrt-dist.sourceforge.net/packages/base/arm_cortex-a15_neon-vfpv4
src/gz openwrt_dist_luci http://openwrt-dist.sourceforge.net/packages/luci

2. 生效ChinaDNS + Shadowsocks

安装必要的包(这些包一共大约3M)

1
2
opkg update
opkg install curl bind-dig ChinaDNS luci-app-chinadns dns-forwarder luci-app-dns-forwarder shadowsocks-libev luci-app-shadowsocks

ss-redir支持 UDP代理 其依赖 ipiptables-mod-tproxy软件包:

1
2
3
opkg find ip-full
opkg find *tproxy*
opkg install ip iptables-mod-tproxy

配置

DNSmasq:

1
2
3
4
5
uci set dhcp.@dnsmasq[0].nohosts=1
uci set dhcp.@dnsmasq[0].noresolv=1
uci set dhcp.@dnsmasq[0].local=127.0.0.1#5353
uci changes
uci commit

关闭Use DNS servers advertised by peer来避免WAN接口被 上层路由器 指定DNS服务器:

1
uci set network.wan.peerdns=0

Shadowsock:

1
2
3
4
5
6
7
8
9
10
11
uci set shadowsocks.@servers[0].server=45.67.89.10
uci set shadowsocks.@servers[0].server_port=12345
uci set shadowsocks.@servers[0].password=SS_SRV_PASS
uci set shadowsocks.@servers[0].encrypt_method=chacha20-ietf-poly1305

uci set shadowsocks.@transparent_proxy[0].main_server=cfg0a4a8f

uci set shadowsocks.@access_control[0].lan_target=SS_SPEC_WAN_AC
uci set shadowsocks.@access_control[0].wan_bp_list=/etc/chinadns_chnroute.txt
uci changes
uci commit

这边要注意的是其中的cfg0a4a8f是别名,这边如果存在问题可以通过luci上进行手动调整。

Dns-Forwarder:

1
2
3
4
5
6
uci set dns-forwarder.@dns-forwarder[0].enable=1
uci set dns-forwarder.@dns-forwarder[0].listen_addr='0.0.0.0'
uci set dns-forwarder.@dns-forwarder[0].listen_port='5300'
uci set dns-forwarder.@dns-forwarder[0].dns_servers='8.8.8.8'
uci changes
uci commit

ChinaDNS:

1
2
3
4
uci set chinadns.@chinadns[0].enable=1
uci set chinadns.@chinadns[0].server='223.5.5.5,127.0.0.1:5300'
uci changes
uci commit

启动与验证

Shadowsocks:

1
2
3
4
/etc/init.d/shadowsocks enable
/etc/init.d/shadowsocks start
pgrep -lf ss
netstat -lntpu|grep ss

Dns-Forwarder:

1
2
3
4
/etc/init.d/dns-forwarder enable
/etc/init.d/dns-forwarder start
pgrep -lf dns-forwarder
netstat -lntpu|grep dns-forwarder

ChinaDNS:

1
2
3
4
/etc/init.d/chinadns enable
/etc/init.d/chinadns start
pgrep -lf chinadns
netstat -lntpu|grep chinadns

测试下DNS:

1
2
3
4
dig +short dropbox.com @223.5.5.5
dig +short dropbox.com @127.0.0.1 -p 5353
dig +short dropbox.com @127.0.0.1 -p 5300
dig +short dropbox.com

重启dnsmasq进行生效:

1
/etc/init.d/dnsmasq restart

自此已经可以翻墙,接下来我们通过KcpTun进行加速。

III. 配置KcpTun以及生效到SS上

Kcptun相对比较简单,主要通过Kcptun的执行指令+kcptun在luci上工具带的服务进行配置:

1. 添加KcpTun指令

首先我们知道R7800的CPU的架构是armv7的,因此这边直接在Release页面上直接下载对应CPU架构的包,比如这边我们R7800就直接下载kcptun-linux-arm-xxx.tar.gz到,我们解压后,只需要用其中的client_linux_arm7

我们将client_linux_arm7放到路由器的/usr/bin并重命名为kcptun,然后执行下面的命令让其拥有执行权限:

1
chmod +x /usr/bin/kcptun

2. 安装KcpTun LUCI

这里下载luci-app-kcptun_1.4.5-1_all.ipkluci-i18n-kcptun-zh-cn_1.4.5-1_all.ipk,然后通过以下指令进行安装:

1
2
opkg install luci-app-kcptun_*.ipk
opkg install luci-i18n-kcptun-zh-cn_*.ipk

3. 开启KcpTun

安装好后,通过服务->Kcptun服务中设置客户端文件/usr/bin/kcptun并且在服务端管理中添加一个KcpTun的设置(这些你应该在这里VPS上已经配置好了),添加好后,在设置中配置服务端地址为刚刚配置好的,然后点击保存并运行。

确定下客户端状态是否是显示运行中,如果不是,可以ssh登录上路由器后,通过service kcptun start进行启动即可。

需要注意的是,在Kcptun - 编辑服务端时其中的本地端口随意设置一个,比如这里我们设置为17600,还有本地监听地址这边直接设置为0.0.0.0即可。

开启后可以通过以下指令进行验证:

1
netstat -lntpu|grep kcptun

4. 配置Shadowsocks,让其走KcpTun

我们假设上面我们设置的本地端口17600,我们通过Luci界面,或者是ssh登录上去通过以下指令修改让Shadowsocks走Kcptun:

1
2
3
4
uci set shadowsocks.@servers[0].server=127.0.0.1
uci set shadowsocks.@servers[0].server_port=17600
uci changes
uci commit

至此Shadowsocks就已经走了KcpTun。

5. 其他

由于Shadowsocks依赖Kcptun,这边我们需要将Shadowsocks启动顺序延后,编辑/etc/init.d/shadowsocks将原本的START=90修改为START=99

如果有遇到域名解析是局域网域名断就解析失败的,通过到在LUCI页面上网络->DHCP/DNS->基本设置中将重绑定保护勾勾去掉即可。

IV. 自动更新ChinaDNS IP段

我这边使用的是17mon/china_ip_list这个仓库长期是有在更新的。

创建文件/bin/update_chinadns.sh并输入以下内容:

1
2
3
4
5
6
rm -rf /etc/chinadns_chnroute.txt
wget https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt -O /etc/chinadns_chnroute.txt
/etc/init.d/chinadns stop
/etc/init.d/chinadns start
/etc/init.d/shadowsocks stop
/etc/init.d/shadowsocks start

然后给到其可执行权限:

1
chmod +x /bin/update_chinadns.sh

然后通过打开路由器管理页面,通过系统->计划任务,添加0 4 * * 6 update_chinadns.sh以配置每周6凌晨4点自动刷新DNS。

V. 国内IP走默认DNS加速

考虑到国内不同运营商之间通信带宽很窄,很多站点为了加速会根据实际IP地址给到相同线路的机房,如果说我们DNS走海外服务器,就容易由于没有拿到对口线路机房IP,而访问国内站点慢。

针对这块felixc.at的开源库中总结了几乎所有国内常用站点,我们可以dnsmasq快速配置让这些域名解析直接访问DNS获得:

编辑/etc/dnsmasq.conf,修改内容为:

1
2
3
4
no-resolv
no-poll
conf-dir=/etc/dnsmasq.d
server=127.0.0.1#5353

这里默认的DNS使用127.0.0.1#5353,是因为文章前面配置了ChinaDNS监听端口5353,默认我们还是走ChinaDNS。完成/etc/dnsmasq.conf修改后,创建文件夹/etc/dnsmasq.d,并执行:

1
wget https://github.com/felixonmars/dnsmasq-china-list/raw/master/accelerated-domains.china.conf -O /etc/dnsmasq.d/accelerated-domains.china.conf

最后重启dnsmasq服务:

1
/etc/init.d/dnsmasq restart

大功告成!

VI. 检测服务存在问题自动重启kcptun

先确保必要的工具wget已经被安装:

1
2
opkg update
opkg install wget

然后我们新建一个脚本/root/test-kcptun,然后填入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
wget --spider --quiet --tries=1 --timeout=3 www.google.co.jp
if [ "$?" == "0" ]; then
# echo '['$LOGTIME'] No Problem.'
exit 0
else
wget --spider --quiet --tries=1 --timeout=3 www.baidu.com
if [ "$?" == "0" ]; then
echo '['$LOGTIME'] Problem decteted, restarting kcptun.'
/etc/init.d/kcptun restart
else
echo '['$LOGTIME'] Network Problem. Do nothing.'
fi
fi

该脚本是测试下google首页访问,如果失败,会再测试下百度首页,如果百度首页也不通说明网络存在问题就不进一步处理,如果百度首页可以通,很大程度上kcptun存在问题,就自动重启kcptun服务。

给到该脚本可执行权限:

1
chmod +x /root/test-kcptun

配置每4分钟自动执行下这个文件,并将重启操作写入/var/log/kcptun_watchdog.log,执行crontab -e添加以下:

1
4 * * * * /root/test-kcptun >> /var/log/kcptun_watchdog.log 2>&1

VII. 其他

使用wget访问https协议链接的时候遇到not support ssl/tls,通过以下解决

1
opkg install libustream-openssl

配置脚本一键关闭shadowsocks+kcptun:

1
2
3
4
5
6
7
8
9
10
/etc/init.d/chinadns stop
/etc/init.d/dns-forwarder stop
/etc/init.d/shadowsocks stop
/etc/init.d/kcptun stop
uci set dhcp.@dnsmasq[0].local=119.29.29.29
uci changes
uci commit
sed -i 's/server=.*/server=119.29.29.29/g' /etc/dnsmasq.conf
cat /etc/dnsmasq.conf
/etc/init.d/dnsmasq restart

配置脚本一键开启shadowsocks+kcptun:

1
2
3
4
5
6
7
8
9
10
/etc/init.d/chinadns start
/etc/init.d/dns-forwarder start
/etc/init.d/kcptun start
/etc/init.d/shadowsocks start
uci set dhcp.@dnsmasq[0].local=127.0.0.1#5353
uci changes
uci commit
sed -i 's/server=.*/server=127.0.0.1#5353/g' /etc/dnsmasq.conf
cat /etc/dnsmasq.conf
/etc/init.d/dnsmasq restart


网件R7800 SS + ChinaDNS + KcpTun实现YouTuBe 4K流畅体验
https://blog.dreamtobe.cn/r7800-ss-kcptun/
作者
Jacksgong
发布于
2018年11月25日
更新于
2023年2月11日
许可协议