Total Pageviews

Tuesday, 20 October 2020

openwrt-raspberry,在 树莓派上,安装openwrt固件

在 树莓派4b上,安装openwrt并配置trojan/v2ray,千兆高速解决方案,性价比超软路由。

跳过说明直接看方案

前言

对于普通百兆网络,一般单台中等性能的路由器基本可以满足日常使用需要。但是随着千兆网络逐渐普及,高速访问网络资源的需求就日渐突出,坊间流行叫跑满带宽。对于带宽满速受到很多因素的影响,其中比较重要的一点就是路由器。如果之前关注过笔者应该对此有所了解,简单版可以应对一般使用需要,优化版通过分流对于普通网络流量性能提升明显,但是对于特殊流量,提升效果不是很显著,根本的原因就是路由器本身的硬件性能(主要为CPU)遇到了瓶颈。特殊流量目前的方式都是会使用到tls的加密解密,而对于一般路由器使用的嵌入式CPU,这个操作就成为了要害。

起步

鉴于嵌入式CPU性能方面的不足,笔者也曾经考虑过被风起流行的软路由,但是东宝坛一圈之后,还是有些犹豫,如果选择软路由方案,有几个需要考虑的方面:

  • 成本:几百~上千
  • 功耗:10w起
  • 尺寸:不算小
  • 功能:强大,是否需要
  • 稳定性:未知,就算机器是新的,但是内部的cpu、内存、硬盘也未必是新的
  • 型号:太多了,选择起来很困难,个人感觉里面水有点深

纠结了些许天,终还是没能定下来。偶然看到有人搞树莓派,于是调转马头奔向这边来。一搜之后,顿觉豁然开朗。最早还是树莓派刚出的时候关注过一段时间,但是也没有开发板方面的需求,就逐渐淡忘了。想不到2019年它已经迎来了第四代产品,最重要的是相比上代性能上有了大幅提升,这不正是我所需要的吗!

准备

东搜未果,转而向宝,宝弄了个什么红包省钱卡,每天只能领一券,各种套路啊。瞄了瞄我的准树莓派4b,很认真的计算一下,此处省略一万字。。。

嫌麻烦的小伙伴就买套餐好了,到手万事俱备。笔者比较爱折腾,不喜被定制,采用了手动拼接方案:

  • 树莓派4b裸板
  • 全被动无风扇外壳
  • tf卡
  • 18w快充头
  • type-c电源线
  • tf读卡器
  • micro HDMI转接头(非必须)

如果手头有闲置的手机快充头和type-c电源线,这个也可以省了,tf卡估计都曾经有过,找不到再买个。我这里除了读卡器其它都是买新,总共下来也就花了不足400块。

附上几个购买链接,扫码即可

  • 树莓派4b

    raspberry4

  • 无风扇全被动散热外壳

    box

新手上路

心心念念的树莓派4b终于拿到手了,真心够小巧,轻松掌握。赶紧官方教程走起,平时都用ubuntu,树莓派刚好也有,赶紧刷起来。不知道是micro HDMI转接头还是html到dvi的转接头有兼容性问题,反正显示器是没有收到信号,不管它了,文档里也有提无显示安装的一些操作步骤,照着来。话说这个ubuntu server还真不小,写卡很久,估计是我的读卡器还是老的usb 2.0 版。

插卡到树莓派,点亮,等了一会,然后尝试通过ssh去连接不成功,虽然刚才安装的时候按照文档配置了wifi,但是似乎没有成功。没关系,反正wifi又不重要,于是把树莓派接入路由器,查询得到树莓派ip然后ssh登录上去,成功,首次需要设置密码,然后就是各种安装配置。

经过不懈的努力终于将ubuntu的环境配置好了,谁知重启了之后ssh无法登录了,OMG。后来才知道是配置zsh为默认shell时修改/etc/passwd把zsh路径搞错了。

搞不定了只好重新又装了一遍。配好了环境,安装好了v2ray,剩下的就是在路由器上把特殊流量导向树莓派了。心想着改一下iptables规则就可以的事情远没有想象的那么简单,其实还是对网络这一块不了解啊。中间曲折的过程就不一一表述了,谁折腾谁知道。

进价

v2ray在树莓派中运行的中规中矩,这颗cpu也确实表现出了它的强大(与路由器相比)。但是考虑到v2ray是go语言性能方面与如火如荼的trojan相比可能存在一些劣势,于是又考虑用trojan取代v2ray的工作。

