ネットワークの自動化とプログラマビリティ

# ネットワーク自動化（Automation）
従来はネットワーク機器のプロビジョニング（資源の割り当てや設定などを行い、利用可能な状態にすること）を手動で行っていた。ネットワークを自動化することで自動プロビジョニングが可能となり、設定を自動的に行い容易にネットワーク危機を利用可能な状態にできる。

+ 障害発生時の対応時間の短縮
+ 設定変更にかかる負担軽減
+ 精度の高い作業結果

# ルータやスイッチの内部構造
従来のネットワークでは各ネットワーク機器が以下の機能をもっていた。

### データプレーン
ネットワーク機器がデータの転送処理を行う部分。受診したデータの宛先をテーブルから検索し、送り先を決定しデータを転送する。データのカプセル化やACLによるフィルタリングなど、データ転送の際に必要な様々な処理も実行される。

+ ACLによる受信パケットの破棄
+ 受信パケットの宛先アドレスから出力インターフェースを検索
+ 802.1Qヘッダの追加と削除
+ 受信フレームの宛先MACアドレスから出力インターフェースを検索
+ パケットのカプセル化および非カプセル化
+ NATによる送信元または宛先IPアドレスの変更

### コントロールプレーン
データプレーンを制御する部分。データを転送するために必要なルーティングテーブルやMACアドレステーブルなどの経路情報を作成・制御する役割を担う。

![キャプチャ58.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/063e940c-2d03-5698-1945-d5f4c047144e.png)

コントロールプレーンの機能の実装方式には以下の2つの方式がある。

+ 自律分散
各ルータやスイッチで動作するルーティングプロトコルやコンフィグに従って動作する。そのため、設定変更はすべての機器で個別に行う必要がある。

+ 中央集中
SDNで主に使われる方式で、すべてのコントロールプレーン機能をコントローラで集中管理、制御する。各ルータやスイッチはコントローラからの指示に従ってパケットの転送を行う。


### マネジメントプレーン
ネットワーク機器の構成・設定を管理する部分。データプレーンやコントロールプレーンとは異なり、直接的にデータの転送処理に関わることはしない。TELNET,SSH,SNMP,Syslogなどの様々な管理用プロトコルにより、ユーザに対して機器の操作・管理の機能を提供している。


![キャプチャ59.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/7b72381f-45d6-6443-cb24-d8efdb807ce1.png)


# SDN(Software-Defined Networking)
ソフトウェアによりネットワークを管理・制御するための新しい考え方と、それに基づいたネットワークを構成するための技術のこと。ネットワーク上に配置された各機器はデータプレーンの機能である転送処理だけを行い、コントロールプレーンで行う各種テーブル作成などの処理はネットワーク上に配置したSDNコントローラで集約し一括で行う。
「ネットワークがプログラムで制御可能」という意味で「ネットワークプログラマビリティ」とも呼ばれる。

:::note info
ネットワーク機器の設定変更や適用ファームウェアの管理をコントローラ上で一括して管理することで、ヒューマンエラーや管理コストの低下が期待できる。また、トラフィックの状況などに合わせて動的にネットワークトポロジを変更したり、VTNを用いてネットワークを仮想化することもできる。
:::

![キャプチャ60.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/f11f40c4-7afe-9be5-105d-e2caf43a9dbd.png)



### SDNのアーキテクチャ

#### インフラストラクチャレイヤ
データ転送を実際に行うネットワーク上に配置されたルータやスイッチなどの機器が該当するレイヤ。データプレーンの機能を実現する。コントロールレイヤからの制御により動作し、データ転送の役割を担う。

#### コントロールレイヤ
SDNコントローラが該当するレイヤ。コントロールプレーンの機能を実現する。インフラストラクチャレイヤのネットワーク機器を制御し、同時にインフラストラクチャレイヤの各危機のネットワーク機能をアプリケーションレイヤに提供する。また、アプリケーションレイヤとインフラストラクチャレイヤの橋渡しを行う。

#### アプリケーションレイヤ
SDNコントローラを操作する各種アプリケーションが該当するレイヤ。アプリケーションにはSDNコントローラとセットになっていてベンダーから提供されるものもあれば、カスタマイズしたアプリケーションを自作することもできる。

## API(Application Programming Interface)
他のプログラムなどの機能を使用するための仕様。レイヤ間でやり取りする際に使用される。


