iptables对docker进行限制
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掉
这个时候再访问,外部就已经无法访问了
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/17440552.html