# 前言
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 |