docker无视防火墙问题总结
前言
之前一直使用docker来部署项目,不过发现直接使用-p映射端口则出现问题,如nginx映射80端,一般都会写-p 80:80
,这样导致直接透过系统本机的防火墙,不用开端口可以直接外网访问80端。之前一直使用阿里云、腾讯云机器,可以给ECS实例设置安全组方式限制外网端口,不过针对没有这种设置操作的服务器实例之前一直没有认真研究,现在做一下这次折腾总结记录。
解决方法
- 使用host网络,docker默认是使用bridge桥接网络方式。
- 使用expose方式暴露端口在本机,然后采用nginx、haproxy等代理工具做一次转发
- 映射端口改用
-p 127.0.0.1:8080:8080
,后在本机nginx代理工具映射公网访问服务 - 禁用docker的iptables规则(下面详细介绍该方法)
禁用iptables规则详细说明(centos7系统下)
docker配置修改,禁止iptables规则
# 编辑/lib/systemd/system/docker.service文件 # 在ExecStart后添加 --iptables=false
重载docker配置&重启docker服务
systemctl daemon-reload systemctl restart docker
完成上述两步以及可以采用系统firewall控制端口访问,但会出现docker容器间无法访问,而且容器内也无法访问外部网络。
使用类似NAT网络方式使得docker可以访问外部网络
firewall-cmd --permanent --zone=public --add-masquerade
谈谈使用该方法解决docker无视系统防火墙问题所带来的缺点:容器内无法获取得到客户端的真实IP,由于是类似NAT网络,常常nginx日志上记录的是docker0网络的子网IP,对于一些业务无法获取真实IP可能不能容忍,看个人的取舍吧。
参考文章
无视系统防火墙的docker