docker重启iptables策略失效

失效原因

默认情况下, docker启动后参数中如果加了端口映射, 就会自动将端口开放给所有网络设备访问,并且这种情况下即使在本机的系统防火墙中加规则也无效, 因为docker会自动添加一个优先级最高的针对这个映射端口全开放规则。

所以在iptables表中添加INPUT链策略限制无效。

解决方法

失败

网上有很多说法是,在docker启动时添加"–iptables=false"参数来禁止docker对本机防火墙的操作。

# 给docker的启动服务添加"--iptables=false"参数, 禁止docker去操作防火墙
sed -i  's:^ExecStart=/usr/bin/dockerd.*:ExecStart=/usr/bin/dockerd --iptables=false:g' /lib/systemd/system/docker.service
systemctl daemon-reload
systemctl restart docker
#重启docker后需要重启容器镜像
docker restart $(docker ps -aq)

这样的操作,确实可以实现当docker启动时阻止docker对防火墙的操作,从而使iptables中的INPUT链策略不失效。

但是会有新的问题,当访问服务器的web服务时会报502错误
在这里插入图片描述

排查原因

发现iptables中的docker链策略全没了,没有了策略也就阻碍了容器之间的通信,所以看到了上面502的报错。

[root@gatling01v ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  x.x.x.x              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  x.x.x.x              0.0.0.0/0            tcp dpt:443
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@gatling01v ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination 
成功解决

如果想着对服务端口进行限制指定IP访问,就必须将策略添加到DOCKER-USER链中。

示例:只允许1.1.1.1的主机访问本机的443端口

iptables -I DOCKER  -i eth0 -p tcp --dport 443 -j DROP
iptables -I DOCKER -i eth0 -s 1.1.1.1 -p tcp --dport 443 -j ACCEPT

如果是多个IP,可以简单写个脚本添加策略:

#!/bin/bash

nic="eth0"

ips="
1.1.1.1
2.2.2.2
3.3.3.3
"

iptables -I DOCKER  -i ${nic} -p tcp --dport 443 -j DROP

for ip  in ${ips}
do
  iptables -I DOCKER -i ${nic}  -s ${ip} -p tcp --dport 443 -j ACCEPT
done
vim p.sh        #写入脚本
chmod u+x p.sh  #添加执行权限
./p.sh          #执行脚本
service iptables save  #保存策略
systemctl restart iptables  #重启iptables使策略生效
systemctl enable iptables.service  #设置iptables开机自启

测试后发现策略生效。

参考文章

【iptables&docker】对运行docker的服务器开启iptables策略

Linux系统安装docker后,firewall规则无效不起作用

Docker and iptables

iptables匹配端口范围,映射,网络状态

iptables阻止了应用连到 容器化的MySQL

iptables限制docker端口禁止对某台主机进行提供服务

iptables限制Docker IP和端口访问

使用iptables为docker容器配置防火墙策略

Linux运维实战总结

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