jaltek Asked: 2014-03-05 07:07:54 +0800 CST2014-03-05 07:07:54 +0800 CST 2014-03-05 07:07:54 +0800 CST 码头工人和墙 772 我在我的服务器上使用Shorewall作为简单的独立防火墙,并且也想使用Docker。 通过使用 Docker 容器及其端口重定向,docker 设置了自己的 iptables 规则/链,如果重新启动shorewall,这些规则/链将被终止。所以容器将变得不可访问。 是否有人在重新启动岸墙时设法保存/恢复 docker 规则,或者是否有人有其他解决方法? 也可以看看: 有类似问题的 Shorewall Mailinglist GitHub 问题 #2801 @ dotcloud/docker shorewall 7 个回答 Voted Best Answer fazy 2014-09-29T04:47:12+08:002014-09-29T04:47:12+08:00 以下配置更改应确保 Docker 和 Shorewall 主机之间的流量。在 Shorewall 4.5.21.9 上测试,但应适用于最新版本: /etc/shorewall/shorewall.conf 确保启用了 IP 转发(大多数配置项是 Yes/No,但这个是“On”): IP_FORWARDING=On /etc/shorewall/masq 为您的私有 Docker 网络启用伪装(NAT)(如果您使用不同的网络,即您使用 启动 docker --bip=#.#.#.#/#,则相应地进行更改)。更改eth0为具有外部连接的主机上的任何接口: #INTERFACE:DEST SOURCE eth0 172.17.0.0/16 /etc/shorewall/interfaces 添加一个接口条目,以便 Shorewall 知道该dock区域与哪个接口相关: #ZONE INTERFACE OPTIONS dock docker0 /etc/shorewall/zones 创建一个新区域;注意,docker太长会导致“无效的区域名称”错误。 #ZONE INTERFACE dock ipv4 /etc/shorewall/策略 您可能希望允许 Docker 容器与主机和Internet 通信,因此这是一个很好的起点: #SOURCE DEST POLICY # ...(other policies)... dock all ACCEPT # ...(other policies, catch-all)... 如果您还没有使用 to 打开它,您可能还需要一个类似的来自toACCEPT的流量策略。fwdockfwall 您可以根据需要在策略或规则文件中进一步加强这一点。例如,上面没有明确允许外部流量到达您的 Docker 容器;检查您的其他区域/政策/规则。 linuxhackerman 2016-03-26T01:53:02+08:002016-03-26T01:53:02+08:00 由于 Docker 引入了它的网络隔离功能,如果你想使用自定义网络,这里提到的其他解决方案已经不够用了。Shorewall 5.0.6 引入了对 Docker 的支持,包括 Docker 网络。这个: 允许按任何顺序启动/停止/重新启动shorewall和docker 无需维护扩展脚本 Aaron C. de Bruyn 2014-09-10T18:52:19+08:002014-09-10T18:52:19+08:00 刚刚在我的盒子上弄明白了。确保 /etc/shorewall.conf 有: IP_FORWARDING=Yes Docker 依赖于转发,我在我的所有服务器上将“puppet”设置为“No”。 更新:您可能还需要将来自 docker 的流量伪装成您的 WAN 接口。 编辑/etc/shorewall/masq,您将需要类似于以下内容的行: br0 172.17.0.0/12 在这种情况下,我的 WAN 接口实际上是 br0(一个网桥),但你的可能是 eth0 之类的。(ifconfig用于查看您的接口及其 IP 地址)。在我的机器上,docker 使用 172.17.0.0/24 这是一个 RFC1918 私有地址范围。这在其他系统上可能会有所不同,但您可以通过ifconfig再次使用 查找接口来查看范围docker0。 womble 2015-11-24T19:29:55+08:002015-11-24T19:29:55+08:00 您可以通过创建扩展脚本来确保 Docker 规则集在重启前保存DOCKER链,然后在重启后再次恢复它。我刚刚发布了一个帖子,其中包含如何执行此操作的示例,尽管我确信这远非唯一可能的方法。 adamcstephens 2014-05-22T17:22:50+08:002014-05-22T17:22:50+08:00 docker 服务可以在不影响正在运行的容器的情况下重新启动,并且可以在 Shorewall 重新启动后运行以重新加载 docker 特定规则。显然,与容器的网络会在短时间内中断。 至少在我的几个 Archlinux 安装中是这样。 lenybernard 2015-06-19T03:33:23+08:002015-06-19T03:33:23+08:00 refresh 操作不会清除 iptable,因此如果您只想刷新规则或策略,您只需运行 refresh 而不是 restart : sudo shorewall refresh 显然,如果您真的需要重新启动shorewall,问题仍然存在。然后,您必须重新启动 docker 并重新启动您的容器。 DukeLion 2016-08-11T02:18:24+08:002016-08-11T02:18:24+08:00 一种可能的选择是使用 --net=host 选项运行 Docker,以允许容器化应用程序访问主机网络而无需 IP 转发和 NAT。
以下配置更改应确保 Docker 和 Shorewall 主机之间的流量。在 Shorewall 4.5.21.9 上测试,但应适用于最新版本:
/etc/shorewall/shorewall.conf
确保启用了 IP 转发(大多数配置项是 Yes/No,但这个是“On”):
/etc/shorewall/masq
为您的私有 Docker 网络启用伪装(NAT)(如果您使用不同的网络,即您使用 启动 docker
--bip=#.#.#.#/#
,则相应地进行更改)。更改eth0
为具有外部连接的主机上的任何接口:/etc/shorewall/interfaces
添加一个接口条目,以便 Shorewall 知道该
dock
区域与哪个接口相关:/etc/shorewall/zones
创建一个新区域;注意,
docker
太长会导致“无效的区域名称”错误。/etc/shorewall/策略
您可能希望允许 Docker 容器与主机和Internet 通信,因此这是一个很好的起点:
如果您还没有使用 to 打开它,您可能还需要一个类似的来自to
ACCEPT
的流量策略。fw
dock
fw
all
您可以根据需要在策略或规则文件中进一步加强这一点。例如,上面没有明确允许外部流量到达您的 Docker 容器;检查您的其他区域/政策/规则。
由于 Docker 引入了它的网络隔离功能,如果你想使用自定义网络,这里提到的其他解决方案已经不够用了。Shorewall 5.0.6 引入了对 Docker 的支持,包括 Docker 网络。这个:
刚刚在我的盒子上弄明白了。确保 /etc/shorewall.conf 有:
IP_FORWARDING=Yes
Docker 依赖于转发,我在我的所有服务器上将“puppet”设置为“No”。
更新:您可能还需要将来自 docker 的流量伪装成您的 WAN 接口。
编辑
/etc/shorewall/masq
,您将需要类似于以下内容的行:br0 172.17.0.0/12
在这种情况下,我的 WAN 接口实际上是 br0(一个网桥),但你的可能是 eth0 之类的。(
ifconfig
用于查看您的接口及其 IP 地址)。在我的机器上,docker 使用 172.17.0.0/24 这是一个 RFC1918 私有地址范围。这在其他系统上可能会有所不同,但您可以通过ifconfig
再次使用 查找接口来查看范围docker0
。您可以通过创建扩展脚本来确保 Docker 规则集在重启前保存
DOCKER
链,然后在重启后再次恢复它。我刚刚发布了一个帖子,其中包含如何执行此操作的示例,尽管我确信这远非唯一可能的方法。docker 服务可以在不影响正在运行的容器的情况下重新启动,并且可以在 Shorewall 重新启动后运行以重新加载 docker 特定规则。显然,与容器的网络会在短时间内中断。
至少在我的几个 Archlinux 安装中是这样。
refresh 操作不会清除 iptable,因此如果您只想刷新规则或策略,您只需运行 refresh 而不是 restart :
显然,如果您真的需要重新启动shorewall,问题仍然存在。然后,您必须重新启动 docker 并重新启动您的容器。
一种可能的选择是使用 --net=host 选项运行 Docker,以允许容器化应用程序访问主机网络而无需 IP 转发和 NAT。