最近在项目中,遇到了一个比较辣手的 iptables
规则配置问题。记录一下
简化一下问题:
本文中使用到 docker-compose
服务启动示例如下,虚拟机 IP 为 192.168.111.138
services:db:image: mariadb:ltscontainer_name: mysql_zdprestart: alwaysports:- "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
去了。
参考文献
- https://www.cnblogs.com/xiongzaiqiren/p/iptables.html
- https://www.cnblogs.com/guangdelw/p/17440552.html
- https://chennima.github.io/blackout-docker-container-with-iptables