在路由器中安装dockerd

有一些情况下在路由器中安装 dockerd 启动之后会发现不能正常上网。 一般在 openwrt 中安装 dockerd 不会遇到这样的问题, 大多数类似的事情都发生在手搓的路由器上。

查看系统的 iptables 规则, 发现一些 dockerd 在启动的时候会给 iptables 添加一些规则,是因为这些规则导致上网受影响。

 1Chain DOCKER (1 references)
 2target     prot opt source               destination         
 3
 4Chain DOCKER-ISOLATION-STAGE-1 (1 references)
 5target     prot opt source               destination         
 6DOCKER-ISOLATION-STAGE-2  0    --  0.0.0.0/0            0.0.0.0/0           
 7RETURN     0    --  0.0.0.0/0            0.0.0.0/0           
 8
 9Chain DOCKER-ISOLATION-STAGE-2 (1 references)
10target     prot opt source               destination         
11DROP       0    --  0.0.0.0/0            0.0.0.0/0           
12RETURN     0    --  0.0.0.0/0            0.0.0.0/0           
13
14Chain DOCKER-USER (1 references)
15target     prot opt source               destination         
16RETURN     0    --  0.0.0.0/0            0.0.0.0/0       

解决这个问题也不复杂,需要先屏蔽 dockerd 的规则,再创建需要的规则

屏蔽Dockerd启动时添加 iptables 规则

 1// Lion :: ~ »  cat /etc/docker/daemon.json
 2{
 3  "data-root": "/home/zmhu/docker/data/docker",
 4  "bip": "192.168.99.1/24",
 5  "log-driver": "syslog",
 6  "log-opts": {
 7    "syslog-address": "udp://192.168.88.1:514"
 8  },
 9  "iptables": false,
10  "ipv6": true,
11  "fixed-cidr-v6": "fd00:99::/64",
12  "experimental": true,
13  "ip6tables": false,
14  "debug": true
15}

iptables 设置为 false , 如果需要支持 ipv6 同样的 ip6tables 也置为 false

再次启动后 docker 自动创建的 iptables 就不再有了. 下一步就是给 docker 添加路由规则

添加必要的 iptables 规则

1iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -o ${WAN} -j MASQUERADE
2iptables -A INPUT -i ${DOCKER} -j ACCEPT
3iptables -A OUTPUT -o ${DOCKER} -j ACCEPT

如果要支持 ipv6, 需要再添加几条规则

1ip6tables -A FORWARD -i ${DOCKER} -j ACCEPT
2ip6tables -A FORWARD -o ${DOCKER} -j ACCEPT
3ip6tables -t nat -A POSTROUTING -s fd00:99::1/64 -o ${WAN} -j MASQUERADE

一般不需要添加 ipv6 的规则,安装下载类工具(如 transmission),如果没有公网 ipv4 地址,那么给PT号刷上传就得依靠 ipv6 了。除此之外,我想不到还有啥别的需求。