赞
踩
默认情况下, 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规则无效不起作用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。