# 前言

N1 盒子刷了 CoreElec,并且安装了 docker, 可玩性更高了。
docker 安装了 openwrt, 由于 macvaln 为了安全而禁止宿主机与容器互通。
用网上常见的方法,创建虚拟网卡,并加入路由,结果还是无法访问。
很奇怪,之前在虚拟机试过可以正常互通的。

最后终于在恩山找到了这篇文章

  • https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=1253259&page=1#pid5077553

原文:

最近装了 coreElec 跑 docker + op,发现容器和宿主机不能互通,找了一圈没找到解决方法。本来想试下通过 veth pair 来解决,但发现自带的 ip 命令是 busybox 的而且不支持 ip netns 这个命令,
于是逛下帖子,无意中看到了 coreElec 可以装 entware 然后就装了个玩下,本来想用来装个 iproute2 的,opkg 安装提示没这包,看到了有 ip-full 然后就安装试下了,然后 ip --help 一下,看到有 ip netns 这个玩意了

导致 coreElec 下 docker 容器与宿主机之间不能互 Ping 的原因应该是系统自带的 busybox 里面的 ip 命令功能不全?

# CoreElec 安装 entware

installentware

常用命令

opkg update    #更新可以获取的软件包列表
opkg upgrade    #对已经安装的软件包升级
opkg list    #获取软件列表
opkg install    #安装指定的软件包
opkg remove    #卸载已经安装的指定的软件包

# 安装 ip-full

opkg install ip-full

# 创建虚拟网卡并加入路由

192.168.1.0/24 是网段,按照个人实际情况修改
192.168.1.20 是 openwrt 容器的 ip

#开启物理网卡的混杂模式
ifconfig eth0 promisc
# 创建虚拟网卡
# 不知道为什么,创建完虚拟网卡后,系统会自动分配 ip 并启用,很难受每次重启,网卡的 ip 都会变,不过没啥影响
ip link add macvlan link eth0 type macvlan mode bridge
# 给虚拟网卡分配 ip 并启用 (可以通过 ifconfig 查看,如果自动分配了,可以忽略这个步骤)
ip addr add 192.168.1.100/24 dev macvlan 
ip link set macvlan up
ip route del 192.168.1.0/24 dev eth0
ip route del default
# 把 openwrt 容器的 ip 加入 route 到虚拟网卡 (很关键)
ip route add 192.168.1.0/24 dev macvlan
ip route add default via 192.168.1.20 dev macvlan

完成这些,宿主机和容器就能互通

# 加入开机启动脚本

由于重启后,这些配置会消失,可以加入开机启动脚本

vi ~/.config/autostart.sh

#!/bin/bash
ifconfig eth0 promisc
/opt/sbin/ip link add macvlan link eth0 type macvlan mode bridge
/opt/sbin/ip link set macvlan up
/opt/sbin/ip route del 192.168.1.0/24 dev eth0
/opt/sbin/ip route del default
/opt/sbin/ip route add 192.168.1.0/24 dev macvlan
/opt/sbin/ip route add default via 192.168.1.20 dev macvlan

然后按 esc 键 输入 :wq 保存文件

修改权限后

chmod a+x ~/.config/autostart.sh

# 大佬的脚本

之前完全按照大佬的脚本,试了下,可以互通。
但是原本的 eth0 ip 被清空了,ssh 访问 Coreelec 走的虚拟网卡。

ip addr flush dev eth0 // 清空指定网卡 ip
最后两行是用来固定虚拟网卡的 ip、网关、dns。
这里的网关地址 表示 openwrt 的 ip

大致意思是宿主机走虚拟网卡,并且可以把 openwrt 的 ip, 指定为虚拟网卡的网关,让 n1 走 docker openwrt 旁路由。
没有深入研究,其中 DNS 地址之前试了用 192.168.1.1 默认网关,好像无法访问外网。
有需要可以多测试下,试试 114.114.114.114。

vi ~/.config/autostart.sh

#!/bin/sh
ifconfig eth0 promisc #开启混杂模式
/opt/sbin/ip addr flush dev eth0 #清空指定网卡 ip
/opt/sbin/ip link add macvlan link eth0 type macvlan mode bridge #创建虚拟网卡
/opt/sbin/ip link set macvlan up #启用网卡
/opt/sbin/ip route del 192.168.1.0/24 dev eth0 #删除指定网卡的指定网段路由
/opt/sbin/ip route del default #删除默认路由
/opt/sbin/ip route add 192.168.1.0/24 dev macvlan #指定网段路由加入到指定接口
/opt/sbin/ip route add default via 网关地址 dev macvlan #增加默认网关
connmanctl services |grep -vi $(ifconfig eth0|grep HW|awk -F: '{print $7}')|awk '{system("connmanctl config "$3" --ipv4 manual IP地址 255.255.255.0 网关地址")}'
connmanctl services | grep eth|awk '{system("connmanctl config "$3" --nameservers DNS地址")}'

# 我的 ip addr 结果

我选择保留物理网卡 ip,虚拟网卡作为中转,烦人的就是每次重启虚拟网卡的 ip 会改变(可能是因为 eth0 是动态获取的 ip)
也可以根据大佬的脚本,直接走虚拟网卡。
看个人喜好。

2: eth0: <BROADCAST,MULTICAST,PROMISC,DYNAMIC,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether mac地址 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.20/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
4: macvlan@eth0: <BROADCAST,MULTICAST,DYNAMIC,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether mac地址 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global macvlan
       valid_lft forever preferred_lft forever

# 额外

# CoreElec 可用 docker 插件

由于无法访问插件库,在网上找了个可用的 docker 插件,离线安装

https://github.com/amber6hua/cdn/tree/master/n1/service.system.docker-19.5.134.zip

下载后上传到 CoreElec, 进入【插件】,然后选择【从 zip 文件安装】

安装 docker-compose

# 下载 docker-compose 到 /storage/.opt/sbin 目录,相当于 linux 的 /usr/bin 目录,可以全局访问 docker-compose
curl -L "https://ghproxy.com/https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /storage/.opt/sbin/docker-compose
# 添加执行权限
chmod +x /storage/.opt/sbin/docker-compose
# 检查是否安装成功
docker-compose --version

# 利用以下命令可以直观的发生了什么

route -n 
ip route show
ip addr

# 我的环境出现的问题

vi ~/.config/autostart.sh

完全按照上面的开机脚本使用过程中,发现一些问题

# 不能访问外网

我注释第二行和最后一行后,可以正常访问外网了

#!/bin/bash
ifconfig eth0 promisc
#/opt/sbin/ip addr flush dev eth0
/opt/sbin/ip link add macvlan link eth0 type macvlan mode bridge
/opt/sbin/ip link set macvlan up
/opt/sbin/ip route del 192.168.3.0/24 dev eth0
/opt/sbin/ip route del default
/opt/sbin/ip route add 192.168.3.0/24 dev macvlan
/opt/sbin/ip route add default via 192.168.3.14 dev macvlan
connmanctl services |grep -vi $(ifconfig eth0|grep HW|awk -F: '{print $7}')|awk '{system("connmanctl config "$3" --ipv4 manual 192.168.3.20 255.255.255.0 192.168.3.1")}'
#connmanctl services | grep eth|awk '{system("connmanctl config "$3" --nameservers 114.114.114.114")}'

# 运行一段时间路由冲突

不晓得为什么运行一段时间后,会自动生成一个路由规则,造成冲突
为此增加了一个定时任务,定时删除路由

crontab -e
#定时任务 每天执行一次删除路由
0 2 * * * /opt/sbin/ip route del 192.168.3.0/24 dev eth0