华为悦盒EC6108V9C运行OpenWrt及常见问题的解决

Huoiop 1932 字 预计阅读时间: 9 分钟 发布于 7 小时前


  • 本文探讨的是作为旁路由时的一些问题。
  • 本文所有操作均在合法拥有的硬件上进行,涉及的网络配置仅为通用技术讨论,请遵守当地法律法规。
  • 本文测试平台:EC6108V9C 非高安版

适用情况

如果你遇到以下问题,本文可能可以为你提供解决思路:

  • 如何在EC6108V9C中刷入海纳思系统/部署OpenWrt(immortalwrt)
  • 容器DNS无法解析问题
  • immortalwrt Dnsmasq报错 Error: Could not process rule: No such file or directory add rule inet dnsmasq prerouting meta nfproto { ipv4, ipv6 } udp dport 53 counter redirect to :53 comment "DNSMASQ HIJACK"
  • 回环问题 error: reject loopback connection to: ...

具体流程

刷入海纳思

刷机教程在 海纳思官网 已有详细介绍,本文不再重复。

如果选择 USB 刷机 (卡刷),有以下一些补充

  • 螺丝位于盒子背面的脚垫下,把脚垫撕开即可看见螺丝
  • 卸下螺丝后,用卡片卡进盒子缝隙,一点点撬开即可
  • 短接时不一定要用镊子,身边有什么可以导电的(比如铁剪刀)都可用于短接
  • 刷入完毕首次开机时尽量接上网线(不要接成IPTV口了喂)

刷入完毕后,点击 外网 中的 Docker面板,按照指示完成 Docker 环境的安装

部署 ImmortalWrt

因为 ImmortalWrt 23.x.x 的版本之后(含)之后默认使用 firewall4,而这会带来一系列问题(比如Dnsmasq报错/无法正常工作),故我们需部署 21.02.x 及之前的版本。本文以 ImmortalWrt 21.02.7 Armv7 版本作为示例,这也是 EC6108V9C 可运行的一个版本。

下载.tar.gz 镜像

访问 上海交通大学镜像站 / ImmortalWrt 官方下载站,进入 21.02.7/targets/armvirt/32/

下载其中的 immortalwrt-21.02.7-armvirt-32-default-rootfs.tar.gzdefault-rootfs.tar.gz 到盒子

比如,可在 SSH 终端通过 wget 命令来下载

cd /tmp
wget https://mirrors.sjtug.sjtu.edu.cn/immortalwrt/releases/21.02.7/targets/armvirt/32/immortalwrt-21.02.7-armvirt-32-default-rootfs.tar.gz

导入镜像

先通过 ls 指令查看下载文件的实际文件名

ls

然后执行导入命令

docker import immortalwrt-21.02.7-armvirt-32-default-rootfs.tar.gz immortalwrt:21.02.7
格式为 docker import <文件名> <镜像名>
请将<文件名>替换为通过 ls 指令查询到的实际文件名(.tar.gz 后缀的文件)

创建网络

