ACL(アクセスコントロールリスト)

アクセスコントロールリストについてまとめてみました。
自分が分かるように引用してまとめたので間違いなどがあれば指摘してください。

# ACLとは
ACL（Access Control List）:システムやファイル、ネットワーク上のリソースなどへのアクセス可否の設定をリストとして列挙したもの。
ルータはACLの内容（ルール）に基づき、ルータに送られてくる通信を許可する通信と、拒否する通信にパケットを分ける**フィルタリング**を行う。

特にネットワークの場合、宛先と送信元のIPアドレスおよびポート番号を条件とした上で、その条件に合致した通信の可否をACLとして設定する。このACLを使ってネットワークアクセスを制御することにより、特定のサーバーのIPアドレス宛のパケットのみを許可する、あるいは特定の送信元IPアドレスからのパケットはすべて破棄するなどといった設定が可能になる。

このようなネットワークにおけるアクセス制御の仕組みはファイアウォールで実現されているほか、LinuxなどのOSでも利用することができる。

### パケットとは
インターネットなどTCP／IPネットワークで通信を行う際、データはIP（Internet Protocol）によって分割される。この分割されたデータのことをパケットと呼ぶ。

パケットには送信元IPアドレスや宛先IPアドレスが記述されたIPヘッダがあり、ルーターはこのIPヘッダに記述された宛先IPアドレスを読み取り、次に送るべき先を決定する。

パケットの最大サイズはMTU（Maximum Transmission Unit）と呼ばれ、一般的には1500bytes。
通信経路上に送信したパケットよりもMTUが小さいネットワークがあった場合、パケットは送信できるサイズで分割される。このような処理をIPフラグメンテーションと呼びますが、これが発生すると通信効率の低下などにつながる可能性があるため、MTUを設定する際には注意が必要。

## ACLの設定
　ルータに着信したパケットは、ACLの1行目から順番に条件に合致するかどうかを確認していき、最初に
　合致した条件に従ってパケット通過が「許可」（permit）または「拒否」（deny）される。
条件に合致した後は以降のACLの条件は適用されないので、ACLではその条件をどのような順番にし作成していくのかが重要となる。
　また、ACLには「暗黙の　deny any」というルールがあり、「暗黙の deny any 」は作成したACLの最終行に自動で追加される全てのパケットを拒否する。（※この暗黙のdenyは表示されません。）

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

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

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

## ACLの種類
Cisco機器では、ACLには標準ACLと拡張ACLの大きく2つの種類２種類がある。

### 標準ACL
標準ACLは、送信元IPをもとに、パケットの通過を制御するACL。送信元IPアドレスのみのルールのため、設定はシンプル。
標準ACLには、「番号付き標準ACL」 と 「名前付き標準ACL」がある。
番号付き標準ACLは番号で識別され番号は、1～99、もしくは 1300～1999の値を指定する。
名前付き標準ACLは名前で識別される。

効果は全く同じだが、制御の用途によって名前をつけることで、管理がしやすくなるメリットがある。

![スクリーンショット 2023-06-03 14.43.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/62a3fce7-8fa4-d0b0-7466-8eee7f9f7a19.png)

番号付き標準ACLのコマンドと設定例は以下のとおり。
```
(config)#　access-list [ACL番号] [permit | deny][送信元IP][ワイルドカードマスク]
```
| コマンド引数 | 説明 |
| --- | --- |
| ACL番号 | 標準ACLの番号を 1 ～ 99、1300 ～ 1999 の範囲で指定する。通常は 1 ～ 99 を使用していき、<br> 1 ～ 99全てを使用した場合に1300 ～ 1999を使用するので1300以降は一般的に使用されない。 |
| permit / deny | 条件文のパケット許可する場合は permit キーワード、拒否する場合は deny キーワードを使用。 |
| 送信元IP | 送信元IPアドレスを指定する。 |
| ワイルドカードマスク | ワイルドカードマスクを指定する。ワイルドカードマスクを指定しない場合「0.0.0.0」が適用される。 |
```:ACLの作成の例
(config)# access-list 50 deny 192.168.1.1 0.0.0.0
(config)# access-list 50 permit 192.168.1.0 0.0.0.255
```
```:インターフェースへの適用の例
(config)# interface GigabitEthernet 0/1
(config-if)#ip access-group 50 in
```
この設定で、GigabitEthernet 0/1に入ってくる通信に対して、192.168.1.1/32の通信は拒否され、それ以外の192.168.1.0/24の通信は許可される。また、暗黙のdenyによって、それ以外の通信も拒否される。


