我有一个 Docker Swarm 集群,其中一个节点上运行着一个 Prometheus 容器,Prometheus 配置为通过端口 9100(节点导出器)上的公共 IP 地址抓取所有 Swarm 节点的数据,所有这些 IP 都是动态收集的。
iptables
我还在所有节点上使用如下基本配置:
# Accept loopback interface traffic
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Allow ICMP traffic
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p icmpv6 -j ACCEPT
# Allow SSH traffic
-A INPUT -p tcp --dport 22 -j ACCEPT
# Allow HTTP and HTTPS traffic
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# Allow all traffic from the swarm nodes
-A INPUT -s <OTHER_SWARM_NODE_IP> -j ACCEPT
-A INPUT -s <OTHER_SWARM_NODE_IP> -j ACCEPT
-A INPUT -s <OTHER_SWARM_NODE_IP> -j ACCEPT
# Also this host's public IP is listed here (Created dynamically)
-A INPUT -s <HOST_PUBLIC_IP> -j ACCEPT
# Set the default INPUT policy to DROP
-P INPUT DROP
目前,由于我的规则,Prometheus 容器无法连接到它正在运行的主机iptables
,我记录了丢弃的数据包,以下是我得到的结果:
Jul 27 13:21:40 node01 kernel: [60855.199560] IPTables-Dropped: IN=docker_gwbridge OUT= PHYSIN=vethe5b3d1e MAC=<MAC_ADDR> SRC=172.18.0.9 DST=<PUBLIC_HOST_IP> LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57363 DF PROTO=TCP SPT=52882 DPT=9100 WINDOW=29200 RES=0x00 SYN URGP=0
因此源 IP 地址是网络172.18.0.9
的一部分docker_gwbridge
,这个 IP 范围在我的规则中不被接受iptables
。
docker_gwbridge
我的问题是,我是否应该添加一条规则来接受来自子网的所有流量172.18.0.0/16
?当然,这个子网可能会在每个主机上发生变化。
我应该添加规则以允许所有私有 IP 地址吗?还是应该允许从docker_gwbridge
接口传入的所有流量?
-A INPUT -i docker_gwbridge -j ACCEPT
从安全角度来看哪种解决方案更好?
答案1
容器是一个隔离的环境。如果您没有在主机本身上运行 DNS 和 NTP 等服务,则没有理由允许容器访问它。仅允许转发流量以授予对外部网络的访问权限。
定义主机上允许容器访问的服务列表。并使用输入接口匹配(-i docker_gwbridge
)和多端口目标(-m multiport --dports <srv1>,<srv2>,<srv3>
)授予对主机上这些服务的访问权限。