运维笔记

Cisco IOS-XE REST API 从入门到踩坑:CSR1000v 实战教程与 YANG 模型解析

Infrastructure 技术可视化

一、这玩意儿到底能干啥?

先说结论: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:interfaces16.9+
路由表/restconf/data/Cisco-IOS-XE-native:native/ip/route16.12+
NAT 配置/restconf/data/Cisco-IOS-XE-native:native/ip/nat17.3+
ACL/restconf/data/Cisco-IOS-XE-native:native/ip/access-list16.12+
BGP/restconf/data/Cisco-IOS-XE-native:native/router/bgp17.3+
OSPF/restconf/data/Cisco-IOS-XE-native:native/router/ospf16.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 线。

所以生产环境上,我建议你:

  1. 先用 GET 读当前配置
  2. PATCH 而不是 PUT 做增量修改
  3. 每次操作前后都做一次配置备份

五、实战:自动化部署 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 APIRESTCONFNETCONF
标准Cisco 私有IETF RFC 8040IETF RFC 6241
传输协议HTTPSHTTPSSSH
数据格式JSON/XMLJSON/XMLXML
配置回滚不支持不支持支持 (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 认证。生产环境上一定要:

  1. 用 HTTPS 而不是 HTTP
  2. 配置 ACL 限制 API 访问源 IP
  3. 不要用 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 的讨论,总结下来就三点:

  1. 文档是最大的痛点。几乎所有帖子都在抱怨找不到 endpoint 路径。有个哥们儿甚至说 “I have been searching for online documentation about Cisco IOS-XE RESTConf Modules but I still cannot find a good reference”。

  2. 版本兼容性差。16.x 和 17.x 的 YANG 模型结构不一样,同一个配置在不同版本上需要不同的 JSON 结构。这导致自动化脚本很难跨版本复用。

  3. 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 的文档和社区支持实在拉胯。如果你要搞网络自动化:

  1. 优先用 RESTCONF,别碰 Cisco 私有 REST API
  2. 准备好踩坑文档的坑
  3. 生产环境一定要有回滚方案
  4. 复杂配置还是用 NETCONF 或者 Ansible

最后说一句:Cisco 的网络设备自动化,2026 年了,文档还是这个鬼样子,只能说传统网络厂商的软件工程能力,确实跟互联网公司差着几个数量级。

Elvin Hui

关于作者:Elvin Hui

Elvin 拥有 10+ 年企业级数据中心、云原生架构和网络安全经验。持有 CCNA、AWS 解决方案架构师认证。我致力于将一线的“踩坑”经验沉淀为真实、硬核的技术指南,拒绝空洞理论。