iptables对docker进行限制

发布时间 2023-05-29 15:23:51作者: 厚礼蝎

linux中通常我们限制主机上的端口,都是在filter表上的INPUT链中做限制

ubuntu中的ufw工具虽然在每个链上都有作用,但是也因为每次docker重启,规则都是添加在最上面,所以,ufw是无法对docker进行限制

而无论我们怎么在三个表上配置,都无法对docker的端口进行限制

举个栗子

这里我们以docker容器映射到主机的30000端口为例,我们希望内部可以访问30000端口,而外部流量不能访问

目前是内外都可以访问

分析原因

docker服务本身会在iptables中插入很多规则,甚至定义许多自定义化的链。

首先数据包到达nat表时,在预路由阶段,就被docker匹配到了

然后查看自定义链DOCKER

可以看到咱们对docker映射的端口都是在这里做了转发,那是不是只要在这里插入一条规则,对指定的端口进行拦截就好了呢?

并不可以,nat表无法做类似drop的操作

而,只要在这里无法拦截到30000端口,那么,其他表也就无法操作30000端口

所以,这里是无法做拦截的,要拦截就还是要在filter表中操作,但是在filter中拦截30000端口已经拦截不到了

这也就是为什么无论怎么在iptables中拦截,都不起作用

解决办法

先查看filter表

注意到,在FORWARD链中存在一个自定义的 DOCKER-USER

在docker官方推荐的就是在 DOCKER-USER 链中对端口进行拦截

但是你会发现,同样连接30000端口也没什么用,这是因为在nat表的时候就对流量做了转发,所有到30000的流量都会转到9103端口,所以到了filter中,无论我们怎么拦截30000都是无济于事的

这个时候要拦截的就是容器的端口了,就不再是主机端口30000了

直接配置

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

对所有对tcp的9103端口的访问,都drop掉

这个时候再访问,外部就已经无法访问了