服务器网络安全策略
Docker网络安全策略
基本概念:Docker 在默认配置下使用 bridge
网络时自动创建的典型规则集。这些规则是 Docker 网络功能的核心部分,即使容器全部使用 bridge
网桥,Docker 仍然会添加这些规则来管理容器网络。
-
DOCKER 链:
ACCEPT tcp -- anywhere 172.17.0.9 tcp dpt:50000
- 这些是端口转发规则,允许外部流量通过 DNAT 转发到容器
- 对应
docker run -p 50000:50000
这样的端口映射
-
DOCKER-USER 链:
RETURN all -- anywhere anywhere
- Docker 保留的用户自定义规则链
- 关键点:Docker 保证此链中的规则会优先执行
-
隔离链:
DOCKER-ISOLATION-STAGE-1/2 DROP all -- anywhere anywhere
- 实现 Docker 网络命名空间隔离
- 防止容器间未授权的通信
-
连接跟踪链:
DOCKER-CT ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
- 处理已建立的连接跟踪
- 允许响应流量返回
流量路径:PREROUTING -> DOCKER链(DNAT) -> FORWARD -> POSTROUTINGUFW 仅影响:INPUT/OUTPUT 链
网络流向
- 外部客户端 → 容器:经过 PREROUTING → FORWARD → DOCKER-USER 链
- 宿主机 → 容器:直接通过
docker0
网桥,只经过 OUTPUT 链(不受 DOCKER-USER 影响)
graph LR
A[外部客户端] -->|流量| B(宿主机的eth0)
B --> C[PREROUTING链]
C --> D[FORWARD链]
D --> E[DOCKER-USER链]
E --> F[容器]
H[宿主机Nginx] -->|流量| I[OUTPUT链]
I --> J[docker0网桥]
J --> F[容器]
安全加固 - IPV4
禁止本地局域网和容器内网IP外的其他网络访问
# 清空 DOCKER-USER 链(可选)
sudo iptables -F DOCKER-USER
# 添加默认拒绝规则(必须放在最前面)
sudo iptables -I DOCKER-USER -j DROP
# 允许局域网访问所有容器
sudo iptables -I DOCKER-USER -s 192.168.1.0/24 -j ACCEPT
sudo iptables -I DOCKER-USER -s 192.168.31.0/24 -j ACCEPT
# 允许特定IP访问容器(容器IPV4)
sudo iptables -I DOCKER-USER -s 172.17.0.0/24 -j ACCEPT
# 允许容器访问互联网
sudo iptables -I DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
安全加固 - IPV6
禁止本地局域网和容器内网IP外的其他网络访问
# 清空 DOCKER-USER 链(可选)
sudo ip6tables -F DOCKER-USER
# 添加默认拒绝规则(必须放在最前面)
sudo ip6tables -I DOCKER-USER -j DROP
# 允许局域网访问所有容器
sudo ip6tables -I DOCKER-USER -s fe80::/10 -j ACCEPT
# 允许特定IP访问容器(容器IPV6)
sudo ip6tables -I DOCKER-USER -s 2001:db8:1::/64 -j ACCEPT
# 允许容器访问互联网
sudo ip6tables -I DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
删除指定规则
# 查看规则
sudo ip(6)tables -L DOCKER-USER --line-numbers
# 删除指定(上一步显示规则的最前面数字)
sudo ip(6)tables -D DOCKER-USER 1
恢复
# 删除原有的规则
sudo ip(6)tables -F DOCKER-USER
# IPV4
iptables -I DOCKER-USER -s 0.0.0.0/0 -j RETURN
# IPV6
ip6tables -I DOCKER-USER -s ::/0 -j RETURN
本地UFW规则
# 仅允许本地局域网访问3000端口
sudo ufw allow from 192.168.1.0/24 to any port 3000
评论