名前付き標準ACLのコマンドと設定例は以下のとおり。
```
(config)# ip access-list standard [ACLの名前] 
(config-std-nacl)# [シーケンス番号] [ permit | deny ] [送信元IP][ワイルドカードマスク]
```
| コマンド引数 | 説明 |
| --- | --- |
| ACLの名前 | インターフェースに適用する標準ACLの名前を指定する。 |
| シーケンス番号 | 条件文のシーケンス番号。省略も可能だが、省略した場合、1行目のシーケンス番号は「10」<br> 2行目の条件文のシーケンス番号は「20」のように、2行目以降は「10」間隔で付加されていく。 |
| permit/deny | 条件文のパケット許可する場合は permit キーワード、拒否する場合は deny キーワードを使用。 |
| 送信元IP | 送信元IPアドレスを指定する。 |
| ワイルドカードマスク | ワイルドカードマスクを指定する。ワイルドカードマスクを指定しない場合「0.0.0.0」が適用される。 |


```:ACLの作成の例
(config)# ip access-list standard Management
(config-std-nacl)#　deny 192.168.1.1 0.0.0.0
(config-std-nacl)#　permit 192.168.1.0 0.0.0.255
```

```:インターフェースへの適用の例
(config)# interface GigabitEthernet 0/1
(config-if)#ip access-group Management in
```


### 拡張ACL
拡張ACLは送信元IPアドレスに加えて、宛先IPアドレス、プロトコル番号、送信元ポート番号、宛先ポート番号を組み合わせてパケットの通過を制御できる。
標準ACLと比較して、柔軟で細かい設定ができるのが拡張ACLの特徴。
標準ACLと同じように、拡張ACLには名前付き拡張ACLと番号付き拡張ACLがある。
ACL番号は100～199、または2000～2699を使用する。
![スクリーンショット 2023-06-03 15.26.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/052320af-9ccb-8979-fcf3-efe4880dd997.png)

番号付き拡張ACLのコマンドと設定例は以下のとおり
```
access-list [ACL番号] [permit | deny][プロトコル][送信元IP][ワイルドカード][送信元ポート番号][宛先IP][ワイルドカード][宛先ポート番号]
```
| コマンド引数 | 説明 |
| --- | --- |
| ACL番号 | 拡張ACLの番号を 100 ～ 199、2000 ～ 2699 の範囲で指定する。通常は100 ～ 199を使用して<br> 100 ～ 199 全てを使用した場合に 2000 ～ 2699 を使用するので2000以降はあまり使用されない。 |
| permit/deny | 条件文のパケット許可する場合は permit キーワード、拒否する場合は deny キーワードを使用。 |
| プロトコル | プロトコル名を指定する。（ 例 ： ip / icmp / tcp / udp ) |
| 送信元IP | 送信元IPアドレスを指定する。 |
| ワイルドカード | ワイルドカードマスクを指定する。 |
|宛先IPアドレス|宛先IPアドレスを指定する。|
|ワイルドカード|ワイルドカードマスクを指定する。|
| 宛先ポート番号 | 以下の演算子の後にポート番号を指定する。最も使用されるキーワードが eq 。<br> ・ eq （ equal = 等しい）<br> ・ neq （ not equal = 等しくない）<br> ・ gt （ greater than = より大きい ）<br> ・ lt （ less than = より小さい ）<br> ・ range （ ポート番号の範囲 ） |

```:ACLの作成の例
access-list 150 deny tcp 192.168.1.0 0.0.0.255 10.1.1.0 0.0.0.255 eq 80
access-list 150 permit ip 192.168.0.0 0.0.255.255 10.1.1.0 0.0.0.255
```

```:インターフェースへの適用の例
(config)#interface GigabitEthernet 0/1
(config-if)#　ip access-group 150 in
```

