QoS概要とSNMP概要と設定

CCNAの試験に向けて学習中。
復習に見返せるようにメモしていきます。
ほぼ自分の勉強メモです。
過度な期待はしないでください。

1. QoS概要
-
#### 1-1. QoSとは？
QoS（Quality of Service）とは、ネットワーク上で提供するサービス品質を保つ為の技術です。 
ネットワーク機器に QoSを実装する事で、<font color="green"><b>ある特定の通信を優先して伝送させたり、
帯域幅を確保する</b></font>事が出来ます。

何も対策をしていないネットワークでは、先に到達した通信を先に出すという動作をする為、
例えば、IP電話による通話やビデオ会議などのデータは、パケットの遅延や到着のばらつきが、
生じやすくなります。その為、通話などに支障を来す恐れがあります。
こうした際に、QoSを設定を行う事で、<font color="DodgerBlue"><b>遅延やばらつき、損失に敏感な音声データを優先的に転送
する事</b></font>が出来ます。

<br>
#### 1-2. QoSのアーキテクチャ
QoSを実現する為のアーキテクチャとして、
● ベストエフォート
● IntServ(Integrated Services）
● DiffServ(Differentiated Services)
の3つがあります。

##### ■ ベストエフォート
ベストエフォートは、パケットのやサイズに関係なく、<font color="Red"><b>先着順にパケットを送出</b></font>していくという
処理を行います。よって、何も設定がなければQoSのデフォルトの動作として、全トラフィックで
処理される。

##### ■ IntServ(Integrated Services）
IntServは、RSVP（<font color="Red">リソース予約プロトコル</font>）というプロトコルを使用して、
アプリケーションの通信フロー事に帯域を予約する方式。アプリの通信フローは膨大であることから、
それを各ネットワーク機器で保持する必要があり機器の負荷が高くなるので大規模ネットワークでは
適していない。一般的に使用されていない。

##### ■ DiffServ(Differentiated Services)
DiffServは、各ルータやスイッチ事に、パケットの優先順位に基づいて区別して転送処理を
行うアーキテクチャです。
広く採用されているQoS方式であり、一般的にQoSといえばDiffServモデルの事を指します。

<br>
#### 1-3. QoS（DiffServモデル）の仕組み
DiffServモデルでは、
「 ①分類　②マーキング　③キューイング　④スケジューリング 」 
の順番で処理されます。

##### ①分類
DiffServモデルは、パケットの優先順位に基づいて区別して転送処理を行う為、
先ずは、パケットの分類が必要になります。
分類では、届いたパケットの種類などを調べてクラスと呼ばれるカテゴリに分けます。
IPアドレス、TCP/UDPポート番号、CoS / DSCP / IP Precendence値などの情報を基に
優先度の高いクラスなのか、低いクラスなのかを分類します。


##### ②マーキング
マーキングでは、<font color="Green"><b>分類によりクラス分けされたパケットに優先度を付けます。</b></font>
ここで分類とマーキングでは CoSと DSCPが使用されています。

▶︎ CoS
CoS（Class of Service）とは、<font color="DodgerBlue"><b>イーサネットフレームの優先度を表す</b></font>ものです。
通常のイーサネットフレームには、送信元MACアドレスや宛先MACアドレス、タイプフィールド
しかない為、優先度を表す事が出来ません。
しかし802.1Qで付与される4バイトのタグの中には、VLAN IDを示すフィールド以外に
<font color="Red"><b>PRI（PCP）</b></font>というCoS値を表す事が出来るフィールドがあります。
<font color="Green"><b>3ビットのフィールドで 0 ～ 7 の8段階</b></font>の優先度を定義することができます。
値が大きい程優先度が高くなっていきます。
音声は 5、ビデオ会議は 4、普通のデータは 0 ~ 2と分類する事を推奨されています。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/c3f643ae1493fee21f7f140fe6ca222a.png">


▶︎ DSCP
DSCP（Differentiated Services Code Point）とは、<font color="DodgerBlue"><b>IPパケットの優先度を表す</b></font>ものです。
これらの値はIPv4ヘッダの中のToS（Type of Service）フィールドで定義されます。
ToSフィールドでは8ビットあるのですが、そのうちの<font color="Green"><b>先頭6ビットを使用して 0～63の64段階</b></font>で
優先度を表します。
<img width="600" alt="ファイル名" src="https://i.gyazo.com/47318d14c8c3075053576f487a92cb52.png">

また、DSCP以外に同様にIPパケットの優先度を表すものとして <font color="Red"><b>IP Precedence（IPプレジデンス）</b></font>と
いうものがあります。ToSフィールドでは、8ビットあるうちの<font color="Green"><b>先頭3ビットだけを使用して、
0～7の8段階</b></font>で優先度を表します。
<img width="600" alt="ファイル名" src="https://i.gyazo.com/8e7a2f7018d6de3676107a9ba457a873.png">


DSCPの値に応じて各ルータやスイッチは転送処理を行います。こうしたホップ事の
動作を決めた <font color="Red"><b>PHB（Per Hop Behavior）</b></font>に応じてトラフィックは処理されます。
PHBごとのDSCP値は以下を参照。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/dfdc7501d47285d1db5d9aa6d3fe81b9.png">

|PHBの各項目　　　　　　　　　　|説明　　　|
|:---|:---|
|Default（デフォルト PHB）| 6ビット全て0で、ベストエフォートの転送処理を行う|
|CS（クラスセレクタ PHB）|6ビットの内、下位3ビットが 0のもの / IP Precedenceとの下位互換性用|
|AF（Assured Forwarding）|6ビットの内、上位３ビットが 1 ~4のもの|
|EF（Expedited Forwarding）|最優先のパケットで、ビットとしては 101110となり、音声トラフィックに通常割り当てる|

##### ③キューイング
キューイングでは、送信するパケットを<font color="Red"><b>キュー</b></font>と呼ばれる領域に並べていきます。
キューとは、パケットの格納場所の事であり、通常1つのインターフェースに複数のキューがあります。

キューには、ソフトウェアキューとハードウェアキューがあり、
キューイングでは<font color="green"><b>ソフトウェアキューにパケットを格納</b></font>していきます。ソフトウェアキューには
優先度によって複数のキューがあり、マーキングによって設定された優先度によって、
どのソフトウェアキューに格納されるかが変わります。


##### ④スケジューリング
スケジューリングでは、<font color="green"><b>ソフトウェアキューに格納したパケットをどういう割合や順番で
ハードウェアキューに格納するか</b></font>を決定します。
つまり、複数あるキューのうち、どのキューにあるパケットから送出していくのかを決めていく事です。


##### ■ キューイング及びスケジューリング方式
▶︎ FIFO（First In First Out））
着信してきた順番でパケットを送出していく方式。デフォルトのキューイング方式はこれになります。

▶︎ PQ（Priority Queuing）
優先度が高いキューを4つ用意してキューイングする方式です。
優先度が高い方から、High、Medium、Normal、Lowです。
これらのキューに振り分けれ、優先度の高いキューからハードウェアに送られ、インターフェイスから
送信されます。優先度の高いキューなくなるまで、優先度の低いキューは送信されません。

▶︎ WFQ（Weighted Fair Queuing）
アプリケーションの通信フローごとにキューを自動的に作成し、どのキューからのパケットでも
転送されるようにしたキューイング方式です。
ただ全てのキューが平等ではなく、キューの優先度に応じてパケットを送出ていく方式。

▶︎ CB-WFQ（Class Based WFQ）
ユーザーが定義したクラスごとにキューを割り当てる方式です。
ユーザーが定義したクラスごとに帯域幅を割り当て、最低帯域幅の指定によって送信される
パケットの比率を変えられます。

◇ LLQ（Low Latency Queuing）
CB-WFQにPQ（Priority Queuing）を追加した方式です。
PQのパケットは優先的に送信されますが、そのキューだけが優先的に送信されるだけでなく
帯域幅の制限をかける事で他のキューにも順番が回るようにしています。

<br>
##### ■ 信頼境界
DSCPとCoSの値を信頼する部分と信頼しない部分の境界を<font color="Red"><b>信頼境界</b></font>といいます。
デフォルトのスイッチの設定では、全てのポートが信頼されず、受信したパケットの優先度は
0に設定されています。一般的に信頼境界は、<font color="Green"><b>送信元に近い所</b></font>に設定します。

それぞれの機器で分類からマーキングを行うと、負荷が掛かる事から、DSCPとCoSの値だけを
信頼する事でその負荷を減らすようにしています。

##### ■ ポリシングやシェーピング
▶︎ ポリシング
定義した通信速度を超過した場合、それ以上のパケットを破棄したり、優先度を変えたりします。
特定の通信が回線を占有してしまう事を防ぎますが、超過した分は破棄されてしまう為、
TCPの通信は再送や通信量の抑制などが行われてしまいます。
ポリシングは、<font color="Green">パケットが着信した際や発信した際に適用出来ます。</font>

▶︎ シェーピング
定義した通信速度を超過した場合、それ以上のパケットはバッファに格納しておいて
通信速度の超過が落ち着いてきてからトラフィックを送信していく方式です。
シェーピングは、<font color="Green">パケットが発信した際に適用出来ます。</font>


##### ■ 輻輳（ふくそう）の管理
輻輳とは、同時に大量の通信が届くなどの状況でネットワーク機器の処理が追いつかなくなり、
送受信が出来なくなる状況です。

大量に通信が届いた場合、送信されるパケットよりも、受信されるパケットが多くなってしまい、
キューにパケット溜まってしまった場合、優先順位に関係なくパケットが破棄されてしまいます。
これを、<font color="Red"><b>テールドロップ</b></font>といいます。

テールドロップにより発生するこうした現象を回避する為に、輻輳を管理する必要があります。
管理する仕組みとして、<b>RED</b>※1や<b>WRED</b>※2があります。

>
※1 RED（<font color="Red">ランダム早期検出</font>）
キューが一杯になる前に、少しずつパケットを破棄していく方式です。
只、ランダムに破棄していくので、優先度の高いパケットも破棄される可能性があります。
※2 WRED（<font color="Red">重み付けランダム早期検出</font>）
キューが一杯になる前に、少しずつパケットを破棄していく事はREDと同様ですが、
パケットの優先順位考慮して破棄します。


2. SNMP概要
-
#### 2-1. SNMPとは？
SNMP（Simple Network Management Protocol）とは、TCP/IPネットワーク機器の状況を監視し、
様々な情報を収集する為のプロトコルです。つまり、ネットワーク機器の情報をサーバで一元収集し、
そのサーバにアクセスする事で一括で確認出来るようにするものです。

具体的に言うと、後述するSNMPマネージャとSNMPエージェントとの間で情報を伝達する為の
プロトコルがSNMPとなります。

SNMPを利用する事により、導入したネットワーク機器を監視する事が出来るので、
ネットワークに障害が発生した場合にどの機器に障害が発生したのかをすぐに突き止められるなど、
迅速な障害復旧に役立ちます。

>
SNMPは、<font color="Red">UDP</font>を使用して通信を行います。

#### 2-2. SNMPの構成要素
SNMPの構成要素は、管理する側のネットワーク管理ステーションと管理対象となる
ネットワーク要素から成り立ちます。
ネットワーク管理ステーションでは <font color="Red"><b>SNMPマネージャ</b>※3</font>、
ネットワーク要素では <font color="Red"><b>SNMPエージェント</b>※4</font>というプログラムが動作します。

>
※3 SNMPマネージャとは、SNMPエージェントを監視しネットワーク機器の情報を収集する
サーバの役割を担います。また、<font color="Red">UDP（ポート161）</font>を使用して通信を行います。
※4 SNMPエージェントとは、ネットワーク機器の情報をSNMPマネージャに送信します。
また、<font color="Red">UDP（ポート162）</font>を使用して通信を行います。

#### 2-3. MIB（ミブ）
MIB（Management Information Base）とは、SNMPエージェントが持っている
機器情報の集合体の事です。
SNMPマネージャとSNMPエージェントは、このMIBをやりとりすることで、
SNMPエージェントのCPU使用率、インターフェースの使用状況等を確認しています。
MIBにより分類された情報は下記のような<font color="Red"><b>ツリー構造</b></font>で管理されます。
<img width="600" alt="ファイル名" src="https://i.gyazo.com/52e5398aa3644f16ca955dca4fd05cce.png">
MIBに格納されている情報をオブジェクトといい、それぞれ<font color="Red"><b>OID</b></font>（オブジェクトID）という
オブジェクトを識別する為の識別子が付けられます。
例えば、ciscoの情報は <font color="Green">「iso(1)、org(3)、dod(6)、internet(1)、private(4)、enterprises(1)、
cisco(9)」</font>を順番に並べたものOIDになります。

このMIBには、<font color="Red"><b>標準MIB</b>※5</font>と<font color="Red"><b>拡張MIB</b>※6</font>があります。

>
※5 標準MIBは、RFCで規定されているMIBです。機器の種類の問わず対応している一般的な
システムの情報が規定されています。例えば、ホスト名やインターフェイス情報など
※6 拡張MIBは、ベンダーが独自に規定した固有のMIBです。
例えば、Ciscoが自社の機器を管理する為に規定したMIBは、この拡張MIBにあたります。

#### 2-4. SNMPで使用するメッセージ
SNMPマネージャとSNMPエージェントがやりとりするメッセージは大きく5つがあります。
<img width="800" alt="ファイル名" src="https://i.gyazo.com/cc0a8687d543df2878cac8bbcf723301.png">
>
その他にも、SNMPv２からSNMPマネージャから送信する、SNMPエージェントに対して
複数のOIDをまとめて要求する「Get Bulk Request」という要求がある。


#### 2-5. SNMPの通信
▶︎ SNMPポーリング
SNMPマネージャから要求を出して、SNMPエージェントの情報を受け取る方式をいいます。
>
SNMPマネージャから「Get Request」「GetNext Request」「Set Request」などの要求が
送信され、それに対してSNMPエージェントが「Get Response」で応答を返します。

▶︎ SNMPトラップ
SNMPエージェントからSNMPマネージャに通知を行う事をいいます。
SNMPトラップでは、何か問題が発生した時や指定した基準値を超えた時にSNMPマネージャに
通知する事が可能です。
>
「TRAP」が、SNMPトラップに該当する

▶︎ SNMPインフォーム
SNMPインフォームは、SNMPトラップ同様に、SNMPエージェントからSNMPマネージャに
通知を行うものです。SNMPトラップと異なる事は、SNMPマネージャからの応答が必要な事です。
SNMPインフォームは、SNMPマネージャの要求に対して確認応答を返す為、
SNMPマネージャへ確実に情報を送信する事が可能です。
>
SNMPインフォームを受け取ったSNMPマネージャはさらに確認応答を返します。
返ってこなかった場合、SNMPエージェントは再度SNMPインフォームを送信します。

#### 2-6.SNMPのバージョン
SNMPには<font color="Red">「SNMPv1、SNMPv2c、SNMPv3」</font>という3つバージョンがあります。

##### ■ 2-6-1.SNMPv1
<font color="Green"><b>SNMPコミュニティ名を使用して</b></font>認証を行います。
しかし、コミュニティ名や内容が暗号化されず、ネットワーク上に流れる為、
盗聴の危険性があります。また、SNMPトラップにしか対応しておらず、
<font color="Red">SNMPインフォームは対応していない。</font>

>
SNMPコミュニティーは、SNMPマネージャが情報を読み書き出来るSNMPエージェントの集合を
表します。
コミニュティ名は、SNMPエージェント側とSNMPマネージャ側で合わせておく必要があります。
同一のSNMPコミュニティーに所属するSNMPエージェントの情報は、SNMPマネージャから読み書き
出来る為、SNMPv1およびSNMPv2cでは、認証情報として使用されます。

##### ■ 2-6-2.SNMPv2c
<font color="Green"><b>SNMPコミュニティ名を使用して</b></font>認証を行います。また、SNMPv1と同様に暗号化されていない為、
不正アクセスが発生する場合があります。しかし、SNMPv2cではSNMPv1では対応していなかった
<font color="Red">「Get Bulk Request」「SNMPインフォーム」が対応しています。</font>

##### ■ 2-6-3.SNMPv3
コミュニティ名を使用して認証する変わりに、<font color="Green"><b>ユーザ名によるの暗号化されたパスワード認証</b></font>が
導入されました。そして、今まではデータがそのまま回線を流れていましたが、SNMPv3では、
<font color="Red"><b>データを暗号化</b></font>出来るようになりました。
「Get Bulk Request」「SNMPインフォーム」にも対応しています。

また、v3には3つのセキュリティレベルがあります。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/a99198c8f6f9604503d7793045aa0ece.png">


<br>
#### 2-7. SNMPの設定
##### ■ 2-7-1. SNMPビューの設定
SNMPエージェント側でSNMPビューを設定する事で特定のMIBだけの情報を、
SNMPマネージャに取得させたり、させないといった事が出来るようになります。
つまり、<font color="Green">SNMPビューを使用する事で、特定のMIB情報だけを取得させる事</font>が出来ます。

SNMPビューを設定するには、<b>グローバルコンフィギュレーションモード</b>で
次の<font color="Red"><b>snmp-server view コマンド</b></font>を実行します。

```
(config）# snmp-server view < ビュー名 > < OID > < include | exclude >
```
>
＜ビュー名＞には、作成したいビュー名の名前を指定します。
＜OID＞には、取得を許可もしくは拒否するオブジェクトのOIDを指定します。
＜include | exclude＞には、取得させたい場合は include、拒否する場合は excludeを指定します。


##### ■ 2-7-2.コミュニティ名の設定
「SNMPv1、SNMPv2c」では、コミニュティ名を使用して認証を行います。

コミュニティ名を設定するには、<b>グローバルコンフィギュレーションモード</b>で
次の<font color="Red"><b>snmp-server community コマンド</b></font>を実行します。

```
(config）# snmp-server community < コミニュティ名 > [ view <ビュー名>  ]  [ ro | rw ] [ <ACL> ]
```
>
＜コミニュティ名＞には、SNMPエージェント側とSNMPマネージャ側で合わせておく必要があります。
[ view <ビュー名> ]には、SNMPビューを使用して取得できる情報を制限する場合に使用します。
[ ro ]には、SNMPマネージャの読み取りを許可します。
[ rw ]には、SNMPマネージャの読み書きを許可します。
＜ACL＞には、ACLで許可されたSNMPマネージャだけがアクセスできるようにACL番号を指定します。

##### ■ 2-7-3.通知機能の設定

▶︎ 通知の送信先を設定
SNMPトラップやSNMPインフォームといったSNMPの通知機能を設定するには、
まずSNMPエージェント側で、通知の送信先であるSNMPマネージャを指定します。

通知の送信先のSNMPマネージャを指定するには、<b>グローバルコンフィギュレーションモード</b>で
次の<font color="Red"><b>snmp-server host コマンド</b></font>を実行します。

```
(config）# snmp-server host < IPアドレス > [ traps | informs ]  
　　　　　 [ version < 1 | 2c | 3 <auth | noauth | priv> > ]  < コミニュティ名 | ユーザー名 >
```
>
＜IPアドレス＞には、通知の送信先のIPアドレスを指定します。
[ traps | informs ]は、通知する方式を選択、SNMPv1の場合は trapsのみ指定可能になります。
[ version ]には、1、2c、3 のいずれかを指定。v3 の場合は auth、noauth、priv を選択します。
＜コミニュティ名 | ユーザー名＞では、v1とv2では認証のコミニュティ名を指定して、
v3では認証のユーザー名を指定します。

▶︎ トラップの有効化
SNMPトラップやSNMPインフォームを有効化するには、<b>グローバルコンフィギュレーションモード</b>で
次の<font color="Red"><b>snmp-server enable traps コマンド</b></font>を実行します。

```
(config）# snmp-server enable traps [< 通知タイプ >]
```
>
＜通知タイプ＞は、特定のタイプだけ通知したい場合はキーワードを指定します。
省略すると、全てのタイプのトラップが有効となります。

##### ■ 2-7-4.SNMPv3の設定
SNMPv3では、ユーザー名やパスワードにより認証します。
SNMPユーザーはSNMPグループに参加して、グループ単位でSNMPビューの指定や
セキュリティレベルの設定を行います。設定は、グループ、ユーザーの順に行います。

▶︎ SNMPグループの作成
SNMPグループの作成するには、<b>グローバルコンフィギュレーションモード</b>で
次の<font color="Red"><b>snmp-server group コマンド</b></font>を実行します。

```
(config）# snmp-server group < グループ名 > v3 < noauth | auth | priv > [ read <ビュー名> ]
　　　　　 [ write <ビュー名> ] [ access <ACL> ]
```
>
＜グループ名＞には、作成したいグループ名を指定します。
< noauth | auth | priv >は、いずれかのセキュリティレベルを指定します。詳しい内容は下記の表参照。
noauthは noAuthNoPriv、authは authNoPriv、privは authPriv
[ read <ビュー名> ]は、読み込みを許可するビューを指定します。
[ write <ビュー名> ]は、書き込みを許可するビューを指定します。
＜ACL＞には、ACLで許可されたSNMPマネージャだけがアクセスできるようにACL番号を指定します。

▶︎ SNMPユーザーの作成
SNMPユーザーは、SNMPグループと関連づける必要があります。ユーザーはグループの
セキュリティレベルを引き継ぎます。

SNMPユーザーを作成するには、<b>グローバルコンフィギュレーションモード</b>で
次の<font color="Red"><b>snmp-server user コマンド</b></font>を実行します。

```
(config）# snmp-server user <ユーザー名> <グループ名> v3 [auth <md5 | sha> <authのパスワード>]
          [ priv < des | 3des | aes< 128 | 192 | 256> > <privのパスワード>]
```
>
＜ユーザー名＞は、作成するユーザー名を指定します。
＜グループ名＞は、ユーザーが所属するグループを指定します。
＜md5 | sha＞による認証を行う場合、authで認証方法とパスワードを指定します。
＜priv [ des | 3des | aes ]＞で privで暗号化を行うには、暗号化方式とパスワードを指定します。
暗号化レベルには「DES」「3DES」「AES128」「AES192」「AES256」で指定可能。


#### 2-8. SNMPの確認
##### ■ 2-8-1.SNMPビューの確認
SNMPビューを確認するには、<b>特権EXECモード</b>で次の<font color="Red"><b>show snmp view コマンド</b></font>を実行します。

```
# show snmp view
```
show snmp view 実行画面です
<img width="400" alt="ファイル名" src="https://i.gyazo.com/86a7d8b29b366267dce658286806980e.png">

|　　項番　　|説明　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　|
|:---:|:---|
|（1）|SNMPビュー名を表示します。|
|（2）|OIDツリーをSNMPビューに含めるか除外するかを表示します。|
|（3）|OIDツリーの頂点のオブジェクト識別子を表示します。|


<br>
##### ■ 2-8-2.SNMPグループの確認
SNMPグループを確認するには、<b>特権EXECモード</b>で次の<font color="Red"><b>show snmp group コマンド</b></font>を実行します。

```
# show snmp group
```
show snmp view 実行画面です
<img width="650" alt="ファイル名" src="https://i.gyazo.com/a9fdf30f75080a14c8aa87b5a97f90a2.png">

|　　項番　　|説明　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　|
|:---:|:---|
|（1）|SNMPビュー名を表示します|
|（2）|セキュリティーモデルを表示します ※1|
|（3）|グループのユーザーに読み取りを許可するSNMPビュー（read-view）を表示します|
|（4）|グループのユーザーに書き込みを許可するSNMPビュー（write-view）を表示します|
|（5）|グループのユーザーにSNMPトラップの送信を許可するSNMPビュー（notify-view）を表示します|
|（6）|グループと関連付ける標準IPアクセスリストを表示します|
>
※1
v1：SNMPv1、　v2c：SNMPv2c、　v3/noauth：SNMPv3（認証なし、暗号化なし）
v3/auth：SNMPv3（認証あり、暗号化なし）、　v3/priv：SNMPv3（認証あり、暗号化あり）


<br>
##### ■ 2-8-3.SNMPユーザーの確認
SNMPユーザーを確認するには、<b>特権EXECモード</b>で次の<font color="Red"><b>show snmp user コマンド</b></font>を実行します。

```
# show snmp user
```