AI辅助设计实战:基于eNSP的中小型校园网络毕业设计自动化方案
1. 手动在 eNSP 里搭校园网的“老毛病”
做毕业设计时,我先用传统方式在 eNSP 上画过三次拓扑,每次都被导师打回,总结下来痛点就这几条:
- IP 规划靠 Excel 手填,后期一扩容就冲突,排错全靠
display ip routing-table人肉比对。 - ACL 写得又多又像,一条策略改 5 台设备,漏刷一次就把教务系统拦在门外。
- VLAN 与子网对应表写在 Word,设备一多,编号跳变、命名大小写不统一,调试时满屏“Error: VLAN does not exist”。
- 验收前临时加无线热点,手动改 AP 组策略,结果忘记把 DHCP Option 43 指向 AC,导致全网漫游失败,熬夜回滚配置。
这些重复劳动占掉 70% 时间,真正用于安全策略、冗余设计反而没空细想。
2. 传统方式 vs AI 辅助:效率与准确性对比
我记录了同一需求(500 信息点、3 栋教学楼、1 数据中心、出口双 ISP)两种做法的耗时:
| 环节 | 纯手工 | AI 辅助 |
|---|---|---|
| 拓扑绘制 | 4 h | 0.2 h(AI 生成 JSON 直接导入) |
| IP/VLAN 规划 | 3 h | 0.1 h(LLM 自动切片) |
| 设备配置 | 6 h | 0.5 h(脚本批量下发) |
| 初验排错 | 5 h | 1 h(AI 提前做冲突检查) |
| 总计 | 18 h | 1.8 h |
准确性方面,手工 ACL 因复制粘贴出现 7 条顺序错误;AI 方案利用“以需求为源”生成,配置一次性通过 eNSP 语法检查,零回退。
3. 提示工程:让大模型吐出合规 CLI
想让大模型一次就给出能直接刷进交换机/路由器的代码,我总结了三段式提示模板:
- 角色:你是一名拥有 HCIE 证书的网络工程师,只输出华为 VRP 8 兼容配置。
- 上下文:给出需求片段——“教学楼 A 有 120 用户,需隔离广播,可访问校内服务器,禁止访问财务网段 10.10.30.0/24”。
- 输出格式:严格按以下顺序,不含解释段落。
sysname SW_A vlan batch 10 30 interface Vlanif10 ip address 192.168.10.1 255.255.255.128 ...把需求拆到最细(用户数、速率、互访关系),模型基本不会“自由发挥”。
4. Python 脚本:本地 LLM 驱动一键出拓扑 + 配置
下面给出最简可运行示例,依赖ollama本地跑qwen:7b,把需求 txt 丢进去,输出拓扑 JSON 与设备配置。
#!/usr/bin/env python3 # -*- coding utf-8 -*- """ campus_network_builder.py 0. 读取需求文档 requirement.txt 1. 调用本地 LLM 生成拓扑与配置 2. 输出 top.json & *.cfg """ import json, textwrap, subprocess, pathlib REQ_FILE = "requirement.txt" TOPO_FILE = "top.json" CFG_DIR = "configs" def read_req() -> str: return pathlib.Path(REQ_FILE).read_text(encoding="utf8") def call_llm(prompt: str) -> str: # 通过 ollama 运行本地模型 cmd = ["ollama", "run", "qwen:7b", prompt] return subprocess.check_output(cmd, text=True) def build_prompt(req: str) -> str: return textwrap.dedent(f"""\ 你是华为网络专家,请根据需求生成 eNSP 拓扑 JSON 与设备配置。 需求如下:{req} 输出格式: ===JSON=== {{拓扑 JSON 内容} ===END=== ===CFG=== 设备名1: ... ===END=== """) def parse_output(raw: str): _, json_part, cfg_part = raw.split("===JSON===")[1].split("===END===") topo = json.loads(json_part.strip()) cfgs = {} for block in cfg_part.strip().split("===END==="): if ":" in block: hostname, config = block.split(":", 1) cfgs[hostname.strip()] = config.strip() return topo, cfgs def save_files(topo, cfgs): pathlib.Path(CFG_DIR).mkdir(exist_ok=True) pathlib.Path(TOPO_FILE).write_text(json.dumps(topo, indent=2), encoding="utf8") for host, cfg in cfgs.items(): pathlib.Path(f"{CFG_DIR}/{host}.cfg").write_text(cfg, encoding="utf8") if __name__ == "__main__": req = read_req() prompt= build_prompt(req) raw = call_llm(prompt) topo, cfgs = parse_output(raw) save_files(topo, cfgs) print("生成完毕,请导入 top.json 到 eNSP,并加载 configs/*.cfg")跑完后目录结构:
├── top.json # eNSP 可读拓扑 └── configs/ ├── SW_Core.cfg ├── SW_Access.cfg └── AR_E.cfg5. 配置幂等、安全与 eNSP 加载验证
幂等:脚本在生成时给每条配置前加
default恢复行,例如:default interface GigabitEthernet0/0/1 interface GigabitEthernet0/0/1 port link-type access port default vlan 10重复刷入不会累积垃圾命令。
安全:LLM 提示里强制写“禁用 telnet,仅启用 SSHv2,用户名 admin privilege 15 加密算法 aes256-ctr”。生成结果默认带:
undo telnet server disable stelnet server enable ssh user admin authentication-type password cipher aes256eNSP 加载:
a. 打开 eNSP → 文件 → 导入 → 选 top.json,拓扑一次到位。
b. 右键设备 → 加载配置 → 选对应 *.cfg → 启动设备。
c. 使用display current-configuration | include ssh核对安全策略;用ping -c 3 192.168.10.254测网关连通性。
6. 生产环境避坑指南
- 子网冲突:AI 可能把“实验楼 200 台”直接算成 /24,却与现有服务器网段重叠。脚本里要加“已用网段池”预检,把冲突检测 prompt 再喂给模型。
- 设备型号不匹配:大模型训练语料新旧混杂,会吐出 S5700 已停产命令。提前在提示里限定“仅使用 VRP 8.180 及以后版本,命令行需兼容 S5731”。
- ACL 顺序幻觉:AI 偶尔把“deny ip 10.10.30.0 0.0.0.255”写在最后,导致被前面的 permit 覆盖。生成后跑一遍
display acl 3000人工确认。 - 默认路由遗漏:若需求里没显式写“访问互联网”,模型可能不生成默认路由,验收时外网不通。提示模板里加“必须包含一条默认路由指向 202.1.1.1”。
7. 效果展示
下图是我用上述脚本 30 秒生成的拓扑,在 eNSP 中直接打开,设备启动无报错,SSH 登录一次成功:
8. 小结与思考
把 AI 当“配置工人”,自己专注架构与安全,毕业设计效率肉眼可见地翻倍。但模型输出仍需要“人类守门员”做冲突检查与版本对齐。
思考题:如果要把这套流程并入 CI/CD,实现“网络即代码(NetDevOps)”,你会:
- 把 requirement.txt 放到 Git,PR 触发脚本生成拓扑与配置;
- 用 eNSP CLI 自动加载拓扑并跑 pytest 脚本做 ping/traceroute 验收;
- 验收通过后将 *.cfg 推送至真实设备(通过 Ansible/Netmiko)。
你觉得哪一步最容易踩坑?又该如何在流水线里回滚配置?欢迎留言交流。