家里有台闲置的Linux主机(比如NAS或旧电脑)的朋友,可能都想过让它发挥更多作用。我最初也是抱着这个想法,尝试把ImmortalWrt作为旁路由部署在Docker里。实测下来发现,这种方案比直接刷机到硬件路由器方便太多——既不用折腾路由器固件,又能随时回滚或迁移。
旁路由模式最大的优势在于零侵入性。你的主路由不需要任何改动,所有设备依然保持原有网络配置。只需要在需要特殊功能的设备上(比如游戏机、智能电视),手动修改网关地址就能享受去广告、流量优化等服务。更妙的是,如果旁路由出现问题,直接把设备网关改回主路由就能立即恢复网络,完全不影响家人正常上网。
ImmortalWrt作为OpenWrt的分支版本,对国内用户特别友好。它预装了更多实用插件,而且更新频率高。我对比过几个版本,发现它的Docker镜像体积比官方OpenWrt小了近30%,资源占用也更低。对于家庭用户来说,完全够用。
我用一台2015年的老笔记本(i5-5200U+4GB内存)做测试机,跑ImmortalWrt完全无压力。实际使用中,CPU占用很少超过20%,内存占用稳定在300MB左右。如果你的设备能满足以下条件,基本都能流畅运行:
官方安装脚本虽然简单,但国内直连速度很慢。这里分享两个实测可用的加速方案:
bash复制# 方案一:阿里云镜像加速(适合大多数Linux发行版)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 方案二:DaoCloud加速(适合树莓派等ARM设备)
curl -sSL https://get.daocloud.io/docker | sh
安装完成后,建议立即调整Docker的日志配置,避免长时间运行后日志占满磁盘:
bash复制# 创建或修改Docker守护进程配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
# 重启Docker服务
sudo systemctl restart docker
这个步骤很多教程一笔带过,但其实很关键。我的Realtek网卡第一次配置时就遇到问题,后来发现是驱动兼容性问题。以下是更稳妥的操作方法:
bash复制# 先确认物理网卡名称(可能是eth0、enp3s0等)
ip -o link show | awk '{print $2}' | cut -d':' -f1 | grep -v lo
# 启用混杂模式(假设网卡是enp3s0)
sudo ip link set enp3s0 promisc on
# 设置开机自动启用(针对systemd系统)
echo -e "[Unit]\nDescription=Enable Promiscuous Mode\nAfter=network.target\n\n[Service]\nType=oneshot\nExecStart=/usr/sbin/ip link set enp3s0 promisc on\n\n[Install]\nWantedBy=multi-user.target" | sudo tee /etc/systemd/system/promisc.service
sudo systemctl enable promisc.service
这里有个常见误区:很多人直接照搬教程的子网配置,导致后续无法通信。正确做法是先查看主路由的DHCP范围:
bash复制# 创建macvlan网络(关键参数要根据实际网络调整)
docker network create -d macvlan \
--subnet=192.168.50.0/24 \
--gateway=192.168.50.1 \
--ip-range=192.168.50.240/28 \
-o parent=enp3s0 macnet
参数说明:
--ip-range:建议设置为DHCP范围外的地址段,避免IP冲突parent:必须与前面启用的物理网卡名称一致docker network inspect macnet验证配置官方镜像的默认配置不适合旁路由模式,我们需要自定义network配置。建议使用这个优化后的版本:
bash复制mkdir -p ~/docker/openwrt
cat > ~/docker/openwrt/network <<'EOF'
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option packet_steering '1'
config interface 'lan'
option ifname 'eth0'
option proto 'static'
option netmask '255.255.255.0'
option ipaddr '192.168.50.254'
option gateway '192.168.50.1'
option dns '192.168.50.1'
option delegate '0' # 关键参数,避免IPv6冲突
config interface 'vpn0'
option ifname 'tun0'
option proto 'none'
EOF
推荐使用这个经过实测稳定的镜像:
bash复制docker run -d \
--name immortalwrt \
--restart unless-stopped \
--network macnet \
--privileged \
--ip 192.168.50.254 \
-v ~/docker/openwrt/network:/etc/config/network \
-v ~/docker/openwrt/luci:/etc/config/luci \
sulinggg/openwrt:x86_64 \
/sbin/init
启动后建议等待2-3分钟,让系统完成初始化。检查是否运行正常:
bash复制# 查看容器日志
docker logs immortalwrt
# 进入容器控制台
docker exec -it immortalwrt bash
# 在容器内检查网络
ping -c 3 baidu.com
通过浏览器访问http://192.168.50.254进入Luci管理界面(初始无密码):
进入网络 → 接口 → LAN修改:
在防火墙设置中:
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE让家庭设备使用旁路由有三种方式:
手动指定网关(适合临时设备):
192.168.50.254主路由DHCP分配(适合小米等路由器):
DHCP中继方案(最推荐):
bash复制# 在旁路由上安装dhcp-relay
opkg update
opkg install dhcp-relay
# 配置中继到主路由
echo "INTERFACES='eth0'" > /etc/default/dhcp-relay
echo "SERVERS='192.168.50.1'" >> /etc/default/dhcp-relay
/etc/init.d/dhcp-relay restart
ImmortalWrt内置的AdGuard Home比第三方插件更省资源:
bash复制# 容器内执行
opkg update
opkg install adguardhome luci-app-adguardhome
/etc/init.d/adguardhome enable
配置技巧:
https://anti-ad.net/easylist.txttls://dns.google使用nftables替代默认防火墙,大幅降低CPU占用:
bash复制# 安装必要组件
opkg install nftables kmod-nft-offload
# 备份现有规则
iptables-save > /etc/iptables.rules
# 转换规则
iptables-restore-translate -f /etc/iptables.rules > /etc/nftables.conf
nft -f /etc/nftables.conf
# 设置开机加载
echo -e "#!/bin/sh\nnft -f /etc/nftables.conf" > /etc/hotplug.d/iface/99-nftables
chmod +x /etc/hotplug.d/iface/99-nftables
问题1:容器启动后无法访问管理界面
ifconfig eth0 up问题2:设备通过旁路由上网速度慢
kmod-usb-net-rtl8152等驱动问题3:DNS解析异常
tls://223.5.5.5)遇到其他问题时,建议先查看内核日志:
bash复制docker exec immortalwrt logread -f
这种Docker化部署方式最大的好处就是可移植性。去年我家升级网络设备时,只需要把整个~/docker目录备份,在新机器上恢复后立即就能用。相比传统路由器刷机方案,维护成本低了不止一个量级。