ACL(Access Control Lists)

# 概要
通信の制御に使用される。ACLの内容に基づいてパケットフィルタリング(ルータに送られてくる通信を許可・拒否する通信に分けること)を行う。様々な種類が存在する。

### 標準ACL
パケットの送信元IPアドレスをチェックする。

+ **番号付き標準ACL**：1～99(IOS 12.0以降では1300～1900も可)の値を指定
+ **名前付き標準ACL**：名前を示す文字列を指定

### 拡張ACL
送信元IPアドレス、宛先IPアドレス、プロトコル番号、送信元ポート番号、宛先ポート番号をチェックする。

+ **番号付き拡張ACL**：100～199(IOS 12.0以降では2000～2699も可)の値を指定
+ **名前付き拡張ACL**：名前を示す文字列を指定

### 作成時の注意点

+ ACLは上の行から順番に検索し該当行があった場合、それ以降の行の検索は行わない。そのため、各順番を間違えると、想定外の動きをしてしまう。
+ 「すべて拒否(deny)」という暗黙の行が存在する。ACLのどの行にも当てはまらなかった場合、パケットは破棄されることになる。
+ **標準ACLは宛先に近い場所、拡張ACLは送信元に近い場所に適用させる**
+ 名前付きアクセスリストは**特定の行を指定した削除**や、**シーケンス番号の振り直し**ができる。

### ワイルドカードマスク
OSPFと同様にフィルタリングの条件となる送信元や宛先を指定する際に使用する。特定の送信元や宛先を指定する際、省略形を用いることができる。チェックするビットには0、無視するビットには1を指定する。

+ **1つのIPアドレスのみを条件とする**ワイルドカードマスク
特定のIPアドレスだけを指定する場合は、ワイルカードマスクで`0.0.0.0`を指定すればよいが、ワイルドカードマスクを使用せずに**host [IPアドレス**]の表記で表すことも出来る。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/50350d3e-ec55-bdbf-9e25-3c6307c6ad55.png)

:::note warn
書式の位置が変わるのに注意すること
:::


+ **全てのIPアドレスを条件とする**ワイルドカードマスク
下の図のように**any**と指定することが可能

![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/8cb05461-0155-00f5-fbb4-990316f0b792.png)

### ACLの適用
インターフェースに適用できるACLの数は、レイヤ3プロトコル（IPやIPX）ごとに in方向とout方向に**1つずつ**となる。2つ以上のACLを適用しようとすると上書きされる。

+ インバウンド(IN)で適用した場合
ルータのインターフェイスにパケットが届いたときにACLによるチェックが行われる。

+ アウトバウンド(OUT)で適用した場合
ルーティングテーブルの検索などの処理が行われた後、ルータからパケットが出ていくときにACLによるチェックが行われる。ただし、ルータ自身が送信する通信はチェックの対象とならない。

# 標準ACLの設定

## 1. 標準ACLを作成する

### access-listコマンド
**書式：access-list [ACL番号] [permit | deny] [送信元IPアドレス] [ワイルドカードマスク]**
**番号付き標準ACLを作成するコマンド**。グローバルコンフィギュレーションモードで行う必要がある。1～99(IOS 12.0以降では1300～1900も可)の値を指定する。

### ip access-list standardコマンド
**書式：ip access-list standard [ACL名]**
**名前付き標準ACLを作成するコマンド**。グローバルコンフィギュレーションモードで行う必要がある。コマンドを実行すると、**標準ACLコンフィグレーションモード**に移行し、プロンプトも以下のように変更され条件を指定していく。

``` markdown:標準ACLコンフィグレーションモード
(Config-std-nacl)#[permit | deny] [送信元IPアドレス] [ワイルドカードマスク]
```

## 2.インターフェイスに適用する

### ip access-groupコマンド
**書式：ip access-group [ACL番号 | ACL名] [in | out]**
作成した標準ACLをインターフェイスに適用するコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。in/outはインバウンドとアウトバウンドのこと。頭にnoを付けると、適用が解除される。
**宛先に近いインターフェイスに適用することが推奨される。**