在宿主机开启网卡混杂模式(请将以下命令中的eth0替换为你宿主机实际连接局域网的网卡名称(可通过ip linkifconfig命令查看)

sudo ip link set eth0 promisc on

在宿主机开启IP转发

sysctl net.ipv4.ip_forward=1

创建macvlan网络(网段和网关均需根据你的实际网络环境修改,如现在主路由IP为192.168.0.1,则subnet应填192.168.0.0/24,gateway应填192.168.0.1)

docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 \
  macvlan

创建容器

ip值 为容器将要分配的IP,请确保与主路由位于同一网段且不重复(比如主路由IP为192.168.1.1,则应填192.168.1.x,x为0~255任意数字,但不能和主路由IP一致,因为会导致冲突)

network值 需与上一步创建的网络名一致

docker run --restart always \
  --name ImmortalWrt \
  -d \
  --network macvlan \
  --ip 192.168.1.11 \
  --privileged \
  immortalwrt:21.02.7 \
  /sbin/init

修改配置

输入以下命令进入容器内部终端

docker exec -it ImmortalWrt sh

编辑网络配置文件

vi /etc/config/network

需修改的内容如下:

  • 将 ipaddr 值修改为 创建容器时设置的IP(即--ip后的值,如本文的192.168.1.11)
  • 添加option gateway '192.168.1.1',其中的IP需改为默认网关(主路由)的IP,如本文192.168.1.1
# 修改前
config interface 'loopback'
        option device 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'

config device
        option name 'br-lan'
        option type 'bridge'
        list ports 'eth0'

config interface 'lan'
        option device 'br-lan'
        option proto 'static'
        option ipaddr '192.168.1.1'
        option netmask '255.255.255.0'
        option ip6assign '60'
# 修改后
config interface 'loopback'
        option device 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'

config device
        option name 'br-lan'
        option type 'bridge'
        list ports 'eth0'

config interface 'lan'
        option device 'br-lan'
        option proto 'static'
        option ipaddr '192.168.1.11'
        option netmask '255.255.255.0'
        option ip6assign '60'
        option gateway '192.168.1.1'
        list dns '223.5.5.5'

重启网络

/etc/init.d/network restart

至此,一个基本的immortalwrt容器搭建完毕。

常见问题

容器无法联网?DNS无法解析?

你可能会在更新软件源时发现这个问题

如果其他配置正常,一般是 DNS 配置的问题。Docker 会将容器 DNS 修改为 127.0.0.11,导致DNS解析失败

解决方法:添加自动覆盖命令,实现容器启动时自动修正DNS配置

vi /etc/rc.local

在英文输入状态下按 i 进入编辑模式

在 exit 0 之前插入以下内容:

echo "nameserver 223.5.5.5" > /etc/resolv.conf

修改后的文件示例:

# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

echo "nameserver 223.5.5.5" > /etc/resolv.conf
exit 0

按下 Esc,在英文输入状态下输入 :wq ,然后按下 Enter 即可保存并退出编辑模式

如果不想保存且退出,则需输入 :q 并按下回车

然后重启容器。

reboot

重启Dnsmasq时报错?

你指的是这种错误吧?

Error: Could not process rule: No such file or directory add rule inet dnsmasq prerouting meta nfproto { ipv4, ipv6 } udp dport 53 counter redirect to :53 comment "DNSMASQ HIJACK"

罚你重看一遍本文 o(≧口≦)o

这种情况是因为 immortalwrt 版本过高,在高版本中(≥23.5.0)系统防火墙默认使用 fw4 导致的

解决方法:使用 21.02.7 及以下的版本,这些版本的系统防火墙默认使用 fw3

转发不起作用咋办?

首先,在插件中进入 插件设置-DNS设置,并将其工作方式改为 使用 Dnsmasq 转发

然后打开 网络-DHCP/DNS,将 DNS 重定向 关闭,且不要改动 DNS 转发 的值

接着转到 网络-防火墙

确保 入站数据、出站数据、转发 均为 接受

一些情况下 可开启 高级设置 中的 禁止解析 IPv6 DNS 记录 来解决问题

怎么成为默认网关?

对于主路由是光猫等不方便修改 默认网关 的设备,可以参考以下方法

旁路由侧

进入 网络-接口-编辑

将 DHCP 服务器 页中的 忽略此接口 关闭

开启 高级设置 中的 动态 DHCP强制

主路由侧

以 中兴天翼网关(型号ZXHN F7615TV3)为例

访问 http://192.168.1.1:8080/ ,其中IP需替换为主路由IP

通过光猫背后的铭牌上的用户名和密码登入管理后台(注意是8080端口的管理后台)

打开 网络-用户侧管理,关闭 DHCP Server 的开关

切换到 IPv6设置,关闭 启动DHCPv6服务器

验证是否生效

拔掉网线重插,或关闭WLAN重连

Win + R 输入 cmd,在弹出的窗口中输入

ipconfig

查看默认网关是否变为容器IP,而不是光猫(主路由)的IP

或者也可以借助火绒的 DHCP检测 工具查看当前活跃 DHCP服务器

日志大量警告回环问题?

如果日志中大量出现这个警告:

error: reject loopback connection to...

解决方法(疑似有效?):将代理服务端域名加入 Fake-IP 解析的绕过名单可能会有所缓解。