CentOS7下Docker端口映射后防火墙失效
大约 3 分钟
背景
- Docker 容器添加端口映射后,会自动添加系统防火墙规则,将端口开放给所有ip访问。
- 使用 firewall-cmd 命令无法查看和管理 Docker 添加的防火墙规则。
- 使用 iptables 能查看该规则,但对其管理无效(firewalld 底层认识 iptables ,重启 firewalld 服务规则复原)
原因
docker 会自动添加一个优先级最高的针对这个映射端口全开放规则。
解决方案
开启防火墙的 masquerade 包转发功能
centos 系统安装好后运行于主机模式,并没有开启包转发功能。 即系统只处理目的地为本机的数据包,不会转发发往其他地址的数据包。 在内核中有相应配置选项 net.ipv4.ip_forward 默认设置为 0。 可以通过命令 sysctl net.ipv4.ip_forward=1 手动开启包转发功能。 防火墙的 masquerade 功能进行地址伪装(NAT), 私网访问公网或公网访问私网都需要开启此功能来进行地址转换,否则无法正常互访。 通过命令 firewall-cmd --add-masquerade 开启此功能, 开启之后 net.ipv4.ip_forward 的值自动被设置为1,即 centos 启用包转发。
在 docke r启动时添加参数来禁止 docker 对本机防火墙的操作。
具体步骤
增加内核配置项参数,在 /etc/sysctl.conf 新增 net.ipv4.ip_forward=1 ,执行 sysctl -p 使配置生效。
执行命令 firewall-cmd --permanent --zone=public --add-masquerade ,开启防火墙的masquerade功能。
在 /lib/systemd/system/docker.service 追加docker服务启动参数–iptables=false
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=false
执行systemctl daemon-reload和systemctl restart docker重启服务或直接reboot
系统推荐
- MySQL常用命令
- 各种网关性能测试
- Spring Cloud(一):服务治理技术概览【Finchley 版】
- Nacos-Spring Gateway-Spring boot无感发布
- 测试两台服务器间的网速
- 你真的会拼接字符串吗?
- index方法压力测试记录
- AQS源码解读
- JVM异常处理
- Lombok的Accessors导致EasyExcel读取失败
- Markdown软件比对
- Linux
- 随机毒鸡汤:喜欢你的时候夸你聪明,不喜欢你的时候,又嫌你太聪明。