trojan之路也并非一帆风顺。树莓派上安装了trojan之后发现似乎并不支持端口复用,也就是说可能无法享受多线程的好处。查下来内核应该是已经支持了的,不知为何trojan会报warning,不完美。

此路不通,另辟蹊径。看了看树莓派支持的其它系统,不太感冒。想起油管上曾经看到过树莓派刷openwrt的,要不来个这个?官网看了已经支持树莓派4b了,不错,走起。不过笔者这里并没有用官方openwrt而是用的lede,也是支持树莓派4b的,集成了大家普遍需要的资源。我的主路由k2p也是从这里自编译的,编译的部分教程很多,利用好github。

行动

历尽千辛万苦终于将路由器和树莓派这对冤家成功的紧密联系在了一起。有人会说可以用树莓派做旁路由(也叫单臂路由)。是的,旁路由的确也是一种解决方案,笔者这里并没有采用是基于以下考虑:

  • 目前openwrt对于树莓派4b的支持是snapshot,也就是说并不是很稳定,如果让树莓派做主路由一旦出现问题就是家里整个网络都受影响
  • 旁路由的配置同样也不轻松
  • 流量全部经过树莓派对于树莓派应该也会有一定压力,毕竟它不是为路由而生
  • 对于笔者用的k2p支持硬件nat不用太可惜了

综合考虑之后,还是采取这种分而治之的策略,专业的人做专业的事。

效果

目前家中为移动千兆宽带,由于移动出口带宽资源并不充裕,前段时间在speedtest.net测试最高到140mbps,此时主路由k2p的cpu大约20%~30%,树莓派4b的cpu也是20%~30%的样子。后来对tls配置及trojan配置进行了一些调整优化,目前使用有线测试最高速度达到了300mbps,k2p负载60%~70%,树莓派4b负载也是60%~70%。理论上推算基本可以跑满500M带宽,期待小伙伴的验证。

具体方案

看这里! 

from https://github.com/felix-fly/openwrt-raspberry 

---------------------------------------------------------------------

Openwrt上,安装V2ray

v2ray-openwrt

本文为在路由器openwrt中使用v2ray的简单流程,相关的配置请参考官方文档,为了方便小伙伴们,这里给出的配置样例 仅TCP 支持UDP 供参考,配置采用ws作为底层传输协议,服务端及nginx相关配置可以参考这里也可自行度娘。注意替换==包含的内容为你自己的配置,路由部分使用自定义的site文件,支持gw上网及各种广告过滤,site.dat文件可以从v2ray-adlist获取最新版。

此方案相对简单,适合对性能要求不高,只要能正常爬网即可的情况使用,有更高要求的请看下面的方案。

优化方案

如果v2ray一站式服务的方式不能满足你的需求,或者遇到了性能瓶颈(下载慢),可以试试另外一种优化方案:

https://github.com/felix-fly/v2ray-dnsmasq-dnscrypt

高速方案,更高!更快!更强

使用树莓派4b安装openwrt配置独立服务trojan/v2ray,千兆高速解决方案,性价比超软路由。

https://github.com/felix-fly/openwrt-raspberry

脚本安装方式(路由)

路由器CPU平台请自行查询确认,支持的平台如下

  • 386
  • amd64
  • armv5
  • armv6
  • armv7
  • arm64
  • mips
  • mipsle
  • mips64
  • mips64le
  • ppc64
  • ppc64le

ssh登陆到路由器执行脚本,注意替换平台名称,路由器需联网及已安装wget。

wget https://raw.githubusercontent.com/felix-fly/v2ray-openwrt/master/install.sh
chmod +x install.sh
./install.sh 386

安装过程中对于FPU选项,如果CPU不支持硬件浮点计算,则需要开启FPU。

手动安装方式(电脑)

下载v2ray

release页面提供了各平台下的v2ray执行文件,可以直接下载使用。

默认已经过upx压缩,不支持压缩的保持不变。压缩包中仅包含v2ray执行文件,因为已经编译支持了json配置文件,运行不需要v2ctl。

上传软件及客户端配置文件

mkdir /etc/config/v2ray
cd /etc/config/v2ray
# 上传v2ray、config.json文件到该目录下,配置文件根据个人需求修改
chmod +x v2ray

添加服务

vi /etc/config/v2ray/v2ray.service

贴入以下内容保存退出

#!/bin/sh /etc/rc.common
# "new(er)" style init script
# Look at /lib/functions/service.sh on a running system for explanations of what other SERVICE_
# options you can use, and when you might want them.

