linux - 允许 DOCKER-USER 链中的一些 IP 用于入站流量,拒绝所有其他 IP
问题描述
我试图只允许某些 IP 地址访问主机上 docker 容器公开的端口。所有其余的外部 IP 都应该无法访问它们(即使我在 上公开了一个端口0.0.0.0
)。互联网上有很多解决方法如何实现这一点 - 从禁用 docker 的 iptables 管理开始并手动管理所有 iptables 规则(这不是很酷,特别是如果您必须处理 docker swarm 入口路由等),直到使用 cronjobs 和自定义脚本重置 iptables 规则的肮脏解决方案。但是,嘿,我们有一个DOCKER-USER
链条,似乎适合这种东西?
Docker 与防火墙的问题
众所周知,docker 在启动时会添加一些 iptables 链和规则以发挥其网络魔力。问题是它会FORWARD
在每次 docker 服务重启时将这些链添加到链的最顶端,这意味着您在该链上包含拒绝的所有预定义规则变得完全无用。Docker 文档建议将其DOCKER-USER
链用于此类事情(从 docker 的角度来看,此链中的规则保持不变,并且在任何其他 docker 规则之前执行)。
从 docker 文档中的示例中,我们可以看到我们可以允许访问一个 IP(并拒绝其他 IP)使用
-I DOCKER-USER -i eth0 ! -s 1.2.3.4 -j DROP
这种命令有效,只有 IP1.2.3.4
可以访问 docker 的公开端口。但问题是,在这种情况下,容器无法连接到 Internet。
所以情况是...
和
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
一切正常,所有外部流量都被允许,并且:
Chain DOCKER-USER (1 references)
target prot opt source destination
DROP all -- !1.2.3.4 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
只允许 IP1.2.3.4
访问 docker 的公开服务(这很好!),但容器内部没有 Internet 连接。那是个问题。没有添加其他 iptables 规则 - 只有 docker 的默认值 +DOCKER-USER
链中的这个自定义 DROP。我正在尝试RETURN
内部 IP 范围,例如10.0.0.0/8
,172.16.0.0/12
并且192.168.0.0/16
在这个链中(一些论坛帖子建议尝试这样做),所以我的链看起来像:
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- 192.168.0.0/16 0.0.0.0/0
RETURN all -- 172.16.0.0/12 0.0.0.0/0
RETURN all -- 10.0.0.0/8 0.0.0.0/0
ACCEPT all -- 1.2.3.4 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
但仍然没有成功 - docker 的暴露端口只能从1.2.3.4
(这又很好)访问,但仍然没有来自容器的 Internet 连接。
关于为什么会发生这种情况以及如何在限制入站流量的同时允许容器与外界通信的任何想法?
提前致谢!
解决方案
*filter
:DOCKER-USER - [0:0]
-A DOCKER-USER -m state --state RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-USER -s A.B.C.D -j ACCEPT
-A DOCKER-USER -i MY_WAN_INTERFACE_NAME -j DROP
推荐阅读
- javascript - 如何从此键值对中获取给定的突出显示文本信息
- python - 使用用户输入进行 Python 打印
- r - Yelp 餐厅信息网页抓取(运行循环以获取多个餐厅信息时遇到错误)
- c# - 如何在不指定静态高度或宽度的情况下使 ScrollViewer 工作?
- android - 通过适配器膨胀 json 数据
- python - AWS lambda zappa 未使用最新的 boto3 版本
- python - 如何解析列表列表并一起分析元素以查看它们随时间发生的次数?
- javascript - DST 是否影响 Date() 对象
- windows - Windows 批处理文件和带有 & 符号的处理路径
- python - 有没有办法通过 Shopify Python API 获取订单的“销售渠道名称”字段?