ACL【ACLの概要 / 標準ACLの設定】

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


1.ACL / 標準ACL
-

#### 1-1.ACLの概要

##### ■ 1-1-1.ACLとは？
ACLとは、アクセスコントロールリストの略で、<font color="Red"><b>通信アクセスを制御するためのリスト</b></font>のことです。
一般的には略して <b>ACL</b>と呼ばれています。

複数のネットワークが、存在する環境では各ネットワークで無条件に通信出来ると問題が
ある場合はあります。そこでルータでは、通過するパケットをチェックして、許可された通信だけを
転送するように制御する事が出来るようになっています。
そういった通信の制御に使用されるのが ACLです。

ACLには、<font color="Green">チェックするパケットの条件とその条件に一致する場合の動作（許可または拒否）の
一覧</font>を登録します。ルータはACLの内容（ルール）に基づき、ルータに送られてくる通信を
許可する通信と、拒否する通信にパケットを分ける<font color="Red"><b>フィルタリング</b></font>を行います。

<br>
##### ■ 1-1-2.ACLの種類

● 標準ACL
標準ACLは、パケットをチェックする条件とし<font color="Red"><b>「送信元IPアドレス」</b></font>を使用します。
標準ACLには、番号付き標準ACL と 名前付き標準ACLがあります。

番号付き標準ACLは番号で識別されます。番号は、<font color="Green">1～99、もしくは 1300～1999</font>の値を指定します。
名前付き標準ACLは名前で識別されます。
効果は全く同じですが、名前付きのほうが、「これは何用の ACLだ」と管理しやすいです。

<br>
● 拡張ACL
拡張ACLでは、<font color="Red"><b>「送信元IPアドレス」だけでなく「宛先IPアドレス」「プロトコル番号」
「送信元ポート番号」「宛先ポート番号」</b></font>のパケットをチェックします。

拡張ACLには、番号付き拡張ACL と 名前付き拡張ACLがあります。
番号付き拡張ACLは番号で識別されます。番号は、<font color="Green">100～199、もしくは 2000～2699</font>の値を指定します。
名前付き拡張ACLは名前で識別されます。

<br>
##### ■1-1-3.ACLのルール

ACLは、フィルタリングする条件を１行ずつ記述してきます。
基本的に設定した順番に上から並びます。最初に設定したものが、1行目に
次に設定したものが2行目に、といった形で並びます。

このように作成されたACLを検索する際にはルールがあります。
ルータに届いたパケットは、ACLの1行目から順番に条件に合致するかどうかを確認していき、
最初に合致した条件に従って、パケット通過を「許可」または「拒否」します。
<font color="Red"><b>条件に合致した後は以降のACLの条件は適用されないので、ACLではその条件をどのような順番に、
作成していくのかが重要となります。</b></font>

また、ACLには<b>「暗黙のdeny」</b>というルールがあります。
「暗黙のdeny」は<font color="Green">作成したACLの最終行に自動で追加される全てのパケットを拒否する</font>というACLの事です。
※この暗黙のdenyは表示されません。


下記の画像はイメージ図です。
<img width="600" alt="ファイル名" src="https://i.gyazo.com/4ffff907a45c1ac41c628de79cddc5ba.png">
上図では2行のACLを記述しています。
3行目は設定していなくても自動的に「暗黙のdeny」が追加されます。
ACLの1行目から順番に条件に合致するかどうかを確認していき、
最初に合致した条件に従って、フィルタリングしていきます。

<br>
##### ■1-1-4.ワイルドカードマスク

ACLでは、フィルタリングの条件となる送信元や宛先を指定する際には、
ワイルドカードマスクを使用します。

▶︎ 1つのIPアドレスのみを条件とするワイルドカードマスク
特定のIPアドレスを指定するワイルドカードマスクは、IPアドレスを32ビット全部を比較対象と
する為、「0.0.0.0」となります。このように特定のIPアドレスを指定する場合は、
ワイルドカードマスクを使用せず、<font color="Red"><b>host ＜IPアドレス＞</b></font>の表記で表す事も出来ます。

```　
172.16.1.1 0.0.0.0　→ host 172.16.1.1
```
<br>

▶︎ 全てのIPアドレスを条件とするワイルドカードマスク
全てのIPアドレスを指定する場合には、32ビットの全てが任意の値でいいという事になる為、
ワイルドカードマスクは「255.255.255.255」となり直前のIPアドレスは、
条件するものがない為、「0.0.0.0」になります。全てのIPアドレスを指定する場合は、
ワイルドカードマスクを使用せず、<font color="Red"><b>any</b></font>で指定する事も可能です。

