禁用docker开放的端口
之前遇到了docker绑定本地端口后通过iptables INPUT 链无法禁用绑定端口访问的问题,刚好深夜醒了睡不着,写篇日志助眠
顺便说下,我的局域网ip是 192.168.31.105
- 临时创建nginx端口映射,建立容器,绑定本地端口80
1 | sudo docker run --rm -p 8081:80 -it nginx |
试下访问本机8081端口尝试是可以通的
- REJECT掉INPUT链的8081端口访问
1 | iptables -I INPUT -p tcp --dport 8081 -j REJECT |
再次试下访问本机8081端口,还是可以通的

问题如上!!!!!!!
解决方式也很简单,只需要RETURN掉 DOCKER链的对应端口请求,命令如下
1 | iptables -t nat -I DOCKER <要RETURN掉的行号> ! -i <DOCKER网卡名称> -p tcp -m tcp --dport <宿主机端口号> -j RETURN |
查询行号和网卡名称
1 | iptables -t nat -nvL DOCKER --line-number |
对应RETURN DOCKER链的规则
1 | iptables -t nat -I DOCKER 2 ! -i docker0 -p tcp -m tcp --dport 8081 -j RETURN |
RETURN后进入INPUT链,由于之前INPUT 链禁用了8081端口,请求被丢弃

到此,问题解决了,其实倒也不是什么疑难问题,主要是一般请求都会走INPUT链,通过INPUT链禁用本机端口习惯了。而安装docker后,docker容器的请求在prerouting阶段转发到DOCKER链,之后转发到容器ip。如下图,docker容器启动后必然会在iptables增加如下规则:

请求被转发到DOCKER链,之后转发到容器ip,根本没走IPNUT链
