解决树莓派+openwrt+docker容器内无法联网

前言

openwrt里面装了个docker,但是桥接的网络容器内访问不了外网。一顿折腾后在知乎找到了解决办法。

解决

知乎原贴:Openwrt 下 Docker 网络食用方法

摘要:

Docker 使用 Bridge 网络时,会创建docker0 网桥,用于连接容器,然后 docker0 通过 NAT 转发访问外部网络,具体细节在这里就不赘述了。 当容器进行映射时,Docker 会自动添加 DNAT 进行转发,实现访问宿主机端口的时候,将流量转发到容器内部。

在普通宿主机中使用 Docker Bridge 网络没有任何问题,但是,如果宿主机是网关,或者 Openwrt 的时候,WAN 口也能轻松访问容器暴露出来的端口,带来很大的安全问题。

所以核心问题是阻止 WAN 口访问,此前也有大佬 LEAN 采用阻止 Docker 操作 iptables的方案,这个方法简单粗暴,Docker 就不会添加 DNAT 转发,当然不存在端口暴露问题,但是带来的问题也有不少,有几率存在没有给 docker0SNAT 导致整个 bridge 网络下的容器都无法联网,实现下来还有其他一些奇奇怪怪的问题。

iptables

# 新建 DOCKER-MAN 自定义链
iptables -N DOCKER-MAN
# 挟持 DOCKER-USER 转到 DOCKER-MAN 自定义链
iptables -I DOCKER-USER -j DOCKER-MAN

# 若流量来自 br-lan 放行,目的是 `LAN` 口可以访问容器暴露的端口
iptables -A DOCKER-MAN -i br-lan -o docker0 -j RETURN
# 阻止所有新建以及无效的连接。
iptables -A DOCKER-MAN -m conntrack --ctstate NEW,INVALID -o docker0 -j DROP
# 接受容器主动访问的流量,目的是容器能够联网。
iptables -A DOCKER-MAN -m conntrack --ctstate ESTABLISHED,RELATED -o docker0 -j RETURN
iptables -A DOCKER-MAN -j RETURN

非必要操作:

到这里,又有问题来了,如果我有一个容器比如 qBittorrent,暴露的端口就是希望从外部(公司)等管理的,这样一来就无法访问了,当然也有解决方案:

# 在 DOCKER-MAN 自定义链接加入对 172.17.0.9 (需要放行的容器ip) 的放行
iptables -I DOCKER-MAN -d 172.17.0.9 -o docker0 -j RETURN

解决树莓派+openwrt+docker容器内无法联网
http://blog.icy8.cn/posts/23167/
作者
icy8
发布于
2022年5月1日
许可协议