### Southbound Interface（SBI）
ネットワーク機器とコントローラが通信するインターフェース。ネットワーク機器を直接制御するためにOpneFlow、NETCONF、RESTCONF、OpFlexが使われる。

### Northbound Interface（NBI）
アプリケーションレイヤとコントロールレイヤをつなぎ、プログラムとコントローラが通信するインターフェース。主にREST（Representational State Transfer）形式に従ったAPIをHTTPで呼び出し、プログラムで処理しやすいXMLやJSON（JavaScript Object Notation）といった形式でデータを送受信する

![キャプチャ61.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/cf086f0d-e792-6dd2-3c39-8b9af36055da.png)


### OpenFlow
SDNを実現するための技術の1つで、サウスバウンドAPIに該当する。コントロールプレーンとデータプレーンの処理を分離させることができる。SDNコントローラであるOpenFlowコントローラと、ネットワーク機器であるOpenFlowスイッチで構成されやり取りが行われる。

フローテーブルというデータ転送を行うための通信ルールを定義したテーブルを作成すると、そのフローテーブルがOpenFlowコントローラからネットワーク上のOpenFlowスイッチへ配布される。

![キャプチャ62.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/87437972-09b9-18d2-225d-eee8185c5a28.png)


#### ホップバイホップ方式
OpenFlowスイッチそれぞれが保持しているフローテーブルに従って通信を転送する方式の事。条件や動作を細かく制御できるため、柔軟なネットワーク構築をすることができる特徴がある。しかし、その反面フローテーブルの設定や維持・管理が難しく、構築・管理に手間がかかってしまうという欠点がある。


#### OpenDaylight
OpenDaylightプロジェクトにより開発されたオープンソースのSDNコントローラ。様々なサウスバウンドAPIに対応した汎用的なコントローラとなっており、各ベンダーはOpenDaylightを利用して独自のSDNコントローラを開発することが可能。

## Cisco ACI(Cisco Application Centric Infrastructure)
Ciscoによって提供されているデータセンター向けのSDNソリューション。ネットワーク機器を集中管理する。SDNコントローラにはCiscoによって提供されている**APIC(Application Policy Infrastructure Controller**)を、サウスバウンドAPIにはCisco独自に開発した**OpFlex**を使用する。OpFlexはシンプルなネットワークポリシーを定義するだけでSDNを構築することができる利点がある。

#### スパイン/リーフ型
従来の3階層モデルに代わり採用されているファブリック型ネットワークトポロジ。ネットワーク構成をその名の通り繊維のようなメッシュ構造にすることで高可用性・帯域の向上・拡張性の向上を実現することができる。
スパイン/リーフ型ネットワークではスパインスイッチとリーフスイッチによって形成する。

![キャプチャ63.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/439aaed6-b0c2-addf-854c-a0cac4777f0a.png)

![キャプチャ64.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/c3c81500-8f48-a895-1977-4a4aca13ca7b.png)

+ リーフ層のスイッチとスパイン層のスイッチは全て接続する
+ リーフ同士、スパイン同士の接続はしない
+ エンドポイント（サーバなど）はリーフ層に接続する
+ 同じホップ数で全ての宛先に到達可能（送信元のリーフスイッチから見て、スパインスイッチを1つ経由するだけで宛先となるリーフスイッチに到達できる）
+ 3階層の構成と比べて、障害の影響を抑えられる
+ 3階層の構成と比べて、機器やケーブルの数を少なくできる

### Intent Base Network(意図ベースネットワーク)
リーフスイッチに接続しているエンドポイントのサーバなどを、物理的な配置ごとではなく機能ごとなどの分類によってEPG(End Point Group)というグループに分ける。グループ単位でポリシーを決定することができるため、シンプルな定義のみでネットワーク全体の通信ルールを設定することができる。

![キャプチャ65.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/850fb888-1f18-0ecd-90f5-bc36e9a18d61.png)


### APIC-EM(APIC-Enterprise Module)
一般的な企業や組織向けに作られたSDNコントローラ。ライセンスが不要で無料でダウンロード可能で、既存のネットワーク機器でもSDNが実現可能という特徴がある。既存のネットワーク機器をTELNET、SSH、SNMPといったプロトコルを使用して制御することが出来る。

## Cisco SD-Access(Cisco Software-Defined Access)
Ciscoが提供する企業向けの新しいSDNソリューション。SDNコントローラにはCisco DNA Centerを使用し、Web GUIで提供されている各種アプリケーションや、自作プログラムによって制御することが出来る。

