我在弄清楚如何正确限制对 Docker 容器的外部访问时遇到了一些困难。
到目前为止,我一直在使用多个用户定义的桥接器和暴露的 HTTP/HTTPS 端口。
例如我有:
docker-net-1:
0.0.0.0:9080->80/tcp, 0.0.0.0:9443->443/tcp
docker-net-2:
0.0.0.0:8380->80/tcp
然后,我在 docker 主机上使用反向代理,通过端口 443 为使用基于名称的虚拟主机的不同服务提供外部访问,并确保一切都通过 https 进行。
为了防止直接访问暴露的端口,我使用了DOCKER-USER
iptables 中的链。
-A DOCKER-USER -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
-A DOCKER-USER -i eth0 -j DROP
现在我需要托管另外 2 个应用程序。它们位于不同的网络中,但都公开端口 22。
0.0.0.0:9022->22/tcp
0.0.0.0:9122->22/tcp
对我来说现在最棘手的部分是我需要针对这些端口制定不同的防火墙规则。
我到目前为止尝试过的:
代理人
由于它是 SSH,我不明白如何轻松完成它
在 DOCKER-USER 中打开端口-第一次尝试
由于默认情况下外部访问被禁用,
DOCKER-USER
我添加了以下内容:-A DOCKER-USER -p tcp -m tcp --dport 9022 -j RETURN -A DOCKER-USER -p tcp -m tcp --dport 9122 -j RETURN -A DOCKER-USER -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN -A DOCKER-USER -i eth0 -j DROP
然而,前两条规则从未得到任何实施。
在 DOCKER-USER 中打开端口-第二次尝试
当再次查看 iptables 链时,很明显此时端口不是 9022 而是 22。
-A DOCKER-USER -p tcp -m tcp --dport 22 -j RETURN
其工作符合预期。
在 DOCKER-USER 中打开端口-第三次尝试
我考虑过使用 docker 创建的附加网络接口或 IP 子网来区分这两个不同的应用程序,但是网络接口的名称似乎是随机创建的,并且 IP 地址可能也不是解决问题的好方法,因为这些地址在重新创建时会像网络名称一样发生变化。
现在怎么办?
这里最好的解决方案是什么?理想情况下,我不希望在重新启动服务时出现故障,例如操作现有的 DOCKER 链或使用发生变化的 IP。
答案1
您应该-m conntrack --ctorigdstport 9022
使用--dport 9022
。
更多信息请见此处:https://serverfault.com/a/933803/335954。