在N1上运行openwrt

openwrt官方之前听说有将openwrt移植到Amlogic的计划,但是遥遥无期,既然官方的支持遥遥无期,那咱们就得自己动手了,前方已经传出好消息,bettermanbao大神已经搞定。
使用docker,因为openwrt官方有发布arm架构的openwrt的rootfs,那就表示只要有arm架构的linux内核+arm架构的openwrt的rootfs,就可以运行openwrt。在docker或者lxc中,都可以运行。
正好咱们N1有armbian,这样运行openwrt的条件就满足了,N1+armbian+rootfs。
即然运行条件满足了,那咱们开工。
N1一台。
Armbian 选用的5.44版 3.14.29内核的版本 使用这个镜像 Armbian_5.44_S9xxx_Debian_stretch_3.14.29_server_20180601.img 我相信咱们论坛玩armbian的朋友应该都玩过这个版本,因为这不是初级教程,我这里只能假设这一步难不倒您。其实使用最新版本的比如:Armbian 5.67也是行的,但是因为需要额外的内核模块 如8021q ipset。因为我们现在手上有是现成编译好的,支持8021q ipsect的3.14.29内核。
还有一个最为重要的原因就是Armbian 5.44版 3.14.29内核 是一个公认的最为稳定的一个版本,也是Betterman大神经过多次测试最终选定的版本,而且只对这一版本的Armbian运行openwrt提供技术支持。

N1 Armbian启动成功:
1.更新内核
dpkg -i linux-image-amlogics905x_5.44_arm64.deb
2.安装docker
如果已经安装了 跳过此步.没安装的 运行下面两条命令
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

3.开干 (让更多人看到,先回个贴先吧。谢谢了)ip link set eth0 promisc on
modprobe pppoe
docker network create -d macvlan –subnet=192.168.2.0/24 –gateway=192.168.2.1 -o parent=eth0 macnet
docker import https://downloads.openwrt.org/releases/18.06.1/targets/armvirt/64/openwrt-18.06.1-armvirt-64-default-rootfs.tar.gz openwrt:18.06.1
docker run –restart always -d –network macnet –privileged openwrt:18.06.1 /sbin/init

命令解释:
第一条 打开网卡eth0的混杂模式
第二条 载入pppoe 内核模块 (因为docker里面的openwrt用的是N1 Armbian的Linuw内核,要实现pppoe拨号,咱们得在N1 Armbian上载入pppoe 内核模块)
第三条 在docker内创建macvlan
第四条 将openwrt官方提供的arm架构的openwrt的rootfs导入为docker镜像(涨知识了吧?原来docker镜像其实就是一个没有内核的rootfs)
第五条 运行docker (使用参数 –restart always 让这个容器随系统启动,这样N1断电了,或者死机了,重新插下电源,Armbian启动完,docker也会启动好)

运行完docker之后,有人就会问了,哎呀,我如何连接到openwrt啊,openwrt在哪啊?没事,没毛病,还有后续操作。
首先 执行 docker ps 找到刚才运行的docker实例。记录下 CONTAINER ID,我的是c66e57abdcf8,这是一个随机id,在你们的机器上肯定会不一样。
然后运行docker exec -it c66e57abdcf8 sh 你们在运行这一条时,要将c66e57abdcf8 改成你们获取的CONTAINER ID
就进入到了在docker中运行的openwrt的 shell。在这里我们要编辑一下openwrt的网络配置文件。
vi /etc/config/network
将标记处的192.168.1.1 改成192.168.2.1 也就是我们刚创建的macvlan的地址段的IP,然后保存,再重启openwrt的网络。
命令为
/etc/init.d/network restart
执行完之后,输入exit 退出openwrt的docker。
这样就设置完成了。
然后将你电脑的网卡的IP设置为192.168.2.1 同一网段。
然后确定。打开浏览器,在浏览器里面打开 http://192.168.2.1 哇,您进入了openwrt的世界了。
用这种方法运行的openwrt,跟你的N1互不相干,相互隔离,N1的armbian还可以继续使用,但是不能互相访问,但这也难不倒咱们,咱们把macvlan串起来。
增加加一个虚拟接口mac0 然后把mac0 eth0 macvlan桥接到一起,完事。

auto mac0
iface mac0 inet static
address 192.168.2.200
netmask 255.255.255.0
gateway 192.168.2.1
dns-nameservers 192.168.2.1

pre-up ip link add mac0 link eth0 type macvlan mode bridge
post-down ip link del mac0 link eth0 type macvlan mode bridge
把上面的代码加入到N1的 /etc/network/interfaces 文件里,然后重启网络
接下来讲通过docker运行的openwrt如何设置上网:
Openwrt-network-Interfaces
创建一个WAN接口,选择 dhcp 或者 pppoe, Cover the following interface这里要选 Custom Interface,输入eth0.2 就是指定vlan为2。只有一个网口,肯定是单臂路由,要借用vlan。vlan可以使用 vlan交换机来辅助,或者在光猫里面直接指定pppoe接口的vlan,两边vlan id保持一致即可。

在不使用Vlan交换机的情况下实现PPPOE拨号上网,这种做法是将openwrt的lan口以及wan口都桥接到N1的网卡上,只能使用pppoe的方式拨号上网,dhcp或者静态ip的方式都不行。

在openwrt的终端内运行命令,添加一个链接到N1 macvlan的虚拟接口。
ip link add link eth0 name veth0 type macvlan
ifconfig veth0 up
执行完之后,veth0接口就创建好了,然后把这语句加入到openwrt的startup内。
Openwrt-System-Startup 如下图:
添到Startup里,这样下次openwrt启动,就自动会创建好veth0接口。

然后去创建上网连接
Openwrt-network-Interfaces
Cover the following interface 这里选我们刚添加好的veth0

进入下一步 输入你宽带拨号的pppoe 账号跟密码 点Save & Apply应用。

这时候openwrt已经拨号成功上网了,这个时候可玩性马上就提高了。
Openwrt-System-Software
先点击update lists 让他自己更新一会,由于已经连上网了,是可以更新的
更新成功,软件大把,可以自己安装了,比如安装更多的themes,以及中文语言包,都不是问题,自己摸索,安装吧。

整理了一下楼主的教程,简单的步骤:配置双网络,装完跟普通openwrt一样配置即可
// 启用混杂模式
ip link set eth0 promisc on
// 创建双网络,因为该网络地址无用并不可访问,为避免冲突,使用本地地址即可
docker network create -d macvlan –subnet=169.254.0.0/24 –gateway=169.254.0.254 -o parent=eth0 macnet
docker network create -d macvlan –subnet=169.254.1.0/24 –gateway=169.254.1.254 -o parent=eth0.50 macnet50 //VLAN=50
// 导入openwrt映像
docker import https://downloads.openwrt.org/re … fault-rootfs.tar.gz openwrt:18.06.1
// 创建container不运行
docker create –name openwrt –restart=always –network macnet50 –privileged openwrt:18.06.1 /sbin/init
// 连接第二个网络
docker network connect macnet openwrt
// 启动container
docker start openwrt
docker ps //找到CONTAINER ID
docker exec -it {CONTAINER ID} sh //进入container的shell
//配置network eth0,eth1,firwall,passwd