### show access-listsコマンド
**書式：show access-lists [ACL番号 | ACL名]** 
作成されたACLを確認するコマンド。特権EXECモードで行う必要がある。対象のACLを指定しない場合は全てのACLが表示される。

インターフェイスの適用を確認する場合は、`show ip interface`コマンドか`running-config`から確認することができる。

```markdown:アクセスグループ100の詳細
Router#show access-lists 100
Extended IP access list 100
    permit tcp host 192.168.10.1 host 192.168.20.1 eq www
    deny icmp host 192.168.10.1 host 192.168.20.1 echo
```


# 拡張ACLの設定
拡張ACLでは標準ACLより細かくパケットのフィルタリングをすることが可能。

## 1.拡張ACLを作成する

### access-listコマンド
**書式：access-list [ACL番号] [permit | deny] [プロトコル] [送信元IPアドレス] [ワイルドカードマスク] [送信元ポート番号] [宛先IPアドレス] [ワイルドカードマスク] [オプション]**
番号付き拡張ACLを作成するコマンド。グローバルコンフィギュレーションモードで行う必要がある。

| 各項目 | 内容 |
|:-:|:-:|
| ACL番号  | 100~199(IOS 12.0以降では2000~2699も可)の値を値を指定する  |
| permit  | 指定した条件に一致したパケットを許可  |
| deny  | 指定した条件に一致したパケットを拒否  |
| プロトコル  | ip,tcp,udp,icmpなどのプロトコルを指定する  |
| 送信元ポート番号  | 省略可能。[プロトコル]で指定した際に指定することができる  |
| オプション  | [プロトコル]で指定したプロトコルによって指定できる値が異なる  |

| オプション | 内容 |
|:-:|:-:|
| established  | 内部から発信する通信の戻りのパケットは許可したいが、外部からは、拒否したいという場合に使用する |
| log  | 条件が一致した情報を記録する。トラフィックの監視、分析、またはトラブルシューティングの際に役立つが、このキーワードを指定した条件文が多数がある場合、機器の負荷が高くなるので注意が必要 |
| log-input  | パケットを受け取ったインターフェースや、送信元MACアドレス含むログが出力される  |

| プロトコル | 説明 | オプション例 |
|:-:|:-:|:-:|
| ip  | IPに関する項目。省略するとIPを使用する全通信を指定可能  | dscpなど  |
| tcp  | パラメータ＋ポート番号。パラメータはeq(等しい)、neq(等しくない)、lt(小さい)、gt(大きい)、ポート番号は数字またはポート名で指定する  | eq www,eq 80  |
| udp  | パラメータ＋ポート番号。指定方法はtcpと一緒  | eq snmp,eq 161  |
| icmp  | ICMPのメッセージタイプ  | echo,echo-reply  |


| プロトコル | プロトコルナンバー | 説明 | オプション例 |
|:-:|:-:|:-:|:-:|
| ip  |   | IPに関する項目。省略するとIPを使用する全通信を指定可能  | dscpなど |
| tcp  | 6  | パラメータ＋ポート番号。パラメータはeq(等しい)、neq(等しくない)、lt(小さい)、gt(大きい)、ポート番号は数字またはポート名で指定する  | eq www,eq 80 |
| udp  | 17  | パラメータ＋ポート番号。指定方法はtcpと一緒  | eq snmp,eq 161   |
| icmp  | 1  | ICMPのメッセージタイプ  | echo,echo-reply |
| EIRGP  | 88  |   |   |
| OSPF  | 89  |   |   |



``` markdown:簡単な例
##端末192.168.1.11からネットワーク172.16.1.0/24へのIP通信を拒否する
(config)#access-list 100 deny ip host 192.168.1.11 172.16.1.0 0.0.0.255

##全ての送信元からWebサーバ172.16.0.11へのHTTP通信のみを許可する
(config)#acess-list 100 permit tcp any host 172.16.0.11 eq www

##PC192.168.1.11からネットワーク172.16.1.0/24へのエコー要求を拒否する
(config)#access-list 100 deny icmp host 192.168.1.11 172.16.1.0 0.0.0.255 echo-reply
```
::: note info
拡張ACLにも最後に全て拒否する`deny ip any any`という暗黙のdenyの行が存在する。
:::


