路由器梅林固件上面使用 v2ray 的方案 · GitHub
建议 kooshare ss 插件版本在 3.8.6 以上的,使用 https://gist.github.com/wd/1445e3fcf0c9bc535a6e70d2de1d1624 方案。相对简单一点。
这个方法整体的思路是,在后台配置使用 ss 的方案,然后我们把 ss 这些进程提供的功能用 v2ray 替代。这样无缝替换掉 ss。所以上面的 23456 端口和 3333 端口都必须和 ss 原有的对应,如果用的方案和我的不一样,那可以自己调整一下。
注意:
因为路由器上面内存有限,所以需要调整 alterId 为比较小的数值,这个值不同路由器会不一样,我这里使用的是 r6300v2,使用 10 没问题。alterId 调整需要服务器端一起调整,所以如果你的服务器端服务不是你自己搭建的不能修改的话,那么得有心理准备,可能跑不起来。上面的文件,都必须要求是 utf8 no bom unix 格式的。可以通过点击文件右边的 raw 按钮,得到文件的 url,然后在路由器上面执行 wget url 获取文件。如果你用的是 windows,或者看不懂我说的是什么,那最好在路由器上面直接执行下面的语句。这个步骤,代替了下面的 1-3 步骤。这个脚本修改自 v2ray 官方的那个,修改了一下目录。这个脚本可以多次执行,以后升级的时候可以直接执行这个脚本完成。# wget https://gist.githubusercontent.com/wd/e0bc83b33ce63506a9bdbc3b81658c52/raw/4820a3d2886edef48997aa314db249cfce27a321/go_arm.sh# chmod +x go_arm.sh# ./go_arm.sh
注意:如果执行了上面的操作,那就继续执行下面的 4 就可以,跳过 1,2,3。
注意:下面命令只复制 # 后面的,# 不需要复制。
下载 v2ray arm 版本,arm 版本有两个,一个是 arm,一个是 arm64 。我的是 armv7 的,使用 arm 版本。# uname -aLinux wd 2.6.36.4brcmarm #40 SMP PREEMPT Mon Jul 17 13:47:41 CST 2017 armv7l ASUSWRT-Merlin下载之后,解压,放到 /jffs/v2ray/ 目录里面。把上面提到的 config.json 和 v2ray_watchdog.sh 也放进去。# ls /jffs/v2ray/config.json geoip.dat geosite.dat v2ctl* v2ctl.sig v2ray* v2ray.sig v2ray_watchdog.sh*给程序增加可执行权限。# chmod +x /jffs/v2ray/v2ray# chmod +x /jffs/v2ray/v2ctl# chmod +x /jffs/v2ray/v2ray_watchdog.sh
有些人使用 windows 会传上去不符合要求的格式的文件,执行下面的命令可以修复。
# dos2unix /jffs/v2ray/v2ray_watchdog.sh# dos2unix /jffs/v2ray/config.json先在路由器后台把 ss 相关的配置都关闭。就是那个「科学上网开关」处于关闭状态。然后手动运行一下 /jffs/v2ray/v2ray_watchdog.sh 看看是不是不报错,如果有报错,那需要先解决错误。在梅林后台,打开 ss 开关,任意配置一个节点,选 gfwlist 模式(其他模式应该也可以支持,没有深入测试过,建议可以先用这个模式测试可以用之后,再调整其他模式),节点 ip 和用户信息什么的全部都可以随便写(注意要关闭 obfs),国外 dns 配置为 chinadns1(如果配置为其他的,需要调整对应 watchdog 脚本,因为不同方案可能使用的 dns 查询方案不一样,端口可能会不一样,我只测试了这个方案)点击保存应用,然后 merlin 会启动 ss 相关的程序。这个时候后台会显示国外连接是失败的。不过没关系。手动执行一下 v2ray_watchdog.sh# /jffs/v2ray/v2ray_watchdog.sh…… 这里会有一些输出等 merlin 国外的下一个检查时间,一般几分钟内,国外连接会显示 ok。那么这个时候基本就是可行的了。下面是如何让 v2ray 自动启动。修改 /jffs/scripts/nat-start 和 /jffs/scripts/wan-start 增加一行,里面的 */5 是 5 分钟执行一次检查,如果你有需要更快,可以改成比如 */1 表示一分钟检查一次。另外,注意修改里面的 admin 为你自己的用户名,一共两个地方需要改。grep -q ‘v2ray_watchdog.sh’ /var/spool/cron/crontabs/admin || echo “*/5 * * * * /bin/sh /jffs/v2ray/v2ray_watchdog.sh” >> /var/spool/cron/crontabs/admin重启一下路由器。等路由器启动之后,可以看看 v2ray 进程是不是启动了。如果你的 v2ray 服务器是通过域名访问的,请注意看下面 FAQ 里面的 2 。
************************************************ FAQ *********************************
如何判断 v2ray 是不是启动了?看到这个输出就表示启动了。# ps |grep v2ray 1598 admin 780m S /jffs/v2ray/v2rayv2ray 进程启动了,但是还是不能上网翻怎么回事?这个需要自己确定下自己的 outbound 配置是否可用。另外如果你的 outbound 用的是域名方式,那可能还需要在路由器后台的 Shadowsocks 设置 -> 黑白名单 -> 域名白名单 里面增加自己的域名。同时还可能需要增加 ntp 的域名。这是个先有鸡还是先有蛋的问题,v2ray 需要访问域名 -> 查询 dns -> merlin ss 原来的逻辑会走到 v2ray 的 socks 端口 这样就死循环了,导致无法翻墙。所以需要加白名单。my.domain.compool.ntp.org出现一会可以翻一会不能翻的情况怎么回事?看看 /tmp/v2ray.log 里面,是不是 v2ray 有崩溃重启的情况# cat /tmp/v2ray.logv2ray restart at Sun Feb 11 07:30:01 GMT 2018v2ray restart at Sun Feb 11 07:35:01 GMT 2018v2ray restart at Sun Feb 11 07:40:01 GMT 2018v2ray restart at Sun Feb 11 07:45:01 GMT 2018
如果有,那么一般是内存问题。这个可以通过调整 config.json 输出更详细的 debug 信息看看。我尝试了使用 swap 可以减少崩溃的情况。具体你可以搜索一下,但是对你不一定管用。
遇到内存问题怎么办?试试看调整 alterId 到小一点的值,我开始的时候使用 64,发现崩溃很严重,1 分钟就崩溃。后来改成了 10,就没问题了,这个值应该和路由器内存有关系,可以多调整几次找到适合自己的。要注意,这个值是需要和服务器端一起调整的,不能只调整客户端。
如何用回 ss ?如果不想用 v2ray 了,那可以修改 /jffs/v2ray/v2ray_watchdog.sh 在最后一行 main 前加一个 # 变成 #main,然后执行 killall v2ray ,之后就可以在 merlin 后台正常配置 ss 了。
如何检查 json 格式?可以访问 http://json.parser.online.fr/ ,把你自己的 json 贴进去。注意这里是不支持 json 里面的注释信息的,就是那些 // 后面的内容,需要删除才能在这里检查。
提示 Permission denied这个可能有几个情况a. 文件没有执行权限。执行 chmod +x 文件名可以解决。b. 磁盘空间不足。执行 df -h 看看,/jffs 分区和 /tmp 分区是不是还有空间。
如何使用 swap我是接了一个几个 G 的老 U 盘。接上去之后会自动挂载,我这设备是 /dev/sda1。
# df -hFilesystem Size Used Available Use% Mounted on/dev/root 26.6M 26.6M 0 100% /devtmpfs 124.8M 0 124.8M 0% /devtmpfs 124.9M 908.0K 124.0M 1% /tmp/dev/mtdblock5 88.8M 21.7M 67.0M 24% /jffs/dev/sda1 3.7G 284.1M 3.3G 8% /tmp/mnt/1.42.6-5644
在 /jffs/scripts/post-mount 里面,增加下面的内容,重启路由器启动的时候会自动建立一个 500M(有需要可以改下面的 500) 的 swap。
if [ -b /dev/sda1 ];then mkdir -p /tmp/opt mount -t ext4 -o rw,noatime /dev/sda1 /opt if [ -f /opt/swap ];then dd if=/dev/zero of=/opt/swap bs=1M count=500 mkswap /opt/swap fi swapon /opt/swapfi
启动之后,看看 swap 是不是启用了。最后那行应该只有中间一个是 0,表示启用成功。
# free -m total used free shared buffers cachedMem: 255716 72080 183636 0 1068 12476-/+ buffers/cache: 58536 197180Swap: 184316 0 184316v2ray 多节点启用负载均衡和灾备v2ray 的 vmess 协议,本身是支持多节点负载均衡的,但是没有故障转移功能。在其中一个节点挂掉的时候,不能自动转移到其他节点。可以用梅林自带的 haproxy 来解决这个问题。
注意:这个方案,我只测试了裸的 vmess 协议,没测试 websocket,tls 这些设置,这些可能是不行的,自己测试看吧。
在 Shadowsocks -> 负载均衡里面,启用负载均衡,配置一个端口,比如 1080,其他内容根据自己的需要设定,可以分配不同的权重什么的,也可以直接是相同权重,这些具体参考 haproxy 的逻辑吧。
添加之后,在 ss 那里选择不选择这个节点关系都不大。在你的 v2ray 的配置文件里面,outbound 部分要使用服务器 127.0.0.1 和 1080 端口。然后重启一下 v2ray 看看。