![キャプチャ66.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/4712befb-9420-dc37-2a26-8feccf6d450d.png)

Cisco SD-Accessのアーキテクチャでは以下の考え方を取り入れている。

+ アンダーレイネットワーク
+ オーバレイネットワーク

![kk41867.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/cf8fc357-00fa-3634-1635-81e8813be732.jpeg)




### アンダーレイ
オーバレイの機能を提供するための基盤となる物理ネットワーク。すべてがレイヤ3での接続となり、ルーティングプロトコルにOSPFやIS-ISといったリンクステート型のプロトコルを使用する。SD-Accessにおけるアンダーレイのように、全てのデバイスがレイヤ3で動作する構成のことを**Routed Access（Layer 3 Routed Access**）と呼ぶ。

アンダーレイを構成する機器は、大きく3つに分類される。

+ **ファブリックエッジノード**
エンドポイントデバイスに接続する機器。従来のアクセス層にスイッチに該当する。

+ **ファブリックボーダーノード**
Cisco SD-Accessの制御外の機器であるWANルータなどと接続する機器

+ **ファブリックコントロールノード**
LISPのマップサーバとして動作する機器

![キャプチャ68.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/50023bf6-74c4-2b31-26a7-16fc09f70aea.png)


### オーバレイ
アンダーレイの上に構築される論理的なネットワーク。以下の2つの機能から成り立っている。



#### VXLAN(Virtual eXtensible LAN)
レイヤ2フレームをカプセル化することで、物理的に異なるレイヤ3ネットワーク上に論理的なレイヤ2ネットワークを構築することが出来る技術のこと。元のEthernetフレームをカプセル化し、VXLANヘッダ内の格納されたVXLAN Network ID(VNI)によってネットワークを識別することが出来る。そのため、1600万ものネットワークを識別することが可能となる。

:::note info
VXLANを使用することで、同じVNIが割り当てられたデバイス同士は、物理的なレイヤ3ネットワークをまたいで同一のネットワークを構築することが可能になる。
:::

![キャプチャ69.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/786919a3-8d3d-995f-f2b1-35b54de13361.png)


#### LISP(Locator/Identifier Separation Protocol)
IPアドレスのID（端末の識別子）としての役割と、ロケータ（ネットワーク内での端末の位置）としての機能を分離してルーティングを行うトンネリングプロトコル。使用することでファブリック上の各エッジノードは、全エッジノードのアドレスおよびネクストホップを知ることなく通信を行うことが出来る。EID(Endpoint ID)とRLOC(Routing Locator)という値を用いて通信を行う。

| 値 | 説明 |
|:-:|:-:|
| EID  | エンドポイントの端末のIPアドレス  |
| RLOC  | LISPが有効になっているルータのIPアドレス  |

## Cisco DNA Center
Ciscoのインテントベースネットワーク（IBN）の中核となる装置（アプライアンス）で、**Cisco SD-AccessのSDNコントローラ**として動作する。ノースバウンドAPI、サウスバウンドAPI内の複数のプロトコルをサポートしている。SD-Accessで構成されたネットワークをGUIによって一元管理したり、自動化の機能を利用することが出来る。

+ GUIによる一元管理
+ ネットワーク機器のプラグアンドプレイ
+ ネットワーク全体の可視化
+ **トラブルシューティングが容易**
+ IPアドレスやMACアドレスなどネットワーク内のデバイスの情報を保持する**インベントリ機能**
+ **アシュアランス**（ネットワークのモニタリング）
+ 機械学習を用いた迅速な問題解決が可能

:::note info
Cisco DNA Centerのように、ネットワーク全体の設定や管理、調整を自動化することを**オーケストレーション**と呼ぶ。ネットワーク全体の機器やアプリケーションなどを統合的に管理し、目的に対しての「プロセス」を自動化することを指す。

また、機器ごとに違った管理画面に接続し、一つひとつを別々に管理するのではなく、単一の管理ツールから様々な機器へ接続し管理を行うことを**シングルペインオブグラス（SPoG:Single Pane of Glass**）と呼ばれることもある。
:::


### 機能拡張
ユーザのニーズに合わせて機能拡張する際は以下の2つが使用できる。

+ REST API
自作プログラムなどから、Cisco DNA Centerの機能にアクセスできる。利用したい機能を組み合わせることで、ユーザの期待する機能を実現できる

