Docker容器通信限制:禁止外部容器访问内部容器,允许内部主动访问外部
你要的需求完全可以通过Debian系统的iptables实现,Docker官方提供了DOCKER-USER自定义规则链,专门用于配置容器间的访问控制,不会和Docker自动生成的转发规则冲突。
步骤1:修改docker-compose配置固定容器IP
为了避免容器重启后IP变动导致规则失效,建议新增自定义网桥并为两个容器配置静态IP,修改后的配置如下:
version: "3.9" # 新增自定义网桥,配置固定子网 networks: activemq-net: ipam: config: - subnet: 172.20.0.0/24 services: activemq-external: image: rmohr/activemq:5.15.9 container_name: activemq volumes: - "/Users/test/messaging/broker/broker-1/conf:/opt/activemq/conf" ports: - "61616:61616" - "8161:8161" networks: activemq-net: ipv4_address: 172.20.0.10 activemq-internal: image: rmohr/activemq:5.15.9 container_name: activemq2 volumes: - "/Users/test/messaging/broker/broker-2/conf:/opt/activemq/conf" ports: - "61716:61716" - "7161:7161" networks: activemq-net: ipv4_address: 172.20.0.20
修改后执行docker-compose up -d重启容器生效。
步骤2:配置iptables规则
方案A:仅拒绝external容器到internal容器的主动入站(满足你的第一优先级需求)
两条规则即可实现:允许internal主动发起的连接的回包进入,拒绝所有external主动发往internal的新连接:
# 允许已建立连接的回包通行 iptables -I DOCKER-USER -s 172.20.0.10 -d 172.20.0.20 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # 拒绝external主动发起的新连接 iptables -I DOCKER-USER -s 172.20.0.10 -d 172.20.0.20 -m conntrack --ctstate NEW -j DROP
配置后效果:external无法主动访问internal的任何端口,但internal主动访问external的请求可以正常收到响应,完全符合你模拟防火墙测试duplex连接的需求。
方案B:默认拦截internal所有入站,仅允许主动出站的回包
如果第一方案不符合你的要求,可以用以下规则实现默认禁止所有来源对internal的主动访问,仅允许internal主动发起的连接的回包:
# 允许所有已建立连接的回包进入internal iptables -I DOCKER-USER -d 172.20.0.20 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # 拒绝所有主动发往internal的新连接 iptables -I DOCKER-USER -d 172.20.0.20 -m conntrack --ctstate NEW -j DROP
步骤3:规则持久化
以上配置的iptables规则重启后会失效,执行以下操作实现持久化:
- 安装iptables-persistent包:
apt update && apt install -y iptables-persistent - 保存当前规则:
iptables-save > /etc/iptables/rules.v4
后续如果修改了规则,重新执行保存命令即可生效。
验证方法
- 进入external容器执行
ping 172.20.0.20,预期无法连通 - 进入internal容器执行
ping 172.20.0.10,预期可以正常连通 - 也可以通过telnet测试对应端口的连通性,符合上述逻辑即为配置成功。
内容的提问来源于stack exchange,提问作者lando
相关产品推荐
相关产品推荐

