duckflew
duckflew
Published on 2025-01-02 / 12 Visits
0
0

OpenWRT下使用Docker几个坑总结

背景

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
在Openwrt上使用Docker之后产生的iptables规则会与Tproxy的防火墙规则冲突,这里有一个相关的issue

临时解决办法

安装issue里面所说编辑/etc/sysctl.d/sysctl-br-netfilter-ip.conf
设置为

net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0

这一步禁用桥接链上面的iptables防火墙确实可以解决与Tproxy的冲突问题。但是这会引起一个新的问题

zerotier冲突问题

在上述配置下,zerotier网络是无法访问容器,但是可以访问局域网内资源,在如下的issue找到一个很好的解决办法,那就是不采用默认的docker0网桥 而是新建一个lanet网桥 桥接到br-lan网桥上,直接给Docker容器分配LAN区域的IP地址
配置如下

docker network create -d bridge \
    --subnet=192.168.5.0/24 --gateway=192.168.5.1 \
    -o "com.docker.network.bridge.name"="br-lan" lanet

其中子网设置为 openwrt LAN 的子网,然后网关指定为 br-lan 网关,比如我的是 192.168.7.0/24

然后在Dockerman 或者是别的什么工具在创建容器的时候 手动指定网络为lanet

例如我这里的dockerman支持用luci界面进行指定网络和ip地址
image-rzdn.png

在容器获得LAN区域的地址之后 还可以通过yacd面板监控到容器内的流量 可以说是非常方便了
image-zuzy.png


Comment