```　
0.0.0.0 255.255.255.255　→ any
```
<br>

##### ■1-1-5.ACLの適用

ACLは、作成後、ACLに基づいてチェックが行われるようにルータのインターフェイスに、
適用します。ACLは、<font color="Red"><b>インバウンド（IN）</b></font>で適用するか、<font color="Red"><b>アウトバウンド（OUT）</b></font>で適用するか
で動作が異なります。
また、ACLの適用は、1つインターフェイスにつき、インバウンド、アウトバウンドそれぞれ
1つのみの適用になります。

▶︎ ACLをインバウンド（IN）で適用した場合
インバウンド（IN）で適用した場合、ルータのインターフェースにパケットが<b>届いた時</b>に
ACLによるチェックが行われます。チェックの結果、ACLで許可された場合はパケットが
ルーティングされ、拒否された場合はパケットはブロックされ破棄されます。
<img width="600" alt="ファイル名" src="https://i.gyazo.com/75e2e0301eb434860e0ef4db75cbbf8d.png">

<br>
▶︎ ACLをアウトバウンド（OUT）で適用した場合
アウトバウンド（OUT）で適用した場合、ルータに届くパケットがルーティングテーブルに従って
ルーティングされた後、ルータからパケットが<b>出ていく時</b>にACLによるチェックが行われます。
<img width="600" alt="ファイル名" src="https://i.gyazo.com/0273b8f871ac5af2f132e97973050d75.png">

<br>
#### 1-2.標準ACLの設定と確認

##### ■ 1-2-1.標準ACLの設定

標準ACLを使ってパケットフィルタリングを行うには以下の手順で行います。

① 標準ACLを作成する

▶︎ 番号付き標準ACLの作成
番号付き標準ACLの作成するにするには、<b>グローバルコンフィギューレションモード</b>で
次の <font color="Red"><b>access-listコマンド</b></font>を実行します。

```
(config)# access-list < ACL番号 > < permit / deny > < 送信元アドレス > < ワイルドカードマスク >
```
>＜ACL番号＞には、 <font color="Red">1 ～ 99</font>、1300 ～ 1999 の範囲で指定する。
＜送信元アドレス＞＜ワイルドカードマスク＞には、許可/拒否する、送信元アドレスと
ワイルドカードマスクを指定します。
＜permit / deny＞には、指定条件に一致したパケット許可する場合は <font color="Red">permit</font>、
拒否する場合は <font color="Red">deny</font>を使用。

<br>


▶︎ 名前付き標準ACLの作成
番号付き標準ACLの作成するにするには、<b>グローバルコンフィギューレションモード</b>で
次の <font color="Red"><b>ip access-list standardコマンド</b></font>を実行します。

```
(config)# ip access-list standard < ACL番号 >
```
このコマンドを実行すると、標準ACLグローバルコンフィギューレションモードに移行し、
プロンプト<font color="Green">（config-std-nacl）#</font>に変わります。その後、条件を指定していきます。

```
（config-std-nacl）# < permit / deny > < 送信元アドレス > < ワイルドカードマスク >
```
>
条件の指定は番号付き標準ACLの場合と同じです。

② インターフェイスの適用する
作成したACLをインターフェースに、インバウンドまたはアウトバウンドで適用します。
この設定によりACLが有効となり、そのインタフェースでパケットフィルタリングが、
行われるようになります。

作成した標準ACLをインターフェイスに適用するには、<b>インターフェイスコンフィギューレションモード</b>で
次の <font color="Red"><b>ip access-groupコマンド</b></font>を実行します。

```
(config-if)# ip access-group < ACL番号 | ACL名 > < in | out >
```
>＜ACL番号 | ACL名＞に適用する標準ACLの名前か番号を指定し、
＜ in | out ＞は、インバウンドに指定する場合 in、アウトバウンドに指定する場合 outを指定します。
また、頭に noを付けるとインターフェイスの適用を解除します。

<br>
##### ■ 1-2-2.標準ACLの設定例

通信要件：
①「192.168.0.0/24」のネットワークから、Webサーバへの通信を拒否する。
② それ以外のネットワークの通信は許可するという標準ACLの設定をしていきます。

