第332篇:园区网 VLAN 规划与实施案例

关键词

园区网、VLAN 规划、VLAN 划分、网络分段、广播域、VLAN 间路由、QinQ、VLAN 管理


一、案例背景

1.1 园区概况

某科技园区网络概况:

园区信息:

园区面积:50,000 平方米 建筑数量:5 栋(A-E) 楼层:每栋 6 层 入驻企业:30+ 总信息点:约 2,000 个 园区网络由物业统一建设运维

网络需求:

  1. 每家企业逻辑隔离 └─ 企业间互访需授权
  2. 每家企业内部分段 └─ 办公网、监控网、门禁网等
  3. 公共区域上网 └─ 大厅、会议室、食堂、停车场
  4. 无线全覆盖 └─ 企业独立 SSID + 公共 Guest SSID
  5. 未来扩展 └─ 新企业入驻,无需变更网络架构

1.2 设计目标

VLAN 规划设计目标:

  1. 可扩展性
  ┌─ 新增企业不影响现有网络
  ├─ VLAN ID 预留充足空间
  └─ 支持按需灵活划分

  2. 安全性
  ┌─ 企业间默认互不可达
  ├─ 互联网访问独立
  └─ 敏感业务额外隔离

  3. 可管理性
  ┌─ VLAN 命名规范,见名知意
  ├─ 统一的 IP 地址分配策略
  └─ 清晰的文档记录

  4. 高可用性
  ┌─ VLAN 跨设备冗余
  ├─ 网关冗余(VRRP/堆叠)
  └─ 链路冗余(链路聚合)

二、VLAN 地址规划

2.1 VLAN ID 规划

VLAN ID 分配策略:

保留段:1-100 ┌─ 1:默认 VLAN(Native) ├─ 10:管理 VLAN(设备管理) ├─ 20:基础设施(DHCP/DNS/NTP 服务器) ├─ 30:园区公共区域(大厅/食堂) └─ 40-99:预留 企业段:101-500 ┌─ 每个企业分配一段连续的 VLAN 池 ├─ VLAN 102-110:企业 A ├─ VLAN 112-120:企业 B └─ ...(每家企业 10 个 VLAN 的池) 无线段:501-600 └─ 公共 Guest Wi-Fi 服务段:601-1000 └─ 特殊业务/预留 VLAN 命名规范: ┌─ T_企业名_用途_子编号 ├─ 示例:T_A_OFFICE_01 (企业A办公) └─ 示例:T_B_CCTV_01 (企业B监控) ├─ 102:办公网 ├─ 104:监控网 ├─ 106:门禁 └─ 108:无线(企业 SSID)

2.2 IP 地址规划

IP 地址规划(10.0.0.0/8 私有地址段):

地址分配策略: | 管理段:10.0.0.0/16 ┌─ 10.0.0.0/24:设备管理 IP ├─ 10.0.1.0/24:基础设施服务器 └─ 10.0.2.0/24 - 10.0.255.0/24:预留 企业段:10.{企业ID}.0.0/16 ┌─ 企业 A(ID=1):10.1.0.0/16 ├─ 企业 B(ID=2):10.2.0.0/16 └─ ... 公共区域:10.254.0.0/16 └─ 10.254.0.0/24:Guest Wi-Fi VLAN 与 IP 的对应关系: ┌─ VLAN 102(企业A办公)= 10.1.0.0/24 ├─ VLAN 104(企业A监控)= 10.1.1.0/24 ├─ 网关统一使用 .254 └─ DHCP 池:.100-.250 | ├─ 10.1.0.0/24:办公网 ├─ 10.1.1.0/24:监控网 ├─ 10.1.2.0/24:门禁 └─ 10.1.10.0/24:无线 | | --- | --- |

2.3 核心设备配置

# generate_vlan_config.py — 批量生成 VLAN 配置

from jinja2 import Environment, FileSystemLoader
import yaml
import json

env = Environment(
    loader=FileSystemLoader("templates")
)

