服务器网络安全策略

Docker网络安全策略

基本概念:Docker 在默认配置下使用 bridge 网络时自动创建的典型规则集。这些规则是 Docker 网络功能的核心部分,即使容器全部使用 bridge 网桥,Docker 仍然会添加这些规则来管理容器网络。

  1. DOCKER 链

    ACCEPT tcp -- anywhere 172.17.0.9 tcp dpt:50000
    
    • 这些是端口转发规则,允许外部流量通过 DNAT 转发到容器
    • 对应 docker run -p 50000:50000 这样的端口映射
  2. DOCKER-USER 链

    RETURN all -- anywhere anywhere
    
    • Docker 保留的用户自定义规则链
    • 关键点:Docker 保证此链中的规则会优先执行
  3. 隔离链

    DOCKER-ISOLATION-STAGE-1/2
    DROP all -- anywhere anywhere
    
    • 实现 Docker 网络命名空间隔离
    • 防止容器间未授权的通信
  4. 连接跟踪链

    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