START=80
ROOT=/etc/config/v2ray
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1

start() {
  service_start $ROOT/v2ray
}

stop() {
  service_stop $ROOT/v2ray
}

服务自启动

chmod +x /etc/config/v2ray/v2ray.service
ln -s /etc/config/v2ray/v2ray.service /etc/init.d/v2ray
/etc/init.d/v2ray enable

开启

/etc/init.d/v2ray start

关闭

/etc/init.d/v2ray stop

配置透明代理(可选)

使用iptables实现,当前系统是否支持请先自行验证。开启UDP需要 iptables-mod-tproxy 模块,请确保已经安装好。

以下为iptables规则,直接在ssh中运行可以工作,但是路由重启后会失效,可以在luci-网络-防火墙-自定义规则下添加,如果当前系统没有该配置,可以使用开机自定义脚本实现,详情请咨询度娘。

规则中局域网的ip段(192.168.1.0)和v2ray监听的端口(12345)请结合实际情况修改。

# Only TCP
iptables -t nat -N V2RAY
iptables -t nat -A V2RAY -d 0.0.0.0 -j RETURN
iptables -t nat -A V2RAY -d 127.0.0.0 -j RETURN
iptables -t nat -A V2RAY -d 192.168.1.0/24 -j RETURN
# From lans redirect to Dokodemo-door's local port
iptables -t nat -A V2RAY -s 192.168.1.0/24 -p tcp -j REDIRECT --to-ports 12345
iptables -t nat -A PREROUTING -p tcp -j V2RAY
# With UDP support
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
iptables -t mangle -N V2RAY
iptables -t mangle -A V2RAY -d 0.0.0.0 -j RETURN
iptables -t mangle -A V2RAY -d 127.0.0.0 -j RETURN
iptables -t mangle -A V2RAY -d 192.168.1.0/24 -j RETURN
# From lans redirect to Dokodemo-door's local port
iptables -t mangle -A V2RAY -p tcp -s 192.168.1.0/24 -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A V2RAY -p udp -s 192.168.1.0/24 -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A PREROUTING -j V2RAY

长尾

以下内容一般来说不需要继续看了,如果你想自己定制v2ray,come on!

普通压缩

首先下载路由器硬件对应平台的压缩包到电脑并解压。

v2ray功能强大,相应的体积也很硕大,以目前4.18版本为例,这里使用的mipsle平台的v2ray已经超过了14mb,v2ctl也有10mb,对于路由器这种存储空间不是很富裕的设备,原生的v2ray实在是太大了。

压缩势在必行,这里使用upx

upx -k --best --lzma v2ray
upx -k --best --lzma v2ctl

UPX是个厉害角色,之前是直接不带任何参数压缩,体积还可接受,但是目前这个版本压缩后也有4.9mb的块头,笔者的k2p表示吃不消。于是参数化之后发现体积缩小至3.3mb,比现在使用的版本还小一些。如果你不追求极致,到此就可以洗洗睡了(厄~,那个~,好像还没完呢。。。)。

极致压缩

之前就有人发过相关的教程修改all.go文件,通过减少依赖缩小v2ray的体积,那时还是用的vbuild编译,现在已经使用bazel来build了。可以参考这个issue修改all.go文件:

main/distro/all/all.go

关于JSON配置这里,有两种选择,代码里的注释已经说明了,默认的配置是依赖v2ctl来处理JSON文件,而另外一种选择jsonem的话,v2ray可以直接处理JSON文件,不再依赖v2ctl,只是体积会相应的增大。这里改为使用jsonem。

需要指出的是,当使用jsonem时,通过减少依赖并不能进一步缩小v2ray的体积,个人猜测可能jsonem也引用了这些依赖。

package all

import (
  ...

  // JSON config support. Choose only one from the two below.
  // The following line loads JSON from v2ctl
  // _ "v2ray.com/core/main/json"
  // The following line loads JSON internally
  _ "v2ray.com/core/main/jsonem"

  ...
)

然后编译你要的平台安装包

bazel clean
bazel build --action_env=GOPATH=$GOPATH --action_env=PATH=$PATH //release:v2ray_linux_mipsle_package

采用jsonem的话打包出来的v2ray体积为15mb多,UPX之后约3.6mb,个人觉得还ok,这样的话在路由器中可以直接读取json配置文件而不再需要v2ctl。

from https://github.com/felix-fly/v2ray-openwrt

 

 

No comments:

Post a Comment