### ip access-list extendedコマンド
**書式：ip access-list extended [ACL名]**
名前付き拡張ACLを作成するコマンド。グローバルコンフィギュレーションモードで行う必要がある。実行すると、拡張ACLコンフィギュレーションモードに移行し、プロンプトも以下のように変更され条件を指定していく。

``` markdown:拡張ACLコンフィグレーションモード
(config-ext-nacl)#[permit | deny] [プロトコル] [送信元IPアドレス] [ワイルドカードマスク] [送信元ポート番号] [宛先IPアドレス] [ワイルドカードマスク] [オプション]
```

## 2.インターフェイスに適用する

### ip access-groupコマンド
**書式：ip access-group [ACL番号 | ACL名] [in | out]**
インターフェイスコンフィギュレーションモードで実行し、標準ACL同様に適用する。標準ACLは宛先に近いインターフェイスに設定することが推奨されるが、拡張ACLは**送信元に近いインターフェイスに適用すること**が推奨される。

## ACLの削除

### no access-listコマンド
**書式：no access-list [ACL番号 | ACL名]**
ACLの削除をするコマンド。グローバルコンフィギュレーションモードで行う必要がある。対象のACLの全てのエントリを削除することは出来るが、**特定の行を消すことはできない**。

::: note info
特定の行だけを削除する場合は、標準ACLコンフィギュレーションモードで`noコマンド`を行う必要がある。

``` markdown:特定の行の削除
(config-std-nacl)#no [シーケンス番号]
```
:::

``` markdown:アクセスリスト3を削除
Router# conf t
Router(config)#no access-list 3
```


## VTYアクセス制御
ACLは、物理インターフェイスだけではなくVTY回線に適用することも可能。Telnet、SSH接続を利用したルータへのリモートアクセスを制御することができる。適用する場合、送信元IPアドレスのみを条件とするだけでよい。

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/9451bba7-6418-828c-2de7-c79e286f0e6e.png)

### access-classコマンド
**書式：access-class [ACL番号 | ACL名] [in | out]**
VTYアクセス制御を行うコマンド。標準ACLを作成し、VTYのラインコンフィギュレーションモードで行う必要がある。

| オプション | 内容 |
|:-:|:-:|
| in  | 標準ACLで指定された送信元からのアクセスを制御する  |
| out  | 標準ACLが設定されているルータにVTY回線で接続し、そこからさらに別のルータへVTYアクセスする際に制御される。|


# ACLの設定例

<details><summary>ACLの設定例</summary>

![キャプチャ22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/4a1ee118-bab9-4bbe-aa44-f20d8594cb49.png)

ルーター、スイッチ、PC間をストレートケーブル、サーバとルータ間をクロスオーバーケーブルでつなぎ、各PC、サーバの「IP Configuration」を開き、IPv4アドレスの設定を行う。

+ PC001⇒192.168.10.1/24
+ PC002⇒192.168.10.2/24
+ PC003⇒192.168.10.3/24
+ Server1⇒192.168.20.1/24
+ Server2⇒192.168.30.1/24

各PC、サーバのデフォルトゲートウェイ⇒192.168.10.254

``` markdown:RT1の設定
Router#show running-config 
Building configuration...

Current configuration : 737 bytes
!
version 15.1
(省略)
interface GigabitEthernet0/0
 ip address 192.168.10.254 255.255.255.0
 duplex auto
 speed auto
!
interface GigabitEthernet0/1
 ip address 192.168.20.254 255.255.255.0
 duplex auto
 speed auto
!
interface GigabitEthernet0/2
 ip address 192.168.30.254 255.255.255.0
 duplex auto
 speed auto
 (省略)
```

``` markdown:Server1のindex.html
<html>
<h1>Hello CCNA S1</h1>
</html>
```