補足：
「192.168.0.0/24」のネットワークは、Router1を通り「172.16.0.0/24」のネットワークの
Webサーバーに通信しています。
Router1の「192.168.0.0/24」のネットワーク側のインターフェイスを「Fa0/1」
「172.16.0.0/24」のネットワーク側のインターフェイスを「Fa0/0」とします。

▶︎ 番号付き標準ACLで作成

① 標準ACLを作成する

```
Router1(config)# access-list 1 deny 192.168.0.0 0.0.0.255
Router1(config)# access-list 1 permit any
```
初めに、1行目で「192.168.0.0/24」からの通信を拒否するリストを作成します。
続いて、2行目で残りの通信全てを許可するリストの作成をします。

② インターフェイスへの適用
作成した標準ACLの適用しますが、<font color="Red"><b>標準ACLでは、目安として宛先に近い所</b></font>に適用します。
今回は、Webサーバー側に近い「Fa0/0」適用します。

もし、「Fa0/1」に適用してしまうと、「192.168.0.0/24」からWebサーバーへの通信は拒否されますが、
それ以外へのネットワークへの通信も拒否されてしまいます。

```
Router1(config)# interface FastEthernet 0/0
Router1(config-if)# ip access-group 1 out
```

<br>
▶︎ 名前付き標準ACLで作成

① 標準ACLを作成する


```
Router1(config)# ip access-list standard TEST
（config-std-nacl）# deny 192.168.0.0 0.0.0.255
（config-std-nacl）# permit ip any
```

② インターフェイスへの適用

```
Router1(config)# interface FastEthernet 0/0
Router1(config)# ip access-group TEST out
```
<br>
##### ■ 1-2-3.標準ACLの作成時の注意点

1-2-2の設定例で、
以下のようなリストを作成してしまうと、どのネットワークからもWebサーバーに
通信出来なくなってしまいます。

```
Router1(config)# access-list 1 deny 192.168.0.0 0.0.0.255
```
<font color="Red">ACLには、最後に暗黙のdenyという全てのパケットを拒否するルールがあります。</font>
その為、このACLは「192.168.0.0/24」からの通信を拒否して、それから残り全ての通信も
拒否するというリストになってしまいます。
<br>
また、以下のようなリストを作成してしまうと、

```
Router1(config)# access-list 1 permit any
Router1(config)# access-list 1 deny 192.168.0.0 0.0.0.255
```
1行目に全ての通信の許可をしているので、全ての通信が該当してしまうので、
<font color="Red">それ以降の行はチェックされません</font>ので、その為2行目に拒否のエントリがあっても
チェックされません。

<br>
##### ■ 1-2-4.標準ACLの確認

作成されたACLの確認をするには、<b>特権EXECモード</b>で
次の <font color="Red"><b>show access-listコマンド</b></font>を実行します。

```
# show access-list [ < ACL番号 > | < ACL名 > ]
```

下記の画像がコマンドを実行したもの
<img width="600" alt="ファイル名" src="https://i.gyazo.com/0a25c5a12e029bb55898bb0e03bb455f.png">
番号付き標準ACLと名前付き標準ACLで表示のされ方が異なるのが分かります。
そして、エントリの先頭についてる数字はシーケンス番号で、<b>シーケンス番号が小さいエントリから
チェック</b>されます。

また、リストに表示されていませんが、各リストの最終行には、暗黙のdenyが存在するので、
条件に合致しないパケットは全て破棄します。

<br>
##### ■ 1-2-5.ACLを適用したインターフェイスの確認

通信が思ったように制御できなかった場合、インターフェイスの
インバウンド、アウトバウンドどちらに適用されているか確認する必要があります。

インターフェイスの適用方向を確認するには、<b>特権EXECモード</b>で
次の <font color="Red"><b>show ip intretaceコマンド</b></font>を実行します。

```
# show ip intretace < インターフェイス名 >
```

<img width="600" alt="ファイル名" src="https://i.gyazo.com/70101d2eb7c8538e1ac7dc2bc888fca7.png">
「Outgoing」は、アウトバウンドのACLで、「not set」は未適用である事を示しています。
「Inbound」は、インバウンドのACLで、番号100のACLが適用されています。
<br>

※ <font color="Red">「show running-configコマンド」</font>でも、ACLの適用インターフェイスやACLの内容の
　確認が出来ます。

<br>
##### ■1-2-6.ACLの削除

ACLの作成を間違った場合、<b>グローバルコンフィギューレションモードモード</b>で
次の <font color="Red"><b>no access-listコマンド</b></font>を実行します。

