You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于单Docker主机搭建SOC家庭实验室的网络分段方案咨询

单台Docker主机实现SOC家庭实验室网络分段方案

完全可以在单台Docker主机上实现你的需求,无需额外物理机或Kubernetes。以下是具体实现方案:

一、核心思路

  • 用Docker Compose定义三个独立的桥接网络(External、DMZ、Internal),每个分配专属子网
  • 部署防火墙容器同时连接External和DMZ网络,通过iptables控制两个网段的通信
  • 部署FRR路由容器同时连接DMZ和Internal网络,通过路由规则+ACL控制双向通信
  • 各业务容器(如NGINX)仅接入对应网段的网络,依赖中间容器实现跨网段访问

二、Docker Compose配置示例

1. 完整docker-compose.yml

version: '3.8'

networks:
  external_net:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.10.0/24
          gateway: 192.168.10.1
  dmz_net:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.20.0/24
          gateway: 192.168.20.1
  internal_net:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.30.0/24
          gateway: 192.168.30.1

services:
  # 防火墙容器:连接External与DMZ,管控流量
  firewall:
    image: alpine:latest
    container_name: soc_firewall
    networks:
      external_net:
        ipv4_address: 192.168.10.254
      dmz_net:
        ipv4_address: 192.168.20.254
    cap_add:
      - NET_ADMIN
      - NET_RAW
    command: >
      sh -c "
        # 开启IP转发
        echo 1 > /proc/sys/net/ipv4/ip_forward;
        # 允许External访问DMZ的NGINX 80端口
        iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -j ACCEPT;
        # 允许DMZ返回流量到External
        iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT;
        # 默认拒绝所有转发流量
        iptables -P FORWARD DROP;
        tail -f /dev/null
      "

  # FRR路由容器:连接DMZ与Internal,管控双向路由与ACL
  frr:
    image: frrouting/frr:latest
    container_name: soc_frr
    networks:
      dmz_net:
        ipv4_address: 192.168.20.253
      internal_net:
        ipv4_address: 192.168.30.253
    cap_add:
      - NET_ADMIN
      - NET_RAW
    volumes:
      - ./frr.conf:/etc/frr/frr.conf
    environment:
      - FRR_CONFIG_FILE=/etc/frr/frr.conf

  # DMZ区域NGINX服务
  nginx_dmz:
    image: nginx:alpine
    container_name: nginx_dmz
    networks:
      dmz_net:
        ipv4_address: 192.168.20.10
    depends_on:
      - firewall

  # Internal区域测试容器
  internal_test:
    image: alpine:latest
    container_name: internal_test
    networks:
      internal_net:
        ipv4_address: 192.168.30.10
    command: tail -f /dev/null
    depends_on:
      - frr

2. FRR配置文件(frr.conf)

在当前目录创建frr.conf,用于定义路由规则和访问控制:

frr version 8.4
frr defaults traditional
hostname soc_frr
log file /var/log/frr/frr.log

# 启用必要守护进程
service zebra
service staticd

# 配置静态路由,实现跨网段可达
ip route 192.168.30.0/24 192.168.30.253
ip route 192.168.20.0/24 192.168.20.253

# 定义ACL:控制DMZ到Internal的流量
ip access-list DMZ_TO_INTERNAL
 permit icmp any any
 permit tcp any any eq 22
 deny   ip any any

# 定义ACL:控制Internal到DMZ的流量
ip access-list INTERNAL_TO_DMZ
 permit icmp any any
 permit tcp any any eq 80
 deny   ip any any

# 将ACL应用到对应接口
interface eth0  # DMZ网络接口
 ip access-group DMZ_TO_INTERNAL in
 ip access-group INTERNAL_TO_DMZ out

interface eth1  # Internal网络接口
 ip access-group INTERNAL_TO_DMZ in
 ip access-group DMZ_TO_INTERNAL out

line vty

三、关键配置说明

  • 网络权限:防火墙和FRR容器必须添加NET_ADMIN和NET_RAW权限,否则无法操作iptables或路由表。
  • IP转发:防火墙容器内必须开启ip_forward,否则无法转发跨网段流量。
  • 路由与ACL:FRR通过静态路由实现DMZ与Internal的网段可达,通过ACL精准控制允许的流量类型(如ICMP、指定端口TCP)。
  • 容器网络绑定:业务容器仅接入对应网段,避免直接跨网段通信,所有跨网流量必须经过中间管控容器。

四、测试验证步骤

  1. 启动所有服务:
docker-compose up -d
  1. 测试External到DMZ的NGINX访问:
# 在主机或连接到external_net的容器中执行
curl 192.168.20.10
  1. 测试DMZ与Internal的双向通信:
# 从NGINX容器ping Internal测试容器
docker exec nginx_dmz ping 192.168.30.10
# 从Internal测试容器访问NGINX
docker exec internal_test curl 192.168.20.10

五、关于Calico/ipvlan失败的可能原因

  • Calico默认依赖BGP协议,单主机环境下配置复杂,需要额外关闭BGP或调整节点配置。
  • ipvlan需要主机网卡支持,且需手动配置子网与主机路由,容易因路由冲突导致隔离失效。
  • 自定义桥接网络+中间管控容器的方案更适合单主机场景,配置简单且可控性强。

内容的提问来源于stack exchange,提问作者allamiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 09:05:16