答案1
以下配置更改应确保 Docker 和 Shorewall 主机之间的流量畅通。已在 Shorewall 4.5.21.9 上测试,但应适用于最新版本:
/etc/shorewall/shorewall.conf
确保 IP 转发已启用(大多数配置项都是“是/否”,但这个配置项是“开”):
IP_FORWARDING=On
/etc/shorewall/masq
为您的私有 Docker 网络启用伪装 (NAT)(如果您使用不同的网络,即使用 启动 docker --bip=#.#.#.#/#
,则进行相应更改)。更改eth0
为具有外部连接的主机上的任何接口:
#INTERFACE:DEST SOURCE
eth0 172.17.0.0/16
/etc/shorewall/接口
添加一个接口条目,以便 Shorewall 知道该dock
区域与哪个接口相关:
#ZONE INTERFACE OPTIONS
dock docker0
/etc/shorewall/区域
创建一个新的区域;注意,docker
太长会导致“区域名称无效”错误。
#ZONE INTERFACE
dock ipv4
/etc/shorewall/策略
你可能希望允许 Docker 容器与主机通信和互联网,所以这是一个很好的起点:
#SOURCE DEST POLICY
# ...(other policies)...
dock all ACCEPT
# ...(other policies, catch-all)...
如果您尚未开放 到 的流量,则可能还需要对从到 的ACCEPT
流量实施类似的策略。fw
dock
fw
all
您可以在政策或者规则文件。例如,以上内容未明确允许外部流量到达您的 Docker 容器;请检查您的其他区域/策略/规则。
答案2
自从 Docker 引入了网络隔离功能后,如果您想使用自定义网络,这里提到的其他解决方案就不再适用了。Shorewall 5.0.6 引入了支持 Docker包括 Docker 网络。这:
- 允许以任何顺序启动/停止/重启 shorewall 和 docker
- 避免维护扩展脚本的需要
答案3
刚刚在我的机器上发现了这个问题。确保 /etc/shorewall.conf 包含:
IP_FORWARDING=Yes
Docker 依赖于转发,并且我在所有服务器上将“puppet”设置为“否”。
更新:您可能还需要伪装来自 docker 的流量通过您的 WAN 接口。
编辑/etc/shorewall/masq
,您将需要类似如下的一行:
br0 172.17.0.0/12
在这种情况下,我的 WAN 接口实际上是 br0(桥接器),但您的接口可能类似于 eth0。(使用查看您的接口及其 IP 地址)。在我的计算机上,docker 使用 172.17.0.0/24,这是一个 RFC1918 私有地址范围。这可能在其他系统上有所不同,但您可以再次ifconfig
使用 查找接口 来查看范围。ifconfig
docker0
答案4
docker 服务可以重新启动而不会影响正在运行的容器,并且可以在 Shorewall 重新启动后运行以重新加载 docker 特定规则。显然,容器的网络会短暂中断。
至少在我安装的几个 Archlinux 中确实如此。