CentOS 7单机Docker容器的Firewall安全设置

背景说明

生产环境有可能出现从传统虚机转容器化的过渡期.
其中可能会经历先使用单机docker试运行业务的情况, 这样就还没用到k8s
那么就需要对docker的端口做访问策略来加强安全性.
默认情况下, docker启动后参数中如果加了端口映射, 就会自动将端口开放给所有网络设备访问,
并且这种情况下即使在本机的系统防火墙中加规则也无效, 因为docker会自动添加一个优先级最高的针对这个映射端口全开放规则,
这样就需要在docker启动时添加参数来禁止docker对本机防火墙的操作.

基础环境

对象 版本 备注
CentOS 7.5
Docker-CE 18.06.1-ce

网络环境

对象 IP地址 备注
host-1 10.0.0.1 运行docker服务的服务器, 开放服务端口为80, 443, 2266和3888-4500端口, 端口是tcp协议
host-2 10.0.0.2 调用host-1服务的业务服务器
host-3 10.0.0.2 调用host-1服务的业务服务器

规则需求

host-2和host-3需要访问host-1的80, 443, 2266和3888-4500端口, 并且不允许其它设备访问host-1

实施脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash

# host-1系统上操作(非docker的容器内操作)
# 设置启用ip转发功能
cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1

EOF

sysctl -p

设置防火墙仅允许几个用到ldap的设备访问本机的ldap等认证相关的服务
firewall-cmd --permanent --zone=public --new-ipset=whitelist-app --type=hash:ip
firewall-cmd --permanent --zone=public --ipset=whitelist-app --add-entry=10.0.0.2
firewall-cmd --permanent --zone=public --ipset=whitelist-app --add-entry=10.0.0.3

# 开启类似NAT的功能, 让docker内网可以访问外网资源
firewall-cmd --permanent --zone=public --add-masquerade

# 添加对应服务和端口的允许访问规则
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source ipset=whitelist-app service name="http" accept'
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source ipset=whitelist-app service name="https" accept'
firewall-cmd --permanent --add-rich-rule='rule source ipset=whitelist-app port port=2266 protocol=tcp accept'
firewall-cmd --permanent --add-rich-rule='rule source ipset=whitelist-app port port=3888-4500 protocol=tcp accept'

# 重新加载防火墙规则, 让刚才的规则生效
firewall-cmd --reload

# 给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
Introduction to FirewallD on CentOS
使用 firewalld 构建 Linux 动态防火墙

显示 Gitment 评论