项目概述#
本指南详细介绍了基于Proxmox VE (PVE)虚拟化平台的家庭实验室网络架构设计与实施方案,致力于构建一个简单、安全、可靠的网络环境。通过合理的网络分段、安全策略和容器化部署,实现高效的资源管理和服务隔离。
网络环境架构设计#
整体网络拓扑#
1
2
3
4
5
6
7
8
9
| graph TB
A[光猫] --> B[Netgate 安全网关]
B --> C[管理网段 192.168.10.0/24]
B --> D[DMZ区域 192.168.11.0/24]
C --> E[PVE 主机 192.168.10.33]
E --> F[基础服务VM<br/>192.168.12.0/24]
E --> G[应用服务VM<br/>192.168.13.0/24]
E --> H[AI服务VM<br/>192.168.14.0/24]
D --> I[对外服务<br/>Web/API]
|
网络分段策略#
1
2
3
4
5
6
7
| # 建议统一网络命名规范
networks:
mgmt: 192.168.10.0/24 # 管理网络
dmz: 192.168.11.0/24 # DMZ区域
base: 192.168.12.0/24 # 基础服务
app: 192.168.13.0/24 # 应用服务
ai: 192.168.14.0/24 # AI服务
|
1. 管理网段 (192.168.10.0/24)#
- 用途: PVE主机管理、路由器管理、网络设备
- 安全级别: 高
- 访问控制: 仅管理员网络访问
- 设备:
- PVE主机: 192.168.10.33
- 网关: 192.168.10.2
- DNS: 114.114.114.114, 8.8.8.8
2. DMZ区域 (192.168.11.0/24)#
- 用途: 对外提供服务的资源
- 安全级别: 中
- 访问控制: 有限的外网访问
- 服务: Web服务、API网关、反向代理
3. 基础服务网段 (192.168.12.0/24)#
- 用途: 数据库、DDNS、监控等基础设施
- 安全级别: 高
- 访问控制: 仅内网访问
- 服务:
4. 应用服务网段 (192.168.13.0/24)#
- 用途: 日常应用服务
- 安全级别: 中
- 访问控制: 内网 + 受控外网访问
- 服务:
5. AI服务网段 (192.168.14.0/24)#
- 用途: AI模型、机器学习环境
- 安全级别: 中
- 访问控制: 内网访问
- 服务:
- Jupyter Lab
- Ollama AI模型
- GPU计算资源
安全策略设计#
防火墙规则#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| # Netgate防火墙规则示例
rules:
# 管理网段保护
- from: any
to: 192.168.10.0/24
ports: [22, 8006]
action: allow
condition: source_in_admin_network
# 服务间通信
- from: 192.168.13.0/24
to: 192.168.12.0/24
ports: [3306, 5432, 6379]
action: allow
# DMZ访问控制
- from: internet
to: 192.168.11.0/24
ports: [80, 443]
action: allow
# 默认拒绝
- from: any
to: any
action: deny
|
网络隔离措施#
- VLAN隔离: 不同服务网段使用独立VLAN
- 微分段: 容器间网络隔离
- 访问控制列表: 精确控制服务间通信
- 流量监控: 实时监控异常网络行为
高可用性设计#
1. 网络冗余#
- 双网卡绑定(Bond)提供链路冗余
- 多路径网络确保服务连续性
2. 服务冗余#
- 关键服务多实例部署
- 负载均衡分散请求压力
- 自动故障转移机制
3. 数据备份#
- 定期数据备份到外部存储
- 配置文件版本控制
- 灾难恢复预案
网络监控与管理#
监控指标#
管理工具#
- PVE Web界面统一管理
- Prometheus + Grafana监控
- ELK日志分析
- 自动化部署脚本
网络配置建议#
PVE网络桥接配置#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| # 创建网络桥接
auto vmbr0
iface vmbr0 inet static
address 192.168.10.33/24
gateway 192.168.10.2
bridge-ports ens18
bridge-stp off
bridge-fd 0
# 服务专用网桥
auto vmbr1
iface vmbr1 inet static
address 192.168.12.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
auto vmbr2
iface vmbr2 inet static
address 192.168.13.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
auto vmbr3
iface vmbr3 inet static
address 192.168.14.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
|
安全加固建议#
网络访问控制
- 启用SSH密钥认证,禁用密码登录
- 配置fail2ban防止暴力破解
- 定期更新安全补丁
服务隔离
- 使用Docker网络隔离容器
- 最小权限原则分配资源
- 定期安全审计
数据保护
性能优化建议#
网络优化
- 启用网卡中断负载均衡
- 调整TCP缓冲区大小
- 配置网络队列优化
存储优化
- 使用SSD存储系统盘
- 配置适当的I/O调度器
- 启用存储缓存策略
操作系统准备#
软件更新#
1
2
3
4
| sudo apt-get update && \
sudo apt-get install g++ && \
sudo apt-get install gcc && \
sudo apt-get install make
|
磁盘配置#
1
| sudo lvresize -l +85%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
|
网络设置#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| network:
version: 2
ethernets:
ens18:
dhcp4: no # 关闭IPV4 DHCP
dhcp6: no # 关闭IPV6 DHCP
addresses:
- 192.168.10.33/24 # IP
routes:
- to: default
via: 192.168.10.2 # 网关
nameservers: # DNS
addresses:
- 114.114.114.114
- 8.8.8.8
|
网络存储配置#
1
2
3
4
5
6
7
8
| sudo mount -t cifs //192.168.10.2/kaken /mnt/ndisk
# 自动加载 mount
sudo vim /etc/fstab
//192.168.10.2/kaken /mnt/ndisk cifs guest,uid=1000,gid=1000,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0
sudo mount -t cifs //192.168.10.2/kaken /mnt/ndisk -o guest,uid=$(id -u),gid=$(id -g)
|
Docker 安装配置#
参考:Docker官方安装文档
卸载已存在的 Docker#
- 卸载 Docker Engine, CLI, containerd 和 Docker Compose 包:
1
| sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
|
- 删除所有镜像、容器和数据卷:
1
2
| sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
|
- 移除源列表和密钥:
1
2
| sudo rm /etc/apt/sources.list.d/docker.list
sudo rm /etc/apt/keyrings/docker.asc
|
注意: 需要手动删除任何编辑过的配置文件。
卸载所有包配置#
1
2
| # uninstall all conflicting packages
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
|
使用 apt 安装#
- 添加 Docker 官方 GPG key
1
2
3
4
5
| sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
- 添加 Docker 源
1
2
3
4
5
| echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
|
- 安装 Docker 包
1
| sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
- hello-world 镜像运行验证
1
| sudo docker run hello-world
|
配置源 + nvidia-container-runtime#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.ducust.site",
"https://ghcr.io",
"http://mirror.azure.cn",
"https://dockerpull.org"
],
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
}
}
EOF
|
容器服务安装与网络配置#
网络安全配置#
在部署容器服务前,建议先配置Docker网络安全策略:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 创建自定义网络
docker network create --driver bridge \
--subnet=192.168.12.0/24 \
--gateway=192.168.12.1 \
base-network
docker network create --driver bridge \
--subnet=192.168.13.0/24 \
--gateway=192.168.13.1 \
app-network
docker network create --driver bridge \
--subnet=192.168.14.0/24 \
--gateway=192.168.14.1 \
ai-network
|
基础服务部署 (BASE)#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| # 创建基础服务网络
docker network create base-services
# 自动更新看门狗 - 限制网络访问
docker run --detach \
--name watchtower \
--network base-services \
--volume /var/run/docker.sock:/var/run/docker.sock \
--restart always \
-e WATCHTOWER_CLEANUP=true \
-e WATCHTOWER_SCHEDULE="0 0 2 * * *" \
containrrr/watchtower --interval 1800 --cleanup
# PostgreSQL 数据库 - 内网访问
docker run -d \
--name postgres \
--network base-services \
--restart unless-stopped \
-e POSTGRES_DB=homelab \
-e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=secure_password \
-v postgres_data:/var/lib/postgresql/data \
postgres:15-alpine
# Redis 缓存 - 内网访问
docker run -d \
--name redis \
--network base-services \
--restart unless-stopped \
-v redis_data:/data \
redis:7-alpine redis-server --appendonly yes
# 监控系统 Prometheus
docker run -d \
--name prometheus \
--network base-services \
--restart unless-stopped \
-p 9090:9090 \
-v prometheus_config:/etc/prometheus \
-v prometheus_data:/prometheus \
prom/prometheus
|
应用服务部署 (APP)#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| # 创建应用服务网络
docker network create app-services
# 自动更新看门狗
docker run --detach \
--name watchtower-app \
--network app-services \
--volume /var/run/docker.sock:/var/run/docker.sock \
--restart always \
containrrr/watchtower --interval 1800 --cleanup
# DDNS ddns-go 服务 - 安全配置
docker run -d \
--name ddns-go \
--restart=always \
--network app-services \
-p 9876:9876 \
-v ~/ddns-go:/root \
-e DDNS_PROVIDER=cloudflare \
ghcr.io/jeessy2/ddns-go
# 反向代理服务
sudo docker run -d \
--name zoraxy \
--restart unless-stopped \
--network app-services \
--add-host=host.docker.internal:host-gateway \
-p 80:80 \
-p 443:443 \
-p 8000:8000 \
-v /home/atovk/zoraxy/config/:/opt/zoraxy/config/ \
-v /home/atovk/zoraxy/plugin/:/opt/zoraxy/plugin/ \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/localtime:/etc/localtime \
-e FASTGEOIP="true" \
zoraxydocker/zoraxy:latest
|
AI服务部署 (AI)#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| # 创建AI服务网络
docker network create ai-services
# 自动更新看门狗
docker run --detach \
--name watchtower-ai \
--network ai-services \
--volume /var/run/docker.sock:/var/run/docker.sock \
--restart always \
containrrr/watchtower --interval 1800 --cleanup
# Ollama - GPU支持与安全配置
docker run -d \
--gpus=all \
--name ollama \
--network ai-services \
--restart unless-stopped \
-v /mnt/ndisk/.ollama:/root/.ollama \
-p 11434:11434 \
-e OLLAMA_HOST=0.0.0.0 \
ollama/ollama
# Jupyter Lab - 安全配置
docker run -d \
--name jupyter \
--network ai-services \
--restart unless-stopped \
-p 8888:8888 \
-v jupyter_data:/home/jovyan/work \
-e JUPYTER_ENABLE_LAB=yes \
-e JUPYTER_TOKEN=secure_token_here \
jupyter/tensorflow-notebook:latest
# Open WebUI - Ollama前端界面
docker run -d \
--name open-webui \
--network ai-services \
--restart unless-stopped \
-p 3001:8080 \
-v open_webui_data:/app/backend/data \
-e OLLAMA_BASE_URL=http://ollama:11434 \
ghcr.io/open-webui/open-webui:main
# 获取AI模型 - 安全下载
docker exec -it ollama ollama pull qwen2.5:latest
docker exec -it ollama ollama pull llama3.2:latest
docker exec -it ollama ollama pull nomic-embed-text:latest
# 测试API连接 - 内网访问
curl http://localhost:11434/api/chat -d '{
"model": "qwen2.5",
"messages": [
{ "role": "user", "content": "请介绍一下网络安全的重要性" }
]
}'
|
网络安全监控#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 网络流量监控
docker run -d \
--name netdata \
--restart unless-stopped \
--network host \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--cap-add SYS_PTRACE \
--security-opt apparmor=unconfined \
netdata/netdata
# 容器安全扫描
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image --severity HIGH,CRITICAL ollama/ollama
|
网络安全最佳实践#
定期维护任务#
1. 安全更新#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 系统更新脚本
#!/bin/bash
# update_system.sh
# 更新系统包
sudo apt update && sudo apt upgrade -y
# 更新Docker镜像
docker images --format "table {{.Repository}}:{{.Tag}}" | \
grep -v "REPOSITORY" | \
xargs -I {} docker pull {}
# 清理无用镜像
docker image prune -f
# 检查容器健康状态
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
2. 备份策略#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 自动备份脚本
#!/bin/bash
# backup_config.sh
BACKUP_DIR="/mnt/ndisk/backups/$(date +%Y-%m-%d)"
mkdir -p $BACKUP_DIR
# 备份Docker配置
docker run --rm -v docker_volumes:/volumes \
-v $BACKUP_DIR:/backup alpine \
tar czf /backup/docker_volumes.tar.gz -C /volumes .
# 备份网络配置
cp /etc/netplan/*.yaml $BACKUP_DIR/
cp /etc/docker/daemon.json $BACKUP_DIR/
# 备份PVE配置
cp -r /etc/pve $BACKUP_DIR/ 2>/dev/null || true
echo "备份完成: $BACKUP_DIR"
|
3. 监控告警#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # 系统监控脚本
#!/bin/bash
# monitor_system.sh
# 检查磁盘使用率
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 80 ]; then
echo "警告: 磁盘使用率超过80%: $DISK_USAGE%"
fi
# 检查内存使用
MEM_USAGE=$(free | awk 'NR==2 {printf "%.0f", $3/$2*100}')
if [ $MEM_USAGE -gt 85 ]; then
echo "警告: 内存使用率超过85%: $MEM_USAGE%"
fi
# 检查容器状态
UNHEALTHY=$(docker ps --filter "health=unhealthy" -q | wc -l)
if [ $UNHEALTHY -gt 0 ]; then
echo "警告: 有 $UNHEALTHY 个容器状态异常"
fi
|
故障排除指南#
网络连接问题#
检查网络配置
1
2
3
4
5
6
7
8
| # 检查网络接口
ip addr show
# 检查路由表
ip route show
# 测试网络连通性
ping -c 3 192.168.10.2
|
Docker网络问题
1
2
3
4
5
6
7
8
| # 查看Docker网络
docker network ls
# 检查容器网络配置
docker inspect <container_name> | grep -A 10 NetworkSettings
# 重建Docker网络
docker network prune
|
容器服务问题#
查看容器日志
1
| docker logs -f <container_name>
|
重启服务
1
| docker restart <container_name>
|
资源使用检查
扩展建议#
1. 高级安全配置#
- 部署Web应用防火墙(WAF)
- 配置入侵检测系统(IDS)
- 实施零信任网络架构
2. 性能优化#
- 使用CDN加速静态资源
- 配置数据库读写分离
- 实施缓存策略优化
3. 可观测性增强#
- 部署APM性能监控
- 配置分布式链路追踪
- 实施日志聚合分析
本指南提供了一个完整的家庭实验室网络架构设计方案,重点关注:
- 简单性: 清晰的网络分段和标准化的部署流程
- 安全性: 多层次的安全防护和访问控制
- 可靠性: 冗余设计和自动化运维
通过遵循这些设计原则和最佳实践,您可以构建一个稳定、安全、易于管理的家庭实验室环境。记住定期备份配置文件、更新系统补丁,并监控系统运行状态,以确保环境的长期稳定运行。
最后更新: 2025年8月