Cisco CSR1000VにRESTCONFでアクセスする

## 目次

* [はじめに](#はじめに)
* [構成](#構成)
* [CSR1000Vの設定](#CSR1000Vの設定)
* [curlでCSR1000Vの情報を取得を行う](#curlでCSR1000Vの情報を取得を行う)
* [PostmanでCSR1000Vにアクセスする](#PostmanでCSR1000Vにアクセスする)
* [参考URL](#参考URL)

## はじめに

前回、[MacでCML2(Cisco Modeling Labs)を動かすまで](https://qiita.com/k8z/items/14edf4d3ed18d2e0e15a)でCMLの実行環境を構築しました。
今回はこのCML上でCSR1000Vを起動させて外部ネットワークと接続し、RESTCONFでアクセスするために必要な設定とアクセス方法をご紹介します。

## 構成

CML2環境を外部ネットワークと接続する方法は、

* NAT方式：CML内ノードのIPアドレスをCMLホストのIPアドレスにNATして外部ネットワークと通信
* BRIDGE方式：CML内ノードをL2接続でローカルネットワークに接続し外部ネットワークと通信

が代表的なようですが、今回はBRIDGE方式を採用しました。
参考：[CMLを始めよう！（11.外部ネットワーク接続）](https://infrastructure-engineer.com/start-cml-11/)

今回は最低限の設定しか行わないので、以下のような構成にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449711/8d887773-040e-d687-26f3-1b6ded29350c.png)

今回の検証環境のセグメントは192.168.3.0/24を利用しており、アサインするIPアドレスは、
* CSR1000V GigabitEthernet1 ： 192.168.3.40
* デフォルトゲートウェイ ： 192.168.3.1
とします。

## CSR1000Vの設定

CSR1000Vが起動したら以下の設定を投入します。

```
hostname testRT
username admin privilege 15 secret cisco
!
aaa new-model
!
aaa authentication login default local
aaa authorization exec default local
!
restconf
!
interface GigabitEthernet1
 ip address 192.168.3.40 255.255.255.0
 no shutdown
!
ip route 0.0.0.0 0.0.0.0 192.168.3.1
!
ip http secure-server
```

最後の```ip http secure-server```でのWebUI有効化が、今回restconfでアクセスする際に必要になります。
※脆弱性が発見された場合のセキュリティホールにもなり得るので、むやみに有効化しないようにしましょう。

### 設定変更後 show コマンド確認

#### show ip interface brief

```
testRT#show ip interface brief
Interface              IP-Address      OK? Method Status                Protocol
GigabitEthernet1       192.168.3.40    YES manual up                    up      
GigabitEthernet2       unassigned      YES unset  administratively down down    
GigabitEthernet3       unassigned      YES unset  administratively down down    
GigabitEthernet4       unassigned      YES unset  administratively down down  
```

#### show ip route

```
Gateway of last resort is 192.168.3.1 to network 0.0.0.0

S*    0.0.0.0/0 [1/0] via 192.168.3.1
      192.168.3.0/24 is variably subnetted, 3 subnets, 2 masks
C        192.168.3.0/24 is directly connected, GigabitEthernet1
S        192.168.3.1/32 [254/0] via 192.168.3.1, GigabitEthernet1
L        192.168.3.40/32 is directly connected, GigabitEthernet1
```

#### show ip http server status 

```
HTTP server status: Disabled
HTTP server port: 80
HTTP server active supplementary listener ports: 21111  
HTTP server authentication method: enable
HTTP server auth-retry 0 time-window 0
HTTP server digest algorithm: md5
HTTP server access class: 0
HTTP server IPv4 access class: None
HTTP server IPv6 access class: None
HTTP server base path: 
HTTP File Upload status: Disabled
HTTP server upload path: 
HTTP server help root: 
Maximum number of concurrent server connections allowed: 300
Maximum number of secondary server connections allowed: 50
Server idle time-out: 180 seconds
Server life time-out: 180 seconds
Server session idle time-out: 600 seconds
Maximum number of requests allowed on a connection: 25
Server linger time : 60 seconds
HTTP server active session modules: ALL
HTTP secure server capability: Present
HTTP secure server status: Enabled
HTTP secure server port: 443
HTTP secure server ciphersuite:  rsa-aes-cbc-sha2 rsa-aes-gcm-sha2
        dhe-aes-cbc-sha2 dhe-aes-gcm-sha2 ecdhe-rsa-aes-cbc-sha2
        ecdhe-rsa-aes-gcm-sha2 ecdhe-ecdsa-aes-gcm-sha2
HTTP secure server TLS version:  TLSv1.2 TLSv1.1
HTTP secure server client authentication: Disabled
HTTP secure server PIV authentication: Disabled
HTTP secure server PIV authorization only: Disabled
HTTP secure server trustpoint: TP-self-signed-2276197724
HTTP secure server peer validation trustpoint: 
HTTP secure server ECDHE curve: secp256r1
HTTP secure server active session modules: ALL
```

## curlでCSR1000Vの情報を取得を行う

CSR1000Vの設定変更が完了したらrestconf経由でCSR1000Vにアクセスしてみます。

まずhttps://192.168.3.40/.well-known/host-metaにアクセスし、ホストに関するメタデータを取得してみます。
RESTCONF に対応している機器は、このURIにGETリクエストを送信することで、その機器のRESTCONFアクセス先が確認できます。
参考：[RESTCONF の URI 確認と設定の作り方](https://www.infrastudy.com/?p=1262)

```
curl -k -u admin:cisco -H 'Accept: application/yang-data+json' 'https://192.168.3.40/.well-known/host-meta'
```

設定変更後すぐにこちらを実行したところ、エラーページの応答はあったのですが期待していた出力ではありませんでした。

```
$ curl -k -u admin:cisco -H 'Accept: application/yang-data+json' 'https://192.168.3.40/.well-known/host-meta'

<!-- 
 *------------------------------------------------------------------
 * Copyright (c) 2020 by Cisco Systems, Inc.
 * All rights reserved.
 *------------------------------------------------------------------
 *-->

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you should check
the <a href="http://nginx.org/r/error_log">error log</a> for details.</p>
<p><em>Faithfully yours, OpenResty.</em></p>
</body>
</html>

```

しかし時間をあけて約40分後に改めて実行してみたところ、無事にアクセスすることができました。（結構時間かかりました）

```
$ curl -k -u admin:cisco -H 'Accept: application/yang-data+json' 'https://192.168.3.40/.well-known/host-meta'
<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>
    <Link rel='restconf' href='/restconf'/>
</XRD>
```
続いてインターフェイス情報を取得してみます。

```
$ curl -k -s -u admin:cisco -H 'Accept: application/yang-data+json' 'https://192.168.3.40/restconf/data/ietf-interfaces:interfaces'
{
  "ietf-interfaces:interfaces": {
    "interface": [
      {
        "name": "GigabitEthernet1",
        "type": "iana-if-type:ethernetCsmacd",
        "enabled": true,
        "ietf-ip:ipv4": {
          "address": [
            {
              "ip": "192.168.3.40",
              "netmask": "255.255.255.0"
            }
          ]
        },
        "ietf-ip:ipv6": {
        }
      },
      {
        "name": "GigabitEthernet2",
        "type": "iana-if-type:ethernetCsmacd",
        "enabled": false,
        "ietf-ip:ipv4": {
        },
        "ietf-ip:ipv6": {
        }
      },
      {
        "name": "GigabitEthernet3",
        "type": "iana-if-type:ethernetCsmacd",
        "enabled": false,
        "ietf-ip:ipv4": {
        },
        "ietf-ip:ipv6": {
        }
      },
      {
        "name": "GigabitEthernet4",
        "type": "iana-if-type:ethernetCsmacd",
        "enabled": false,
        "ietf-ip:ipv4": {
        },
        "ietf-ip:ipv6": {
        }
      }
    ]
  }
}

```

無事にデータを取得できているようです。
今回はGETメソッドのみの確認でしたが、POST/PUT/PATCHメソッドによる設定変更も可能なようです。

## PostmanでCSR1000Vにアクセスする

PostmanはWebAPI開発用のツールです。
Postmanを使うと簡単にAPIリクエストを送信し、レスポンスが取得できます。

Postmanはこちらからダウンロードすることができます。
[Postman API Platform](https://www.postman.com/)

先ほどのインターフェイスの情報取得を今度はPostmanを使って実行してみます。

### Postman設定

#### Params

設定なし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449711/fc63d23d-c137-83d6-d332-98e5d8a65b2a.png)

#### Authorization

Basic Auth を選択し、 アクセス先機器で作成した Username/Password を入力。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449711/b47afb71-d2bc-805a-2b11-982e4b0142f1.png)

#### Headers

Authorization はBasic Authの設定が完了していれば自動入力されます。
Accept: application/yang-data+json の設定を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449711/fd65f5b5-413b-76c2-550a-3e5bba29b975.png)

#### Settings

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449711/6c3e7727-0052-4694-b714-978355c8f4c5.png)

#### 実行結果

Send を実行して上手くいくと以下のように結果が出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449711/cc31eb88-a0c3-3473-78c2-3f4a031ce7e8.png)

#### curlリクエストからPostmanリクエストに変換

ちなみにcurlリクエストからPostmanリクエストに変換することも可能です。
curlでは正常に動作したのに、Postmanからだと上手くいかない場合（Postman側の設定に自信がない場合）は試してみると良いかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449711/4a234003-1dde-6abf-e59a-ee60c7cfb393.png)


## 参考URL

* [CMLを始めよう！（11.外部ネットワーク接続）](https://infrastructure-engineer.com/start-cml-11/)
* [RESTCONF の URI 確認と設定の作り方](https://www.infrastudy.com/?p=1262)
* [【YouTube】Enable and Verify RESTCONF with the CLI and Postman.](https://www.youtube.com/watch?v=qeanMXpcHIk)