之前遇到了docker绑定本地端口后通过iptables INPUT 链无法禁用绑定端口访问的问题,刚好深夜醒了睡不着,写篇日志助眠

顺便说下,我的局域网ip是 192.168.31.105

  1. 临时创建nginx端口映射,建立容器,绑定本地端口80
1
sudo docker run --rm -p 8081:80  -it nginx

试下访问本机8081端口尝试是可以通的
1

  1. REJECT掉INPUT链的8081端口访问
1
iptables -I INPUT -p tcp --dport 8081 -j REJECT

再次试下访问本机8081端口,还是可以通的

what

问题如上!!!!!!!

解决方式也很简单,只需要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

2

对应RETURN DOCKER链的规则

1
iptables -t nat -I DOCKER 2 ! -i docker0 -p tcp -m tcp --dport 8081 -j RETURN

RETURN后进入INPUT链,由于之前INPUT 链禁用了8081端口,请求被丢弃

3

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

4

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

5