``` markdown:Server2のindex.html
<html>
<h1>Hello CCNA S2</h1>
</html>
```

</details>

### 標準ACLの設定例

<details><summary>標準ACLの設定例①</summary>

![キャプチャ23.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/ef079352-4028-acc5-0c3f-6a11fde82e28.png)


``` markdown:RT1の設定
Router>enable 
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#access-list 1 permit host 192.168.10.1
Router(config)#access-list 1 deny any
Router(config)#interface GigabitEthernet 0/0
Router(config-if)#ip access-group 1 ?
##?マークで確認することが出来る
  in   inbound packets
  out  outbound packets
Router(config-if)#ip access-group 1 in
Router(config-if)#end
```


``` markdown:RT1の設定確認
Router#show access-lists 1
Standard IP access list 1
    permit host 192.168.10.1
    deny any

Router#show running-config 
Building configuration...

Current configuration : 821 bytes
!
(省略)
interface GigabitEthernet0/0
 ip address 192.168.10.254 255.255.255.0
 ip access-group 1 in
 duplex auto
 speed auto
(省略)

```

設定後疎通確認を行うと、PC002、PC003は以下の通りになる

``` markdown:疎通確認
C:\>ping 192.168.20.1

Pinging 192.168.20.1 with 32 bytes of data:

Reply from 192.168.10.254: Destination host unreachable.
Reply from 192.168.10.254: Destination host unreachable.
Reply from 192.168.10.254: Destination host unreachable.
Reply from 192.168.10.254: Destination host unreachable.

Ping statistics for 192.168.20.1:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

C:\>ping 192.168.30.1

Pinging 192.168.30.1 with 32 bytes of data:

Reply from 192.168.10.254: Destination host unreachable.
Reply from 192.168.10.254: Destination host unreachable.
Reply from 192.168.10.254: Destination host unreachable.
Reply from 192.168.10.254: Destination host unreachable.

Ping statistics for 192.168.30.1:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
```
</details>

<details><summary>標準ACLの設定例②</summary>

![キャプチャ24.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/3816143e-8265-6c43-d40f-2a609bb37484.png)

``` markdown:RT1の設定確認
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
##ワイルドカードマスクにて指定する
Router(config)#access-list 2 permit 192.168.10.2 0.0.0.0
Router(config)#access-list 2 deny 0.0.0.0 255.255.255.255
Router(config)#
Router(config)#interface GigabitEthernet 0/0
Router(config-if)#ip access-group 2 in
```

``` markdown:RT1の設定確認
Router#show running-config 
Building configuration...

Current configuration : 883 bytes
!
version 15.1
(省略)
interface GigabitEthernet0/0
 ip address 192.168.10.254 255.255.255.0
 ip access-group 2 in
 duplex auto
 speed auto
(省略)
access-list 1 permit host 192.168.10.1
access-list 1 deny any
access-list 2 permit host 192.168.10.2
access-list 2 deny any
(省略)
```
設定後疎通確認を行うと、PC002は疎通しPC001、PC003は疎通されない


</details>

<details><summary>標準ACLの設定例③</summary>

![キャプチャ33.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/547703a9-79b4-4014-4827-96dc98929a64.png)


``` markdown:RT1の設定
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#access-list 3 deny 192.168.10.0 0.0.0.255
Router(config)#access-list 3 deny any
Router(config)#interface GigabitEthernet 0/0
Router(config-if)#ip access-group 3 in
Router(config-if)#end

```
設定後疎通確認を行うと、PCからサーバに向けての通信がすべて拒否された。

</details>

<details><summary>標準ACLの設定例④</summary>

![キャプチャ34.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/bb4a105e-1c03-f6f2-4fc2-9d96b901fdbf.png)

``` markdown:RT1の設定
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#interface GigabitEthernet 0/0
##設定したアクセスグループ3の適用を解除
Router(config-if)#no ip access-group 3 in
Router(config-if)#exit
Router(config)#interface GigabitEthernet 0/2
Router(config-if)#ip access-group 3 out
```
設定後、192.168.30.0側のサーバとの疎通ができず、192.168.20.0側のサーバとの疎通のみ出来るようになる