# 园区数据
campus_data = {
    "vlans": [
        # 管理段
        {"id": 10, "name": "MGMT", "subnet": "10.0.0.0/24",
         "gateway": "10.0.0.254"},
        {"id": 20, "name": "INFRA", "subnet": "10.0.1.0/24",
         "gateway": "10.0.1.254"},
        # 公共区域
        {"id": 30, "name": "PUBLIC_AREA",
         "subnet": "10.254.0.0/24",
         "gateway": "10.254.0.254"},
        # 企业 A
        {"id": 102, "name": "A_OFFICE",
         "subnet": "10.1.0.0/24",
         "gateway": "10.1.0.254"},
        {"id": 104, "name": "A_CCTV",
         "subnet": "10.1.1.0/24",
         "gateway": "10.1.1.254"},
        {"id": 106, "name": "A_ACS",
         "subnet": "10.1.2.0/24",
         "gateway": "10.1.2.254"},
        {"id": 108, "name": "A_WIFI",
         "subnet": "10.1.10.0/24",
         "gateway": "10.1.10.254"},
        # 企业 B
        {"id": 202, "name": "B_OFFICE",
         "subnet": "10.2.0.0/24",
         "gateway": "10.2.0.254"},
        {"id": 204, "name": "B_CCTV",
         "subnet": "10.2.1.0/24",
         "gateway": "10.2.1.254"},
        # Guest Wi-Fi
        {"id": 501, "name": "GUEST_WIFI",
         "subnet": "10.254.10.0/24",
         "gateway": "10.254.10.254"},
    ],
    "interfaces": [
        # 核心到 A 栋汇聚
        {"port": "GE0/0/1", "type": "trunk",
         "allowed_vlans": "10,20,102,104,106,108",
         "description": "to BLDG-A-AGG"},
        # 核心到 B 栋汇聚
        {"port": "GE0/0/2", "type": "trunk",
         "allowed_vlans": "10,20,202,204",
         "description": "to BLDG-B-AGG"},
    ],
}


def generate_huawei_config():
    """生成华为 VRP 配置"""
    template = env.get_template("vlan_config_huawei.j2")
    config = template.render(**campus_data)
    return config


def generate_cisco_config():
    """生成 Cisco IOS 配置"""
    template = env.get_template("vlan_config_cisco.j2")
    config = template.render(**campus_data)
    return config

三、VLAN 间路由与控制

3.1 核心交换机三层配置

