- 本文探讨的是作为旁路由时的一些问题。
- 本文所有操作均在合法拥有的硬件上进行,涉及的网络配置仅为通用技术讨论,请遵守当地法律法规。
- 本文测试平台: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.gz 或 default-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
请将<文件名>替换为通过 ls 指令查询到的实际文件名(.tar.gz 后缀的文件)
创建网络
在宿主机开启网卡混杂模式(请将以下命令中的eth0替换为你宿主机实际连接局域网的网卡名称(可通过ip link或ifconfig命令查看)
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 解析的绕过名单可能会有所缓解。
Comments NOTHING