我的服务器位于专用网络上:10.17.0.0/16。我决定根据第18个掩码来分割这个网络。10.17.0.0/18——产品服务器。在此子网上,机器之间可以不受限制地相互通信。其余范围(10.17.64.0/18、10.17.128.0.0/18...)无法访问这些服务器。
我的几乎所有应用程序都在 Docker 中运行。我为输入和输出配置了防火墙规则(iptables),一般来说一切正常。但是,我有以下问题:
Docker 在启动时将自己的规则添加到 FORWARD 链中。这些规则允许任何流量在私有 docker 网络内通过。这样,所有子网中的所有计算机都可以访问我的应用程序(值得补充的是,每台计算机都有一个白色 IP)。
我向 FORWARD 链添加了一条规则(第一名):
iptables -I FORWARD 1 ! -s 10.17.0.0/18 -m conntrack --ctstate NEW -j DROP
一般来说它是有效的。我保存规则 ( service netfilter-persistent save
) 并重新启动机器。连接后我看到以下内容:
DOCKER-USER all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
DROP all -- !10.17.0.0/18 anywhere ctstate NEW
也就是说,我的规则已经下移了,现在不能正常工作了!我做了一个小技巧:我将上面的命令添加到 /etc/bash.bashrc 中,现在规则已正确添加。但这是一个可怕的拐杖,根本不可扩展,并且与良好实践不相似(现在每次连接到机器时都会添加此规则,如果我想添加几个特定规则怎么办?..)
请告诉我为了避免在 bash 中编写脚本并使我的规则优先于 docker 规则,应该以哪种方式查看、研究什么。
--- 更新 ---
我有一个 Kafka 容器(带有 Kraft)。我向 DOCKER-USER 添加了以下规则:
iptables -I DOCKER-USER 1 -s 10.17.64.0/18 -j RETURN
iptables -I DOCKER-USER 2 -s 172.0.0.0/8 -j RETURN
iptables -I DOCKER-USER 3 -j DROP
我使用 Kafka 容器将这些规则添加到服务器中。
我使用它是10.17.64.0/18
因为我正在不同的电路中进行实验。
当我添加这些规则时,从应用程序(在同一子网(10.17.64.0/18
)中的另一台主机上)到我的kafka的连接不起作用...
PS
我正在使用带有docker的纯iptables规则。在我对这个电路的所有更改中,只有
PSS上面写的那些。
值得注意的是,否则它可以工作。我正在运行一个 nginx 容器,它只能从专用网络访问;尝试通过 ext-ip 访问它会失败并超时。但 kafka 不再遵守这些规则:(
上述问题是牵强的。以下是标准 Docker 规则。它们是允许外部访问、内部服务之间通信的桥梁。添加 AFTER 禁止规则就足够了。我没有看到进入这里的许可。
如果你想在前面添加规则,那么将这些规则添加到链中
DOCKER-USER
。它将在这些接受之前执行。Docker 在重新启动时不会回收该链。使用命令
iptables-save
- 它会显示正在发生的情况。与iptables-restore
这些命令一起,它们可以方便地存储和推出“您的”规则。到目前为止我已经解决了这个问题如下:
我制作了一个脚本文件,在其中清除了规则
INPUT
和OUTPUT
.FORWARD
我不碰它(因为docker必须制定自己的规则):接下来,我添加了一个服务文件,该文件将在之后运行此脚本
docker.service
(WantedBy
以激活脚本)我将其放入
ENV
脚本中并推出了Ansible剧本:PS我在这里添加这个是为了对某人有所帮助。
PPS 我不能向你保证它是 100% 正确的,我已经这样做了并且有效。
如果有人有更好的解决方案,请给出不同的答案。