{# vlan_config_huawei.j2 — 华为核心交换机 VLAN 配置 #}

sysname CORE-SW01

# ========== VLAN 创建 ==========
{% for vlan in vlans %}
vlan batch {{ vlan.id }}
vlan {{ vlan.id }}
 name {{ vlan.name }}
{% endfor %}

# ========== VLANIF 接口(三层网关) ==========
{% for vlan in vlans %}
interface Vlanif{{ vlan.id }}
 description Gateway-for-{{ vlan.name }}
 ip address {{ vlan.gateway }} {{ vlan.subnet|ipmask }}
{% endfor %}

# ========== 物理接口 ==========
{% for intf in interfaces %}
interface {{ intf.port }}
 description {{ intf.description }}
 port link-type trunk
 port trunk allow-pass vlan {{ intf.allowed_vlans }}
{% endfor %}

# ========== VRRP 冗余(备核心) ==========
{% for vlan in vlans %}
interface Vlanif{{ vlan.id }}
 vrrp vrid {{ vlan.id }} virtual-ip {{ vlan.gateway }}
 vrrp vrid {{ vlan.id }} priority 120
{% endfor %}

3.2 ACL 访问控制

{# acl_config.j2 — 访问控制列表 #}

# ========== 企业间隔离 ==========
# 企业 A 的网段不能访问企业 B 的网段
acl name INTER_COMPANY_ISOLATION advanced
 description Inter-company isolation
{% for src_vlan in vlans if src_vlan.id >= 100 and src_vlan.id < 200 %}
 rule 5 deny ip source {{ src_vlan.subnet }}
{% for dst_vlan in vlans if dst_vlan.id >= 200 %}
 rule 10 deny ip source {{ src_vlan.subnet }}
             destination {{ dst_vlan.subnet }}
{% endfor %}
{% endfor %}

# ========== 允许互访的例外 ==========
# 所有企业可访问公共服务器和 Internet
rule 100 permit ip source any destination 10.0.1.0 0.0.0.255
rule 200 permit ip source any destination any

# ========== 应用 ACL ==========
traffic-filter inbound acl name INTER_COMPANY_ISOLATION

3.3 DHCP 配置

{# dhcp_config.j2 — DHCP 服务器配置 #}

# 启用 DHCP
dhcp enable

{% for vlan in vlans %}
# {{ vlan.name }} (VLAN {{ vlan.id }})
ip pool {{ vlan.name }}
 gateway-list {{ vlan.gateway }}
 network {{ vlan.subnet }}
 excluded-ip-address {{ vlan.gateway }}
{% if vlan.id < 100 %}
 dns-list 10.0.1.10 114.114.114.114
{% else %}
 dns-list 10.0.1.10 8.8.8.8
{% endif %}
 lease day 7

interface Vlanif{{ vlan.id }}
 dhcp select global
{% endfor %}

四、实施与验证

4.1 部署前检查清单

VLAN 配置检查清单(实施前):

  □ IP 地址规划检查
  ┌─ 所有 VLAN 的 IP 段无冲突
  ├─ 网关地址统一(.254)
  └─ DHCP 池不包含网关和静态分配

  □ VLAN ID 规划检查
  ┌─ VLAN ID 在企业间预留了增长空间
  ├─ 管理 VLAN 与业务 VLAN 分离
  └─ Native VLAN 已明确

  □ 冗余设计检查
  ┌─ 关键 VLAN 配置了 VRRP/堆叠
  ├─ Trunk 链路支持所有需要的 VLAN
  └─ 上行链路做了链路聚合

  □ 安全策略检查
  ┌─ 企业间隔离 ACL 已配置
  ├─ 管理 VLAN 访问控制
  └─ DHCP Snooping 防范伪 DHCP

4.2 部署验证

# 部署后验证命令

# 1. 查看 VLAN 创建
display vlan
display vlan summary

# 2. 查看 VLANIF 状态
display ip interface brief | include Vlanif

# 3. 查看 Trunk 端口允许的 VLAN
display port vlan active

# 4. 查看 DHCP 地址分配
display ip pool name A_OFFICE used

# 5. 验证 VLAN 间路由
ping -a 10.1.0.100 10.2.0.100  # 应该不通
ping -a 10.1.0.100 10.0.1.10   # 应该通

# 6. 验证 ACL 生效
display traffic-policy applied-record
display acl running

# 7. 验证 VRRP 状态
display vrrp brief

4.3 性能测试

# vlan_performance_test.py — VLAN 性能测试

from netmiko import ConnectHandler
import time
import statistics


def test_vlan_performance():
    """测试 VLAN 间转发性能"""
    device = {
        "device_type": "huawei_vrp",
        "host": "10.0.0.1",  # 核心交换机
        "username": "admin",
        "password": "admin123",
    }

    conn = ConnectHandler(**device)

    # 测试同一 VLAN 内延迟
    same_vlan_rtt = []
    for _ in range(20):
        start = time.time()
        output = conn.send_command(
            "ping -a 10.1.0.100 10.1.0.200 -c 1"
        )
        elapsed = (time.time() - start) * 1000
        if "!" in output:
            same_vlan_rtt.append(elapsed)
        time.sleep(0.5)

    # 测试跨 VLAN 延迟
    cross_vlan_rtt = []
    for _ in range(20):
        start = time.time()
        output = conn.send_command(
            "ping -a 10.1.0.100 10.1.1.100 -c 1"
        )
        elapsed = (time.time() - start) * 1000
        if "!" in output:
            cross_vlan_rtt.append(elapsed)
        time.sleep(0.5)

    results = {
        "same_vlan_avg": statistics.mean(same_vlan_rtt),
        "cross_vlan_avg": statistics.mean(cross_vlan_rtt),
        "same_vlan_min": min(same_vlan_rtt),
        "cross_vlan_min": min(cross_vlan_rtt),
    }

    print("VLAN 性能测试结果:")
    print(f"同一 VLAN 平均延迟: {results['same_vlan_avg']:.2f}ms")
    print(f"跨 VLAN 平均延迟: {results['cross_vlan_avg']:.2f}ms")
    print(f"三层转发增加: {results['cross_vlan_avg'] - results['same_vlan_avg']:.2f}ms")

    conn.disconnect()
    return results

五、故障排查清单

5.1 常见 VLAN 问题

VLAN 常见故障排查:

  问题 1:同一个 VLAN 内的主机不能互通
  ┌──────────────────────────────────────────┐
  │  可能原因:                               │
  │  ┌─ 交换机端口未加入该 VLAN              │
  │  ├─ Trunk 未允许该 VLAN 通过             │
  │  ├─ 端口配置了 Port Security             │
  │  └─ MAC 地址表问题                       │
  │                                           │
  │  排查步骤:                               │
  │  1. display vlan {vlan_id} 查看端口成员  │
  │  2. display port vlan 查看端口 VLAN       │
  │  3. display mac-address 查看 MAC 表      │
  │  4. ping 测试连通性                       │
  └──────────────────────────────────────────┘

  问题 2:跨 VLAN 不能通信
  ┌──────────────────────────────────────────┐
  │  可能原因:                               │
  │  ┌─ VLANIF 接口未配置或状态 Down         │
  │  ├─ ACL 阻止了跨 VLAN 访问               │
  │  ├─ 网关未配置或 IP 冲突                 │
  │  └─ VRRP 主备切换异常                    │
  │                                           │
  │  排查步骤:                               │
  │  1. display ip interface Vlanif {id}     │
  │  2. display acl all                      │
  │  3. display vrrp                         │
  │  4. display current-configuration int Vlanif{id} │
  └──────────────────────────────────────────┘

  问题 3:DHCP 无法获取 IP
  ┌──────────────────────────────────────────┐
  │  可能原因:                               │
  │  ┌─ DHCP 服务器 VLANIF 未配置 dhcp select│
  │  ├─ DHCP Snooping 阻止了响应             │
  │  ├─ IP 地址池已满                        │
  │  └─ DHCP Relay 配置错误                  │
  │                                           │
  │  排查步骤:                               │
  │  1. display ip pool                      │
  │  2. display dhcp snooping                │
  │  3. 抓包分析 DHCP 交互流程               │
  └──────────────────────────────────────────┘

六、最佳实践总结

园区 VLAN 规划最佳实践:

  1. 规划先行
  ┌─ VLAN ID 和 IP 段一一对应
  ├─ 预留充分的扩展空间(VLAN ID 和 IP)
  └─ 命名规范清晰,见名知意

  2. 隔离原则
  ┌─ 管理网络与业务网络分离
  ├─ 不同企业/部门逻辑隔离
  ├─ 敏感业务使用独立 VLAN
  └─ Guest 网络与内网严格隔离

  3. 冗余设计
  ┌─ 网关使用 VRRP/堆叠
  ├─ Trunk 链路做链路聚合
  └─ 关键链路有冗余路径

  4. 安全加固
  ┌─ DHCP Snooping(防伪 DHCP)
  ├─ ARP 防攻击(DAI)
  ├─ MAC 地址表安全
  └─ 端口安全(非信任端口限 MAC 数)

  5. 可管理性
  ┌─ SNMP 监控 VLAN 流量
  ├─ Syslog 记录 VLAN 变更
  └─ 定期导出 VLAN 配置

  6. 文档同步
  ┌─ VLAN 规划表(Excel/CMDB)
  ├─ 拓扑图标明 VLAN 和 Trunk
  └─ 变更记录(谁在何时改了哪个 VLAN)

下篇预告:第333篇《金融行业网络高可用设计案例》——面向金融场景的网络高可用设计,包括设备冗余、链路冗余和故障切换策略。


下篇预告:第333篇《金融行业网络高可用设计案例》——面向金融场景的网络高可用设计,包括设备冗余、链路冗余和故障切换策略。