docker重启iptables策略失效
docker重启iptables策略失效,--iptables=false禁用后又阻断了容器进程,最后问题已解决
·
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规则无效不起作用
更多推荐
已为社区贡献4条内容
所有评论(0)