网络隔离与安全策略
网络隔离是容器安全的基础,下面介绍 Docker 网络隔离方法。
网络隔离原理
Bash
# 不同网络的容器默认隔离
docker network create frontend
docker network create backend
docker run -d --name web --network frontend nginx
docker run -d --name app --network backend my-app
# web 无法访问 app(不在同一网络)
内部网络
Bash
# 创建内部网络(无外网访问)
docker network create \
--driver bridge \
--internal \
internal-net
# 容器可互相访问,但无法访问外部
docker run -d --network internal-net my-db
--internal阻止容器访问外部网络,仅允许内部通信。
网络策略
多网络隔离
YAML
version: '3.8'
services:
nginx:
image: nginx
networks:
- public
- internal
app:
image: my-app
networks:
- internal
- backend
db:
image: postgres
networks:
- backend # 仅 app 可访问
networks:
public:
internal:
internal: true
backend:
internal: true
网络访问控制
Bash
# 仅允许特定服务加入网络
docker network create \
--driver bridge \
--opt com.docker.network.bridge.enable_icc=false \
restricted
# 手动连接网络
docker network connect restricted db
防火墙规则
Bash
# iptables 规则限制容器间通信
sudo iptables -I DOCKER-USER -i docker0 -o docker0 \
-s 172.17.0.0/16 -d 172.17.0.5 -j DROP
# 仅允许特定 IP 段
sudo iptables -I DOCKER-USER -i docker0 \
-s 172.17.0.0/24 -j ACCEPT
端口暴露控制
YAML
# 仅绑定本地 IP
services:
db:
image: postgres
ports:
- "127.0.0.1:5432:5432" # 仅本地访问
# 不暴露端口(仅内部网络)
services:
db:
image: postgres
# 不配置 ports
TLS 加密通信
Bash
# Docker Daemon TLS
# /etc/docker/daemon.json
{
"tls": true,
"tlscacert": "/etc/docker/ca.pem",
"tlscert": "/etc/docker/server-cert.pem",
"tlskey": "/etc/docker/server-key.pem"
}
安全最佳实践
- 使用自定义网络隔离不同服务层级
- 数据库等敏感服务使用内部网络(
internal: true) - 端口绑定
127.0.0.1限制外部访问 - 生产环境启用 Swarm 并使用 overlay 加密
- 定期审计网络配置和 iptables 规则
要点总结
- 不同网络的容器默认隔离,实现基本网络隔离
--internal创建内部网络,阻止访问外部- 多网络策略实现服务分层(public/internal/backend)
- iptables 规则精细控制容器间通信
- 敏感服务端口绑定
127.0.0.1,不暴露到公网
📝 发现内容有误?点击此处直接编辑