Answers:
以下配置更改应确保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 / interfaces
添加一个接口条目,使Shorewall知道该dock
区域与哪个接口相关:
#ZONE INTERFACE OPTIONS
dock docker0
/ etc / shorewall / zones
创建一个新区域;请注意,docker
时间太长,将导致“无效的区域名称”错误。
#ZONE INTERFACE
dock ipv4
/ etc / shorewall / policy
您可能希望允许Docker容器与主机和 Internet通信,因此这是一个很好的起点:
#SOURCE DEST POLICY
# ...(other policies)...
dock all ACCEPT
# ...(other policies, catch-all)...
您可能还需要一个类似的ACCEPT
交通政策,从fw
到dock
,如果你不已经与打开它fw
来all
。
您可以根据需要在策略或规则文件中进一步加强此功能。例如,以上内容未明确允许外部流量到达您的Docker容器;检查您的其他区域/政策/规则。
/etc/shorewall/interfaces
。
由于Docker引入了其网络隔离功能,因此如果您要使用自定义网络,此处提到的其他解决方案将不再足够。Shorewall 5.0.6引入了对Docker的支持,包括Docker网络。这个:
只是在我的盒子上弄清楚了。确保/etc/shorewall.conf具有:
IP_FORWARDING=Yes
Docker依赖于转发,我在所有服务器上都将“ puppet”设置为“ No”。
更新:您可能还需要伪装来自WAN接口的docker的流量。
编辑/etc/shorewall/masq
,您将需要类似于以下内容的行:
br0 172.17.0.0/12
在这种情况下,我的WAN接口实际上是br0(桥),但是您的WAN接口可能类似于eth0。(ifconfig
用于查看您的接口及其IP地址)。在我的计算机上,docker使用172.17.0.0/24,这是RFC1918专用地址范围。在其他系统上,这可能有所不同,但是您可以ifconfig
再次使用查找接口来查看范围docker0
。
您可以通过创建扩展脚本来确保Docker规则集在Shorewall重新启动后继续生存,该扩展脚本会DOCKER
在重新启动之前保存链,然后在之后重新进行恢复。我刚刚发布了一个示例,介绍了如何执行此操作,尽管我确信这与唯一可行的方法相去甚远。
IP_FORWARDING=Yes
和IP_FORWARDING=True
工作。我已经在多个生产路由器上使用了,但是您的答案比我的要清楚得多。做得好。