如何在CentOS7上使用防火墙保护Docker容器的端口

防火墙设置对Docker容器内开放的端口无效?

在主机或虚机上运行Docker容器时,即便主机启用了firewalld服务,仍然存在一些安全隐患,尤其是当Docker容器内打开端口并监听0.0.0.0时,存在即使通过firewall-cmd配置了阻止某些端口被外部访问也不生效的问题,firewall-cmd配置阻止的端口实际测试下来还是公开并对所有请求开放的。

我测试的场景:在CentOS 7.9上安装了Docker版本20.10.17,并运行了一个Docker容器,该容器在3000端口上打开并监听0.0.0.0。我通过systemctl start firewalld启动了firewalld服务,并配置防火墙只允许外部访问22端口。按理说,这样配置后服务器上的3000端口应该无法从外部访问,但实际测试结果却相反,其他服务器成功访问了3000端口。

问题分析

Docker 控制容器网络访问的一种方式是通过在 iptables 中维护一个名为 "DOCKER-USER" 的特定链条。默认情况下,Docker 在 "DOCKER-USER" 链中添加的规则是允许所有 IP 地址访问的,这可能会带来潜在的安全风险。值得注意的是,"DOCKER-USER"链是在 Docker 服务启动时自动添加的。并且在防火墙重启时会删除这个链,重新启动docker服务会重新添加。

解决方案

  1. 停止docker服务

    bash 复制代码
    systemctl stop docker
  2. 删除并手动重建DOCKER-USER链

    bash 复制代码
    firewall-cmd --permanent --direct --remove-chain ipv4 filter DOCKER-USER
    firewall-cmd --permanent --direct --remove-rules ipv4 filter DOCKER-USER
    firewall-cmd --permanent --direct --add-chain ipv4 filter DOCKER-USER
  3. 添加docker相关防火墙规则,其中172.17.0.0/16根据容器使用的docker network决定,可以通过docker network ls命令查看docker网络,然后通过docker network inspect bridge (bridge是选定的网络名)查看网络信息,网络信息中找到类似这样的部分 "Subnet": "172.17.0.0/16"

    bash 复制代码
    firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
      -m conntrack \
      --ctstate RELATED,ESTABLISHED -j ACCEPT \
      -m comment --comment '允许容器内访问外部网络'
    
    firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
      -j RETURN \
      -s 172.17.0.0/16 \
      -m comment --comment '允许容器内部通信'
  4. 添加具体端口开放策略,例如

    bash 复制代码
    firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
      -o docker0 \
      -p tcp -m multiport \
      --dports 3000 -s 172.31.23.2/32 -j ACCEPT \
      -m comment \
      --comment '允许172.31.23.2访问容器开放的3000端口'
  5. 添加阻止其他到DOCKER-USER链的请求,重启docker服务自动添加的允许所有的规则会在这个规则后,也就是不会生效了。

    bash 复制代码
    firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 10 -j REJECT -m comment --comment '阻止所有其他到DOCKER-USER的请求'
  6. 重启防火墙 firewall-cmd --reload

  7. 启动docker服务 systemctl start docker

参考:https://roosbertl.blogspot.com/2019/06/securing-docker-ports-with-firewalld.html

相关推荐
A_humble_scholar16 小时前
Linux(十七)深入多线程编程:同步原语与实战指南
linux·运维·c++
xinyu39117 小时前
旧版Ubuntu Docker镜像 apt 失败
linux·ubuntu·docker
ljs64827395117 小时前
Linux 实用命令:环境变量、文件传输、压缩解压、跨服务器传文件
linux·运维·服务器
AliCloudROS17 小时前
一次真实录屏:我只说每月别超过 200 块,小程序后端就搭好了
运维·人工智能·云计算
蓝狐社18 小时前
一张被低估的芯片版图——中兴通讯
运维·服务器
bin915318 小时前
使用Docker安装github项目 源码中含有 docker-compose.yml
docker·eureka·github
hanxiuchao18 小时前
告别客户端臃肿!网页端 M3U8 播放调试方案,适配全办公场景
运维·python·django·m3u8·m3u8播放
weixin_3077791319 小时前
Linux下Docker Compose里运行Milvus向量数据库故障诊断Shell脚本
linux·运维·数据库·docker·milvus
素心如月桠19 小时前
windows系统使用https://lnmp.org/的LNMP一键安装包,来打开我的服务器Linux
linux·运维·服务器
SuperherRo19 小时前
云上攻防-云原生篇&Docker安全&Dockfile文件构建制作&不安全的镜像&不安全第三方组件
docker·dockerfile·不安全镜像·第三方组件