</details>

<details><summary>標準ACLの設定例⑥</summary>

![キャプチャ35.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/bd723ded-a099-d663-1bc5-3f290a184020.png)

``` markdown:RT1の設定
Router#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#interface GigabitEthernet 0/2
Router(config-if)#no ip access-group 3 out
Router(config-if)#exit
Router(config)#interface GigabitEthernet 0/1
Router(config-if)#ip access-group 3 out
Router(config-if)#exit
Router(config)#end
```
設定後、192.168.20.0側のサーバとの疎通ができず、192.168.30.0側のサーバとの疎通のみ出来るようになる




</details>

### 拡張ACLの設定例

<details><summary>拡張ACLの設定例①</summary>

![キャプチャ36.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/10ca40fd-e195-d4e7-23de-8e0df1e2c5ed.png)

```markdown:RT1の設定
Router#conf t
##アクセスリスト100でPC001からServer1へのHTTP通信を許可する
Router(config)#access-list 100 ?
  deny    Specify packets to reject
  permit  Specify packets to forward
  remark  Access list entry comment
Router(config)#access-list 100 permit ?
  ahp    Authentication Header Protocol
  eigrp  Cisco's EIGRP routing protocol
  esp    Encapsulation Security Payload
  gre    Cisco's GRE tunneling
  icmp   Internet Control Message Protocol
  ip     Any Internet Protocol
  ospf   OSPF routing protocol
  tcp    Transmission Control Protocol
  udp    User Datagram Protocol
Router(config)#access-list 100 permit tcp host 192.168.10.1 host 192.168.20.1 eq ?
  <0-65535>  Port number
  ftp        File Transfer Protocol (21)
  pop3       Post Office Protocol v3 (110)
  smtp       Simple Mail Transport Protocol (25)
  telnet     Telnet (23)
  www        World Wide Web (HTTP, 80)
Router(config)#access-list 100 permit tcp host 192.168.10.1 host 192.168.20.1 eq www
##アクセスリスト100でPC001からServer1へのpingを拒否する
Router(config)#access-list 100 deny ?
  ahp    Authentication Header Protocol
  eigrp  Cisco's EIGRP routing protocol
  esp    Encapsulation Security Payload
  gre    Cisco's GRE tunneling
  icmp   Internet Control Message Protocol
  ip     Any Internet Protocol
  ospf   OSPF routing protocol
  tcp    Transmission Control Protocol
  udp    User Datagram Protocol
Router(config)#access-list 100 deny icmp host 192.168.10.1 host 192.168.20.1 ?
  <0-256>               type-num
  echo                  Echo (ping)
  echo-reply            Echo reply
  host-unreachable      Host unreachable
  net-unreachable       Net unreachable
  port-unreachable      Port unreachable
  protocol-unreachable  Protocol unreachable
  ttl-exceeded          TTL exceeded
  unreachable           All unreachables
  <cr>
Router(config)#access-list 100 deny icmp host 192.168.10.1 host 192.168.20.1 echo
Router(config)#interface GigabitEthernet 0/0
Router(config-if)#ip access-group 100 in
```
設定後、192.168.10.1からServer1へのHTTP通信は許可され画面表示されたが、ping通信は拒否された


</details>


<details><summary>拡張ACLの設定例②</summary>

![キャプチャ37.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/41c3a255-65d0-00b3-3984-6dcaebe2134d.png)


```markdown:RT1の設定
Router#conf t
Router(config)#interface GigabitEthernet 0/0
Router(config-if)#ip access-group 100 in
Router(config)#access-list 100 deny tcp host 192.168.10.1 host 192.168.30.1 eq 80
Router(config)#access-list 100 permit icmp host 192.168.10.1 host 192.168.30.1 echo
Router(config)#end

```

設定後、192.168.10.1からServer2へのping通信は許可されが、HTTP通信は拒否され画面が表示されなかった



</details>