[原创]N1上基于docker搭建原版OpenWRT

[原创]N1上基于docker搭建原版OpenWRT

 

网上已经有很多成熟的将N1盒子刷成OpenWRT的教程和固件,功能很强悍、外观很惊艳,什么云解锁,拦广告啥的,一应俱全,而我,就只想在实现一个OpenWRT基本路由功能而已,最干净的,也是最稳定,最省事的。

 

软硬件环境:N1盒子已安装Armbian 19.11.3 debian buster测试版,实际用下来稳的很,跑了LNMP环境+WORDPRESS+可道云,有Docker环境,跑了网易云解锁。因此,在不影响前面服务的前提下,在docker中装OpenWRT ,是最好的也是唯一的选择。

镜像的选择:直接用 官方网站的 18.06.1 ARM 版 rootfs 即可。

 

A方案:不划分VLAN方法:

第一步:安装并启动(参考论坛前辈方法)

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

经过第一步,一个来自官方的干净的openwrt诞生了。

第二步:配置

docker ps //找到CONTAINER ID
docker exec -it {CONTAINER ID} sh //进入container的shell
1.对配置/etc/config/network文件,主要是配置lan口的IP地址,

2.在容器openwrt命令行配置拨号用的虚口(非常关键)

ip link add link eth0 name veth0 type macvlan
ifconfig veth0 up

第三步:在OPENWRT LUCI界面里,配置PPPOE拨号,基于veth0端口。正常情况下,已经可以拨上了,获得IP地址了。

 

故障排查:在这里,我的客户端还是上不了网,经检查有几个原因(只是我的环境,别的环境未知):

  1. OpenWRT 默认路由指向错误,没有指到PPPOE口。(这个不具有普遍现象,也找到原因,可以排除了)

解决方法:更改默认路由指向pppoe口。

ip route replace default dev pppoe-WAN

  1. 防火墙 nat 表没有找到正确的MASQURASE记录

解决方法:添加对应masqurade记录。

iptables -t nat -A POSTROUTING  -o pppoe-WAN -j MASQUERADE

  1. 防火墙的区域设置

解决方法:删除除lan以外所有区域,将所有的口都加到这个区域。这里就是 lan,wan口。

上述命令重启会失效,那么需要自动执行。

故障永久解决方案:

在openwrt 容器 /etc/rc.local 文件里加上

ip link add link eth0 name veth0 type macvlan

ifconfig veth0 up

ip route replace default dev pppoe-WAN   //注意这里的 pppoe-WAN,是我的pppoe口名称,请根据自己的情况调整。

iptables -t nat -A POSTROUTING  -o pppoe-WAN -j MASQUERADE

多次重启,运行正常。

 

B方案:划分VLAN的方法(此方案是去年早些时候根据大神方案修改而来)

简单的步骤:配置双网络,装完跟普通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

A方案运行效果(拨号及测速)

可以正常拨号,可以跑满。

B方案运行效果

在B方案下,(或者是物理机刷论坛大神的Openwrt ,开VLAN),都要低一点,大概是9MB/s左右,估计跟内核VLAN实现的机制有关。(很抱歉,未截图)