基于单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)。
- 容器网络绑定:业务容器仅接入对应网段,避免直接跨网段通信,所有跨网流量必须经过中间管控容器。
四、测试验证步骤
- 启动所有服务:
docker-compose up -d
- 测试External到DMZ的NGINX访问:
# 在主机或连接到external_net的容器中执行 curl 192.168.20.10
- 测试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
相关产品推荐
相关产品推荐

