docker 环境下的 iptables 复杂配置

最近在项目中,遇到了一个比较辣手的 iptables 规则配置问题。记录一下

简化一下问题:
本文中使用到 docker-compose 服务启动示例如下,虚拟机 IP 为 192.168.111.138

services:
  db:
    image: mariadb:lts
    container_name: mysql_zdp
    restart: always
    ports:
      - "3306:3306"
    environment:
      MARIADB_ROOT_PASSWORD: 123456

有一个跑在容器中的 mysql 服务,使用 iptables 配置,期望让外界访问不了

先从 PREROUTING 链开始分析

iptables -t nat -L PREROUTING -vn


分析可知,所有进入PREROUTING的链,都被 DOCKER 截胡了;

那么,再看一下 DOCKER 链是怎么处理的?

可以看出来,此处将本来访问本机 3306 端口的流量,直接转到了容器内的地址 172.18.0.2:3306

接下来,由于 IP变了,所有接下来的请求,就需要通过 FORWARD链来处理了,而不是 INPUT 链。

根据如上信息,可以看出来,所有发往 docker容器的请求,都是优先通过 DOCKER-USER,所有只要在这个上面,给他拒掉就行了,命令如下

iptables -I DOCKER-USER -p tcp --dport 3306 -j DROP

这个时候,你在外边机器,telnet 3306 端口,发现就不通了。

但是,如果你在服务器本机访问,发现依然可以访问的通

这是为什么呢?我在上面,已经把 iptables 给禁掉了,为什么还能通呢?根据这个大佬的文章解释https://chennima.github.io/blackout-docker-container-with-iptables
我们先查看下,从本机访问的流量,到底被 iptables 转到哪里去了?

根据如上信息,发现又被转到 docker 去了。而 容器通过 nat转换,直接去访问容器的宿主机了,所以拦不住(这个地方,我感觉解释的有点牵强,有深入理解的大佬,麻烦留言解答一下)

参考文献

  1. https://www.cnblogs.com/xiongzaiqiren/p/iptables.html
  2. https://www.cnblogs.com/guangdelw/p/17440552.html
  3. https://chennima.github.io/blackout-docker-container-with-iptables
posted @ 2024-09-02 03:26  沧海一声笑rush  阅读(17)  评论(0编辑  收藏  举报