背景
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地址
在容器获得LAN区域的地址之后 还可以通过yacd面板监控到容器内的流量 可以说是非常方便了