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转换,直接去访问容器的宿主机了,所以拦不住(这个地方,我感觉解释的有点牵强,有深入理解的大佬,麻烦留言解答一下)
浙公网安备 33010602011771号