在家庭或小型办公环境中,传统路由器往往面临性能不足、功能单一的问题。而物理软路由虽然强大,但需要额外设备且功耗较高。这时候,将OpenWRT作为Docker容器部署在现有的双网口主机上,就成了一种优雅的解决方案。
我最初尝试这个方案,是因为家里那台老旧的工控机常年吃灰,但又不想额外购买专业路由器。实测下来,Docker化OpenWRT不仅能实现完整的路由功能,还能节省30%以上的系统资源(相比虚拟机方案)。最关键的是,当需要迁移或升级时,只需要备份一个容器镜像就能搞定。
这种方案特别适合以下场景:
我推荐使用以下配置作为基础环境:
操作系统方面,Ubuntu Server 20.04/22.04是最稳定的选择。我在J4125工控机上实测过,从安装到部署完成不超过30分钟。如果你用的是其他Linux发行版,需要注意docker服务的安装方式可能略有不同。
双网口的角色分配是关键。我的建议方案是:
这里有个容易踩坑的地方:某些网络环境(如校园网)会限制MAC地址认证。这种情况下,传统的macvlan模式可能失效。我的解决方案是采用混合模式:
这是最容易被忽略但至关重要的步骤。没有开启混杂模式,macvlan网络将无法正常工作。具体操作如下:
bash复制# 临时启用
ip link set enp1s0 promisc on
ip link set enp2s0 promisc on
# 永久生效(Ubuntu系统)
cat > /etc/network/if-up.d/promisc <<EOF
#!/bin/bash
/sbin/ip link set enp1s0 promisc on
/sbin/ip link set enp2s0 promisc on
EOF
chmod +x /etc/network/if-up.d/promisc
我曾经因为忘记这个步骤,折腾了两小时找不到问题所在。特别是在使用Ubuntu 20.04+版本时,NetworkManager的默认配置会覆盖这个设置,所以必须通过if-up.d脚本持久化。
创建macvlan网络时,子网规划需要特别注意不要与现有网络冲突。我的配置示例:
bash复制docker network create -d macvlan \
--subnet=192.168.10.0/24 \
--gateway=192.168.10.1 \
-o parent=enp2s0 \
maclan
这里有几个经验值分享:
经过多次测试,我发现sulinggg/openwrt镜像的兼容性最好。启动容器时需要特别注意privileged权限:
bash复制docker run --restart always \
--name openwrt \
-d \
--network maclan \
--privileged \
--ip 192.168.10.2 \
-v /path/to/network:/etc/config/network \
sulinggg/openwrt:x86_64 \
/sbin/init
首次启动后,记得立即修改默认密码:
bash复制docker exec -it openwrt passwd
这是最核心的配置文件示例(/etc/config/network):
text复制config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config device
option name 'br-lan'
option type 'bridge'
list ports 'eth0'
config interface 'lan'
option ifname 'br-lan'
option proto 'static'
option ipaddr '192.168.10.2'
option netmask '255.255.255.0'
option ip6assign '60'
config interface 'wan'
option ifname 'eth1'
option proto 'dhcp'
option gateway '172.17.0.1'
option dns '8.8.8.8 8.8.4.4'
关键点说明:
如果遇到网络不通,建议按照以下顺序检查:
这是我常用的诊断命令组合:
bash复制# 检查容器网络
docker exec -it openwrt ping -c 4 172.17.0.1
# 检查宿主机转发
iptables -t nat -L -n -v
# 临时添加转发规则
iptables -A FORWARD -i docker0 -o enp1s0 -j ACCEPT
iptables -A FORWARD -i enp1s0 -o docker0 -j ACCEPT
经过三个月实际使用,我总结出这些优化建议:
内存限制示例:
bash复制docker update --memory 512m --memory-swap 1g openwrt
利用Docker的网络特性,可以轻松实现VLAN隔离。比如创建多个macvlan网络:
bash复制docker network create -d macvlan \
--subnet=192.168.20.0/24 \
-o parent=enp2s0 \
vlan20
然后在OpenWRT中配置多个LAN接口,分别绑定不同VLAN。我在家庭办公室就用这个方案实现了IoT设备隔离。
一个有趣的用法是让宿主机服务通过macvlan网络暴露。比如部署一个Nginx容器:
bash复制docker run -d --network maclan --ip 192.168.10.3 nginx
这样内网设备就能直接通过192.168.10.3访问,完全绕过了端口映射的复杂性。
长期运行需要注意这些安全实践:
特别是UPnP服务,建议在/etc/config/upnp中关闭:
text复制config upnpd
option enabled '0'
我在初期就因为没有关闭这个服务,导致内网设备被暴露在公网。后来通过定期安全扫描才发现这个问题。