+ マルチベンダSDK（Software Development Kit）
Cisco DNA Centerが非Cisco機器を制御できるように機能を追加するためのソフトウェア開発キット

### スケーラブルグループ
管理者が一意のSGT(Scalable Group Tag)を割り当てることでアクセス制御がGUIで設定できる。ACLでのアクセス制御では複数の行で定義されるため、行数が長くなればなるほど全体を分析する必要があったが、ポリシーを指定するだけで完了する。ファブリックネットワーク全体にアクセス制御を適用することが出来る。


![キャプチャ70.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/b32156d2-1c79-1ed7-ad5b-f3eb695632e6.png)

## Cisco PI（Cisco Prime Infrastructure）
Ciscoが提供するネットワーク管理ツールで、管理対象となる全てのデバイスを一つの画面から設定、管理することが可能。ネットワークの可視化機能も持ち、デバイスの動作状況やネットワークトラフィックの状況、無線LANの電波状況など、様々な情報をダッシュボード上で視覚的に確認することができる。

:::note info
従来型のネットワークではCisco PIによる一元管理が幅広く使用されていたが、SDN対応が求められる現代のネットワークでは、Cisco DNA Centerが適している。
:::


# ネットワークの自動化
昨今のクラウドサービスの利用拡大やネットワークの複雑化により、今まで以上にネットワークインフラに求められることが大きくなってきた。その都度機器の設定を管理者が行っていては迅速対応することが出来ないため自動化が注目されている。


## REST API(RESTful API)
RESTというアプリケーションの設計思想に従って作成されたAPIを指す。

:::note info
**REST(REpresentational State Transfer)とは？？**
以下の項目で定義されている
+ クライアント/サーバ型の構成となっていること
+ ステートレスであること
+ キャッシュの可否を制御できること
+ 統一されたインターフェイスであること
+ 階層化されたシステム構成であること
+ コードオンデマンドであること
:::

### HTTP
多くのREST APIはRESTの原則の親和性が高いHTTPプロトコルを使用する。

#### URI（Uniform Resource Identifier）
リソースを識別する名前の統一された書式のこと。以下のように構成される

![kkkk41032.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/c342a3a8-fb35-d273-e264-368f77472950.jpeg)


#### HTTPメソッド
リソースに対して実行したい操作を示すいくつかのアクションのこと。クライアントが指定したHTTPメソッドに応じて、サーバは自身のリソースに対して送信・更新・削除などの動作を実行する。この主要な動作をCRUDと呼ぶ。

| CRUD | HTTPメソッド | 意味 |
|:-:|:-:|:-:|
| Create  | POST/PUT  | 作成  |
| Read  | GET  | 読み取り  |
| Update/Replace  | PUT  | 更新（置き換え）  |
| Delete  | DELETE  | 削除  |
| Update/Modify  | PATCH  | 更新（変更）  |


### JSON(JavaScript Object Notation)
人間と機械の双方にとって可読性のバランスの優れたデータ形式。人間にとってはデータ形式が簡易で読み書きがしやすく、機械にとってはJSONからプログラム言語への変換が容易に行える。

#### JSONデータの読み解き方
+ 「{}（波括弧）」で囲まれた範囲は「オブジェクト」という1つのデータのかたまり。
+ 「:（コロン）」はキー（値を識別する名前）と値（バリュー）のペア。コロンの左がキー、コロンの右が値。
+ キーと値のペアは「,（カンマ）」で区切られる。
+ キーは「"（ダブルクオーテーション）」で囲む。
+ 値が数値の場合はそのまま記述し、値が文字列の場合は「"（ダブルクオーテーション）」で囲む
+ キーと値は1対1のペアだけではなく、「[]（角括弧）」で囲まれた「配列」や、オブジェクトを値に持つことが出来る。

![k41025.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/8c535150-fce1-6101-58c2-e102eb1e2448.jpeg)


#### JSONデータの規約
+ キーと値のペアが複数ある場合、最後のペアはカンマで終わってはならない
+ キーを含め、文字列として扱うものは「""（ダブルクオーテーション）」で囲む
+ 波括弧（{})、角括弧（[]）、ダブルクオーテーション（""）はペアで使用する





### XML
マークアップ言語の1つで、データをタグで囲むことで表現する。タグ内の要素名は自由に決めることが出来るため、データが何を意味しているかを直感的に理解できるという特徴がある。