```
(config)# no access-list < ACL番号 | ACL名 >
```
>
この場合、対象のACLの全てのエントリが消えます。
<font color="Green">no access-listコマンドでは、特定の行を消す事は出来ません。</font>


特定の行だけを削除するには、<b>標準ACLコンフィギューレションモードモード</b>で
次の <font color="Red"><b>noコマンド</b></font>を実行します。

```
(config)# ip access-list standard < ACL番号 | ACL名 >
（config-std-nacl）# no < シーケンス番号 >
```
>＜ACL番号 | ACL名 ＞で対象の標準ACLを指定します。
番号付きACLであっても番号自体を名前で扱う事によって、名前付きACL同様
ACLコンフィギューレションモードモードで操作する事が出来ます。
＜シーケンス番号＞には対象のシーケンス番号は入ります。

<br>
#### 1-3.VTYアクセス制御

ACLは、物理インターフェイスだけでなくVTY回線に適用する事も可能です。
VTY回線に適用する事でTELNET接続やSSH接続を利用したルータへのリモートアクセスを
制御出来ます。ルータへのTELNET接続等を制御したい場合、<font color="Green">ポート番号等を指定する事が出来る
拡張ACLを物理インターフェイスに適用する事</font>で可能になります。

例えば、3つのインターフェースがあるルータなら、この3つのインターフェース全てに、
拡張ACLを適用して、ルータに着信するTELNET/SSH接続パケットを
「許可または拒否」させればいいのですが、そのような面倒なことをしなくても、
VTY回線に適用するなら、<b>送信元IPアドレスのみを条件とするだけ</b>で良い為、
標準ACLを作成してVTY回線に適用すれば、リモートアクセスを制御出来ます。

##### ■ 1-3-1.VTYアクセス制御の設定
VTYアクセス制御を行うには、
標準ACLを作成して、VTYの<b>ラインコンフィギューレションモードモード</b>で
次の <font color="Red"><b>access-classコマンド</b></font>を実行します。

```
(config-line)# access-class < ACL番号 | ACL名 > <in | out>
```
>「in」を指定すると、標準ACLで指定された送信元からアクセスを制御します。
「out」は少し挙動が異なり、「out」場合は、標準ACLが設定されているルータに
VTY回線で接続し、そこからさらに別のルータへVTYアクセスする際に制御します。
その場合、標準ACLで指定した送信元は宛先として使用されます。

##### ■ 1-3-2.VTYアクセス制御の設定例

▶︎ 設定例
ルータ1 に対してTELNET/SSH接続を「192.168.0.1/24」からのアクセスを拒否する

先ず、ルータへの管理アクセスを「拒否」する送信元アドレスを定義する為に、
標準ACLを設定します。標準ACLは「番号付き標準ACL」または「名前付き標準ACL」
のどちらでも適用可能です。そして次に、VTY回線に対してACLを適用します。

```.text:設定例
Router1(config)# access-list 5 deny  host 192.168.0.1
Router1(config)# line vty 0 4
Router1(config-line)# access-class 5 in
```
VTYへのアクセス制御は、ルータへの管理アクセス（Telnet/SSH接続）の制御という点で
インバウンドで適用する制御が一般的です。
<br>
▶︎ アウトバウンド適用例
アウトバウンドで適用した場合、そのルータから別のネットワーク機器へ
管理アクセス（Telnet/SSH接続）する際の宛先への通信を制御する事が出来ます。
VTYからのアクセス制御（アウトバウンド）においては、「 宛先アドレスのチェック 」という
位置付けで使用されます。

設定例は下記の画像の通りです。
<img width="600" alt="ファイル名" src="https://i.gyazo.com/c5c4b3f5fae388b6cb098a97a4f0cade.png">
ルータ1 から「10.1.1.0」と「10.1.2.0」の別のネットワーク機器へのアクセスは拒否され、
「permit any」でそれ以外全てのアクセスが許可されています。

## 関連投稿記事
[ACL【拡張ACLの設定】](https://qiita.com/k-yasuhiro/private/f13966168bd2bc9629bf)

<br>
参考記事
-
<font color="DarkTurquoise">※[ACL - named ACL](https://www.infraexpert.com/study/aclz6.html)という記事参照</font>
<font color="DarkTurquoise">※[ACL - show access-lists / ip access-list extended](https://www.infraexpert.com/study/aclz7.html)という記事参照</font>