限制对 Docker 容器的访问以仅允许 LAN 上的源的正确方法是什么

限制对 Docker 容器的访问以仅允许 LAN 上的源的正确方法是什么

我一直在尝试寻找一种方法来确保容器只能从 (Linux) docker 主机所属的 LAN 访问。我在 Reddit、Stack 和其他一些随机网站上看到有人提出/回答了这个问题。他们只是说明当您发布端口时,要在 compose yaml 中包含 localhost 地址,例如:

ports:
  - 127.0.0.1:8080:8080

我想这是有道理的,但是在实现之后,我看到的 docker 创建的 iptables 是这样的:

Chain DOCKER (5 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.22.0.2           tcp dpt:8080

当我在网关上转发端口时,它可以在 LAN 之外访问

我看到其他人指向这个页面,该页面显示了如何限制所有容器:https://docker-docs.netlify.app/network/iptables/但我不认为(?)该选项对我来说起作用,因为我想有选择地控制哪些容器受到限制。

我还看到提到禁用 Docker 添加规则的功能,但由于文档不建议这样做,所以如果可能的话我宁愿避免这样做。

可能相关的信息:Ubuntu 服务器 22,容器使用默认(桥接)网络模式,ufw 已安装/处于活动状态。

答案1

帖子 限制互联网访问 - Docker 容器 已经接受了 Bilal Usean 的回答

建立网络以访问互联网

docker 网络创建--subnet=172.19.0.0/16 互联网

创建用于阻止 Internet 访问的网络

docker 网络创建--内部--子网 10.1.1.0/24 无互联网

如果你想将docker容器连接到互联网

docker network connect internet container-name

如果你想阻止互联网访问

docker network connect no-internet container-name

笔记

在内部网络中,我们无法公开端口来连接外部世界,请参考此问题更多细节

答案2

以下是我最终采用的方法 -https://github.com/chaifeng/ufw-docker

修改UFW配置文件/etc/ufw/after.rules,在文件末尾添加以下规则:

# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP

COMMIT
# END UFW AND DOCKER

唯一的区别是,我修改了所有对 192.168.0.0/24 的引用以匹配我的 LAN。我做了一些小测试,到目前为止,它没有破坏 Docker 内部网络,它保护容器免受公众攻击,并且允许我使用 ufw 创建规则。

相关内容