### YAML
スペースによるインデントを使って構造化されたデータを表現する。視覚的にも読みやすい特徴がある。設定を定義するファイスなどで用いられることが多く、Ansibleの設定ファイルなどでも利用される。

## 構成管理ツール
各機器の設定ファイルを共有フォルダで一元的に管理し、インストールしたサーバが共有フォルダ上の設定ファイルを参照して機器に対して設定を行う。そのため、管理者は共有フォルダ上の設定ファイルを編集するだけで、機器に変更を加えることが出来る。人的ミスの低減や作業時間の短縮などの効率化を図ることが出来る。

![キャプチャ71.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/e0bc1f96-49ac-301e-4dda-709d47bb5500.png)

構成管理ツールの動作には以下の2種類がある。

#### PUSH型
**構成管理ツールから機器へ設定を行う**方式のこと。機器側に「エージェント」と呼ばれる特別なプログラムを必要とせず動作する（エージェントレス）ので、サポート対象機器が限定されにくいメリットがある。

+ リアルタイムな設定変更に適している
+ サーバが通信を開始する
+ エージェントのインストールが不要


#### PULL型
**設定対象の機器が構成管理ツールから情報を取得して自信を設定する**方式のこと。機器側に構成管理ツールと通信する「エージェント」が必要なため、エージェントが動作しない機器はサポートされない。
エージェント機能を外部のサーバで実行し、外部のサーバから対象機器にPUSH型で設定を行う「外部エージェント方式」もある。

### Ansible
RedHat社が開発するオープンソースの構成管理ツール。構成管理サーバ側から各ネットワーク機器へ設定を送る**Push型**の通信形態で、SSHやTELNETなどのリモートプロトコルを使用している。また、**エージェントレス**モデルを採用しているため、各機器に特別な設定は必要ない。

![キャプチャ72.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/71999460-d683-94df-9895-7562cc6f3cd7.png)

以下のファイルによって制御されている。PlaybackはYAMLを使って記述されるが、モジュールはPythonコードで記述する。

| ファイル名 | 内容 |
|:-:|:-:|
| Playback  | 構成管理の対象デバイスやAnsibleが実行すべきタスク（コマンドなど）を記述する。１つ以上のタスクで構成されている。  |
| Inventory  | 構成管理の対象となるデバイスリストを記述する |
| Template  | 複数のデバイスに共通の設定内容について記述する |
| Variables  | 各デバイス固有の設定項目について記述する |

:::note info
処理の最小単位であるタスクには、呼び出すモジュールと、モジュールを実行するために必要な情報（コピー元、コピー先など）が**YAML形式**で記述される。
:::


### Puppet
Puppet Labs社が開発するオープンソースの構成管理ツール。クライアント側にもソフトウェアのインストールが必要なエージェントモデルを採用しているが、プロキシサーバを用いた外部エージェントモデルに対応しているため、Puppetに対応していないIOSバージョンの機器にも導入が可能。ネットワーク機器が構成管理サーバから設定を取得するPull型の通信形態を採用している。設定を取得する際に、HTTPやHTTPSを使用して**TCP8140番ポート**に接続する。


![キャプチャ72.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/deb31695-fee7-e2e1-eb56-146787b685f0.png)

以下のファイルによって制御されている。これらの定義ファイルはPuppet独自の言語で記述する。

+ Manifest
デバイスの設定終了時のあるべき状態を記述したファイル

+ Resource
構成管理の最小単位・構成管理対象：ファイルやユーザ、サービスとそれらのパラメータを記述したコード

+ Class
複数のリソースをまとめた単位・コード


### Chef
Chef社が開発するオープンソースの構成管理。管理対象のデバイスがChefに対応している必要があるため、Cisco機器の構成管理にはあまり採用されない。Chefと同様のPull型の通信形態を採用している。設定を取得する際に、HTTPやHTTPSを使用して**TCP10002番ポート**に接続する。
以下のファイルによって制御され、**プログラム言語のRubyで記述する**。

+ Resource
構成管理の最小単位：構成管理対象と実行すべき作業が記述されたコード

+ Recipe
リソースをまとめたファイル：条件分岐や繰り返しなどのステートメントでリソースを操作

+ CookBooks
レシピを含め、その他レシピの実行に必要なファイルやデータがまとまったディレクトリ

+ Runlist
特定のデバイスに対して使用するレシピのリスト