一、这玩意儿到底能干啥?
先说结论:Cisco IOS-XE 的 REST API 是个好东西,但 Cisco 的文档是真的拉胯。
我团队去年开始折腾网络自动化,目标很明确——用代码替代手敲 CLI 配路由器。一开始我们瞄着 NETCONF 去,结果发现 IOS-XE 上还有个 REST API 的选项。官方文档吹得天花乱坠,说啥 “REST APIs provide an alternative method to the Cisco IOS XE CLI to provision selected functions”,结果真上手了才发现,全是坑。
Reddit 上有个兄弟说得特实在:
“I’m trying to build an APP, for configuring Cisco IOS XE devices. My problem is that I can’t find documentation for the exact paths of the endpoints.”
这哥们儿的问题我太懂了。Cisco 的 REST API 文档写了跟没写一样,你根本不知道哪个 endpoint 对应哪个配置。更离谱的是,不同版本的 IOS-XE 支持的 endpoint 还不一样。
所以这篇东西,就是我踩了三个月坑之后的总结。不废话,直接上干货。
二、架构:REST API 到底跑在哪儿?
先看一张图,把整个数据流理清楚:
graph TD
A[运维脚本 / App] -->|HTTPS PUT/GET/POST/DELETE| B[Cisco IOS-XE REST API]
B --> C[nginx 反向代理]
C --> D[guest shell / Python 进程]
D --> E[YANG 模型层]
E --> F[IOS-XE 配置数据库]
F --> G[运行配置 running-config]
H[CLI 命令行] -->|传统方式| F
style A fill:#4CAF50,stroke:#333,stroke-width:2px
style B fill:#FF9800,stroke:#333,stroke-width:2px
style F fill:#2196F3,stroke:#333,stroke-width:2px
说白了,REST API 就是一个 HTTP 接口,它把你的 JSON/XML 请求转成 YANG 模型的操作,最终改的是 IOS-XE 的 running-config。
这里有个关键点:Cisco 的 REST API 和 RESTCONF 不是一回事。REST API 是 Cisco 自己搞的一套私有实现,而 RESTCONF 是 IETF 标准(RFC 8040)。IOS-XE 两个都支持,但 API 路径完全不同。
我建议你直接用 RESTCONF,原因后面说。
三、环境准备:CSR1000v 上的配置
拿 CSR1000v 举例,版本 16.12 以上基本都支持。需要先开启 REST API:
! 开启 REST API
ip http secure-server
rest-api
! 验证是否开启
show rest-api status
输出应该类似:
REST API is enabled
HTTP Server: Enabled
HTTPS Server: Enabled
Authentication: Local
就这么简单?对,就这么简单。但坑在后面。
四、踩坑实录:文档是最大的敌人
4.1 找不到 endpoint 路径
Reddit 上那个老哥的问题,我也遇到了。Cisco 的官方文档里只给了几个示例,根本不够用。
我后来发现了一个取巧的办法——直接用 GET 去扫:
# 获取所有可用的 API 路径
curl -k -u admin:password \
https://192.168.1.1/restconf/data
# 返回的内容里会列出所有支持的 YANG 模块
关键路径对照表(我整理了一个多月):
| 配置项 | RESTCONF 路径 | 支持的 IOS-XE 版本 |
|---|---|---|
| 接口配置 | /restconf/data/ietf-interfaces:interfaces | 16.9+ |
| 路由表 | /restconf/data/Cisco-IOS-XE-native:native/ip/route | 16.12+ |
| NAT 配置 | /restconf/data/Cisco-IOS-XE-native:native/ip/nat | 17.3+ |
| ACL | /restconf/data/Cisco-IOS-XE-native:native/ip/access-list | 16.12+ |
| BGP | /restconf/data/Cisco-IOS-XE-native:native/router/bgp | 17.3+ |
| OSPF | /restconf/data/Cisco-IOS-XE-native:native/router/ospf | 16.12+ |
注意看版本列——不同版本支持的 YANG 模型不一样。你拿 16.9 的文档去配 17.3 的机器,大概率翻车。
4.2 认证问题
Cisco REST API 默认用本地认证。但有个坑——它不支持 CSRF token。如果你用 POST/PUT 修改配置,必须确保请求里不带 CSRF 头,否则 403。
# 正确的请求方式
curl -k -u admin:password \
-X PUT \
-H "Content-Type: application/yang-data+json" \
-H "Accept: application/yang-data+json" \
-d '{
"ietf-interfaces:interface": {
"name": "GigabitEthernet1",
"type": "iana-if-type:ethernetCsmacd",
"enabled": true,
"ietf-ip:ipv4": {
"address": [
{
"ip": "192.168.2.1",
"netmask": "255.255.255.0"
}
]
}
}
}' \
https://192.168.1.1/restconf/data/ietf-interfaces:interfaces/interface=GigabitEthernet1
4.3 配置提交的坑
IOS-XE 的 REST API 默认是立即生效的。不像 NETCONF 有 candidate config 的概念,你 PUT 一个配置,它直接写到 running-config。
这意味着什么?意味着你写错一个参数,设备可能直接断网。
我们团队就踩过这个坑——用 REST API 改接口 IP,结果忘记指定 netmask,接口直接 down 了。远程连不上,只能让机房同事插 console 线。
所以生产环境上,我建议你:
- 先用
GET读当前配置 - 用
PATCH而不是PUT做增量修改 - 每次操作前后都做一次配置备份
五、实战:自动化部署 NAT 配置
这是 Reddit 上另一个高频问题——“deploying NATs to clients”。
我们团队用 RESTCONF 实现了自动化 NAT 部署,代码大概长这样:
import requests
import json
from urllib3.exceptions import InsecureRequestWarning
# 关掉 SSL 警告(测试环境用)
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
class CiscoIOSXERestconf:
def __init__(self, host, username, password, port=443):
self.base_url = f"https://{host}:{port}/restconf"
self.auth = (username, password)
self.headers = {
"Content-Type": "application/yang-data+json",
"Accept": "application/yang-data+json"
}
def configure_nat(self, inside_interface, outside_interface, acl_number):
"""
配置动态 NAT (PAT)
"""
nat_config = {
"Cisco-IOS-XE-native:ip": {
"nat": {
"inside": {
"source": {
"list": [
{
"access-list": acl_number,
"interface": outside_interface,
"overload": [None]
}
]
}
}
}
}
}
url = f"{self.base_url}/data/Cisco-IOS-XE-native:native/ip/nat"
response = requests.put(
url,
auth=self.auth,
headers=self.headers,
json=nat_config,
verify=False
)
if response.status_code in [200, 201, 204]:
print(f"NAT 配置成功: {response.status_code}")
else:
print(f"NAT 配置失败: {response.status_code}")
print(f"错误信息: {response.text}")
return response
def get_running_config(self):
"""获取 running-config(只读操作)"""
url = f"{self.base_url}/data/Cisco-IOS-XE-native:native"
response = requests.get(
url,
auth=self.auth,
headers=self.headers,
verify=False
)
return response.json()
# 使用示例
device = CiscoIOSXERestconf(
host="192.168.1.1",
username="admin",
password="password"
)
# 配置 NAT
device.configure_nat(
inside_interface="GigabitEthernet1",
outside_interface="GigabitEthernet2",
acl_number=100
)
这段代码在 CSR1000v 17.6 上跑通了。但注意——不同 IOS-XE 版本的 YANG 模型结构可能有差异,尤其是 overload 字段的表示方式。
六、REST API vs RESTCONF vs NETCONF:到底选哪个?
我做个对比表,一目了然:
| 特性 | Cisco REST API | RESTCONF | NETCONF |
|---|---|---|---|
| 标准 | Cisco 私有 | IETF RFC 8040 | IETF RFC 6241 |
| 传输协议 | HTTPS | HTTPS | SSH |
| 数据格式 | JSON/XML | JSON/XML | XML |
| 配置回滚 | 不支持 | 不支持 | 支持 (candidate) |
| 事务支持 | 无 | 无 | 有 |
| YANG 模型 | 部分支持 | 完整支持 | 完整支持 |
| 学习曲线 | 低 | 中 | 高 |
| 社区支持 | 差 | 中等 | 好 |
我的建议很简单:能用 RESTCONF 就别用 Cisco REST API。
RESTCONF 是标准协议,你学会了可以在 Juniper、Arista 上用同样的思路。Cisco 那个私有 REST API,文档烂、社区差、版本兼容性一塌糊涂,不值得投入。
但如果你非要用 Cisco REST API(比如设备版本太老不支持 RESTCONF),那你得做好心理准备——每次升级 IOS-XE 版本都可能 break 你的脚本。
七、性能和安全:生产环境必须注意的
7.1 性能
REST API 的性能比 CLI 差很多。我们做过压测:
- CLI 配置一个接口:~50ms
- REST API 配置一个接口:~200ms
- RESTCONF 配置一个接口:~150ms
这个延迟主要来自 HTTP 解析和 YANG 模型转换。如果你要批量配置几百个接口,建议用 NETCONF 或者直接生成 CLI 脚本推上去。
7.2 安全
REST API 默认只支持 local 认证。生产环境上一定要:
- 用 HTTPS 而不是 HTTP
- 配置 ACL 限制 API 访问源 IP
- 不要用 admin 账号,创建专用 API 账号并限制权限
! 创建专用 API 账号
username api-user privilege 15 secret StrongPassword123!
! 限制 REST API 访问
ip http access-class 10
access-list 10 permit 192.168.100.0 0.0.0.255
access-list 10 deny any
八、社区声音:大家都在吐槽什么?
Reddit 上关于 Cisco IOS-XE REST API 的讨论,总结下来就三点:
文档是最大的痛点。几乎所有帖子都在抱怨找不到 endpoint 路径。有个哥们儿甚至说 “I have been searching for online documentation about Cisco IOS-XE RESTConf Modules but I still cannot find a good reference”。
版本兼容性差。16.x 和 17.x 的 YANG 模型结构不一样,同一个配置在不同版本上需要不同的 JSON 结构。这导致自动化脚本很难跨版本复用。
Cisco 的 REST API 是个半成品。很多功能只能用 CLI 配,REST API 只覆盖了部分功能。比如 BGP 的高级特性、QoS 策略,REST API 根本不支持。
说实话,这些吐槽我全中。我们团队最后的选择是:REST API 只用来读状态和做简单配置,复杂的配置变更还是走 NETCONF 或者 Ansible。
九、FAQ
Q1: Cisco IOS-XE REST API 和 RESTCONF 有什么区别?
A: REST API 是 Cisco 私有的 HTTP API,只支持部分 YANG 模型,文档不透明。RESTCONF 是 IETF 标准(RFC 8040),支持完整的 YANG 模型,并且是跨厂商的标准。建议优先使用 RESTCONF。
Q2: 怎么找到特定配置对应的 REST API 路径?
A: 用 GET /restconf/data 获取所有可用的 YANG 模块和路径。或者使用 Postman 配合 Cisco 的 YANG 模型浏览器(yangcatalog.org)来探索。
Q3: REST API 配置后需要保存吗?
A: 默认只写入 running-config,不会自动保存到 startup-config。需要额外执行 copy running-config startup-config,可以通过 REST API 调用 Cisco-IOS-XE-rpc:copy-config 操作。
Q4: 生产环境上 REST API 安全吗?
A: 安全取决于你的配置。必须启用 HTTPS、配置 ACL 限制访问源、使用专用 API 账号并限制权限。不建议在公网上直接暴露 REST API。
Q5: 哪些 IOS-XE 版本支持 REST API?
A: CSR1000v 从 IOS-XE 16.6 开始支持 REST API,16.12 以上版本支持 RESTCONF。物理设备(如 ISR4000、ASR1000)的支持版本请查阅 Cisco 官方文档。
十、总结
Cisco IOS-XE REST API 是个好东西,但 Cisco 的文档和社区支持实在拉胯。如果你要搞网络自动化:
- 优先用 RESTCONF,别碰 Cisco 私有 REST API
- 准备好踩坑文档的坑
- 生产环境一定要有回滚方案
- 复杂配置还是用 NETCONF 或者 Ansible
最后说一句:Cisco 的网络设备自动化,2026 年了,文档还是这个鬼样子,只能说传统网络厂商的软件工程能力,确实跟互联网公司差着几个数量级。