この設定で、GigabitEthernet 0/1に入ってくる通信に対して、制御ルールが適用され、192.168.1.0/24から10.1.1.0/24へのTCP80（http）の通信は拒否される。一方で、192.168.1.0/24以外の192.168.0.0/16は10.1.1.0/24に対してどのプロトコルでも通信が許可される。


名前付き拡張ACLのコマンドと設定例は以下のとおり
```
(config)# ip access-list extended [拡張ACLの名前]
(config-ext-nacl)# [シーケンス番号] [ permit | deny ] [プロトコル] [送信元IPアドレス] [ワイルドカード] [宛先IPアドレス] [ワイルドカード] [宛先ポート番号]
```
| コマンド引数 | 説明 |
| --- | --- |
| 拡張ACLの名前 | 拡張ACLの名前を、管理者が分かりやすいように指定する。 |
| シーケンス番号 | 条件文のシーケンス番号。省略も可能だが、省略した場合、1行目のシーケンス番号は「10」、<br> 2行目の条件文のシーケンス番号は「20」のように、2行目以降は「10」間隔で付加されていく。 |
| permit/deny | 条件文のパケット許可する場合は permit キーワード、拒否する場合は deny キーワードを使用。 |
| プロトコル | プロトコル名を指定する。（ 例 ： ip / icmp / tcp / udp ) |
| 送信元IPアドレス | 送信元IPアドレスを指定する。 |
| ワイルドカード | ワイルドカードマスクを指定する。 |
|宛先IPアドレス|宛先IPアドレスを指定する。|
|ワイルドカード|ワイルドカードマスクを指定する。|
| 宛先ポート番号 | 以下の演算子の後にポート番号を指定する。最も使用されるキーワードが eq 。<br> ・ eq （ equal = 等しい）<br> ・ neq （ not equal = 等しくない）<br> ・ gt （ greater than = より大きい ）<br> ・ lt （ less than = より小さい ）<br> ・ range （ ポート番号の範囲 ） |


```:ACLの作成の例
(config)# ip access-list extended TELNET-Filter 
(config-ext-nacl)# deny tcp host 192.168.0.1 host 10.1.1.1 eq 23
(config-ext-nacl)# deny tcp host 172.16.10.1 host 10.1.1.1 eq 23 
(config-ext-nacl)# permit ip any any
```

```:インターフェースへの適用の例
(config)# interface GigabitEthernet0/2 
(config-if)# ip access-group TELNET-Filter out
```

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

**ACLをインバウンド（IN）で適用した場合**
　①　インターフェースに着信してくるパケットにACLが適用される。
　②　ACLで許可された場合はパケットがルーティングされる。拒否された場合はパケットは破棄される。
![スクリーンショット 2023-06-03 16.15.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/85d97054-8e86-de82-3e66-4e3fe2d35f27.png)

**ACLをアウトバウンド（OUT）で適用した場合**
①　インターフェースに着信してくるパケットがルーティングテーブルに従ってルーティングされる。
②　インターフェースから発信していくパケットにACLが適用される
![スクリーンショット 2023-06-03 16.16.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/ac20b57d-7bb3-67bc-612a-1f99f1a0f098.png)


## ACLの作成時の注意点
以下のようなリストを作成してしまうと、どのネットワークからもWebサーバーに通信出来なくなってしまう。
```
(config)# access-list 1 deny 192.168.0.0 0.0.0.255
```
ACLには、最後に暗黙のdenyという全てのパケットを拒否するルールがある為、このACLは「192.168.0.0/24」からの通信を拒否して、それから残り全ての通信も拒否するというリストになってしまう。

また、以下のようなリストを作成してしまうと、
```
(config)# access-list 1 permit any
(config)# access-list 1 deny 192.168.0.0 0.0.0.255
```
1行目に全ての通信の許可をしているので、全ての通信が該当してしまうので、それ以降の行はチェックされなくなってしまう。その為2行目に拒否のエントリがあってもチェックされない。


# 参考記事
https://www.ntt.com/bizon/glossary/e-a/acl.html

https://www.infraexpert.com/study/aclz1.html

https://qiita.com/k-yasuhiro/items/4f0e59fdcdf0ec908bbf#-1-3-1vty%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1%E3%81%AE%E8%A8%AD%E5%AE%9A