Cisco機器のACL挙動をまとめてみた

## ■記事作成背景
Cisco機器のアクセスリストはOSやHW毎に挙動が異なっていて
既存のACL設定を変更する際に、逐一検証するのは面倒なため挙動をまとめました。


## ■テストパターン
①下記に相当するConfigを各種機器で構成します。
```
ip access-list extended Test
 10 remark ***  remark-test  ***
 11 permit ip host 192.168.1.1 host 192.168.1.2
 12 remark ***  Sequence_No test ***
 13 permit ip host 192.168.1.3 host 192.168.1.4
 14 deny ip host 192.168.1.5 host 192.168.1.6
```

②下記パターンを機器ごとに実施し結果を
\# show running-config
\# show access-list
の2つを用いて表記します。(以降このコマンドを 結果コマンドと呼ぶ)

**パターンA** 
```
# 10 remark ***  remark-test  ***
   remark文をシーケンス番号付与して投入が可能か確認。 結果コマンドを発行する。
```

パターンB
 ```
 # no 10 remark ***  remark-test  ***
   上記よりremark文をシーケンス番号を指定して削除が可能か、結果コマンドを発行する。
 ```

パターンC
```
# 10 remark ***  remark-test  ***
  パターンAで削除したコマンドを再投入して、元の位置およびremark文をシーケンス番号付きで投入可能か検証する
``` 

パターンD
```
# 13 deny ip host 192.168.1.3 host 192.168.1.4
  既存のACLと同一のシーケンス番号を挿入した際に番号のインクリメントやデクリメント発生有無や可不可を結果コマンドで確認する。
``` 
:::note warn
以下はパターンA,B,Cが実施できなかった場合に実施する。
:::
パターンE
```
#no 13 permit ip host 192.168.1.3 host 192.168.1.4
 既存のACLを1行だけ削除し、他ACLのシーケンス番号に変化があるかを結果コマンドで確認する。
```

パターンF
```
# 13 permit ip host 192.168.1.3 host 192.168.1.4
 パターンEで削除したコンフィグを再投入して、元の位置にもどるのかを結果コマンドで確認する。
```




## ■IOS
テスト筐体:「WS-C2960G-24TC-L」
   OS ver: 「15.0(1)SE3 」
 ```
[作成したコンフィグ]
ip access-list extended Test
  10 remark ***  remark-test  ***
  11 permit ip host 192.168.1.1 host 192.168.1.2
  12 remark ***  Sequence_No test ***
  13 permit ip host 192.168.1.3 host 192.168.1.4
  14 deny ip host 192.168.1.5 host 192.168.1.6

[投入コンフィグ]
ip access-list extended Test
  10 remark ***  remark-test  ***
     ^
  % Invalid input detected at '^' marker.
  11 permit ip host 192.168.1.1 host 192.168.1.2
  12 remark ***  Sequence_No test ***
     ^
  % Invalid input detected at '^' marker.
  13 permit ip host 192.168.1.3 host 192.168.1.4
  14 deny ip host 192.168.1.5 host 192.168.1.6
```
 
### パターンA結果: remark文にシーケンス番号を指定して投入することができない
```
#show running-config
ip access-list extended Test
 permit ip host 192.168.1.1 host 192.168.1.2
 permit ip host 192.168.1.3 host 192.168.1.4
 deny   ip host 192.168.1.5 host 192.168.1.6
 
#show access-lists
 Extended IP access list Test
 11 permit ip host 192.168.1.1 host 192.168.1.2
 13 permit ip host 192.168.1.3 host 192.168.1.4
 14 deny ip host 192.168.1.5 host 192.168.1.6

```
### パターンB,C結果: パターンA実行が不可なので、非実施

### パターンD結果: シーケンス番号の重複により、投入不可
```
# 13 deny ip host 192.168.1.3 host 192.168.1.4
  % Duplicate sequence number.

# show running-config
ip access-list extended Test
 permit ip host 192.168.1.1 host 192.168.1.2
 permit ip host 192.168.1.3 host 192.168.1.4
 deny   ip host 192.168.1.5 host 192.168.1.6

#show access-list
  Extended IP access list Test
  11 permit ip host 192.168.1.1 host 192.168.1.2
  13 permit ip host 192.168.1.3 host 192.168.1.4
  14 deny ip host 192.168.1.5 host 192.168.1.6
```
### パターンE結果: permit/deny文であれば行数を指定して削除が可能
```
#no 13 permit ip host 192.168.1.3 host 192.168.1.4

# show running-config
ip access-list extended Test
 permit ip host 192.168.1.1 host 192.168.1.2
 deny   ip host 192.168.1.5 host 192.168.1.6

# show access-list
 Extended IP access list Test
 11 permit ip host 192.168.1.1 host 192.168.1.2
 14 deny ip host 192.168.1.5 host 192.168.1.6
```

### パターンF:permit/deny文であれば行数を指定して元の位置へ再投入が可能
```
#13 permit ip host 192.168.1.3 host 192.168.1.4

# show running-config
ip access-list extended Test
 permit ip host 192.168.1.1 host 192.168.1.2
 permit ip host 192.168.1.3 host 192.168.1.4
 deny   ip host 192.168.1.5 host 192.168.1.6

# show access-list
 Extended IP access list Test
 11 permit ip host 192.168.1.1 host 192.168.1.2
 13 permit ip host 192.168.1.3 host 192.168.1.4
 14 deny ip host 192.168.1.5 host 192.168.1.6
```

## ■IOS-XE
テスト筐体: 「CSR1000v」
   OS ver: 「16.05.03」
```
[作成したコンフィグ]
ip access-list extended Test
 10 remark ***  remark-test  ***
 11 permit ip host 192.168.1.1 host 192.168.1.2
 12 remark ***  Sequence_No test ***
 13 permit ip host 192.168.1.3 host 192.168.1.4
 14 deny ip host 192.168.1.5 host 192.168.1.6

[投入コンフィグ]
10 remark ***  remark-test  ***
   ^
% Invalid input detected at '^' marker.
11 permit ip host 192.168.1.1 host 192.168.1.2
12 remark ***  Sequence_No test ***
   ^
% Invalid input detected at '^' marker.
13 permit ip host 192.168.1.3 host 192.168.1.4
14 deny ip host 192.168.1.5 host 192.168.1.6


```
### パターンA結果: remark文にシーケンス番号を指定して投入することができない
```
#show running-config
ip access-list extended Test
 permit ip host 192.168.1.1 host 192.168.1.2
 permit ip host 192.168.1.3 host 192.168.1.4
 deny   ip host 192.168.1.5 host 192.168.1.6

#show access-list
 Extended IP access list Test
 11 permit ip host 192.168.1.1 host 192.168.1.2
 13 permit ip host 192.168.1.3 host 192.168.1.4
 14 deny ip host 192.168.1.5 host 192.168.1.6
```

### パターンB,C結果: パターンA実行が不可なので、非実施

### パターンD結果: シーケンス番号の重複により、投入不可
```
# 13 deny ip host 192.168.1.3 host 192.168.1.4
 % Duplicate sequence number
 %Failed to add ace to access-list

#show running-config
ip access-list extended Test
 permit ip host 192.168.1.1 host 192.168.1.2
 permit ip host 192.168.1.3 host 192.168.1.4
 deny   ip host 192.168.1.5 host 192.168.1.6

#show access-list
Extended IP access list Test
 11 permit ip host 192.168.1.1 host 192.168.1.2
 13 permit ip host 192.168.1.3 host 192.168.1.4
 14 deny ip host 192.168.1.5 host 192.168.1.6
```

### パターンE結果:permit/deny文であれば行数を指定して削除が可能
```
# no permit ip host 192.168.1.3 host 192.168.1.4

#ip access-list extended Test
 permit ip host 192.168.1.1 host 192.168.1.2
 deny   ip host 192.168.1.5 host 192.168.1.6

#show access-list
 Extended IP access list Test
 11 permit ip host 192.168.1.1 host 192.168.1.2
 14 deny ip host 192.168.1.5 host 192.168.1.6
```

### パターンF結果:permit/deny文であれば行数を指定して元の位置へ再投入が可能
```
# 13 permit ip host 192.168.1.3 host 192.168.1.4

#ip access-list extended Test
 permit ip host 192.168.1.1 host 192.168.1.2
 permit ip host 192.168.1.3 host 192.168.1.4
 deny   ip host 192.168.1.5 host 192.168.1.6

#show access-list
 Extended IP access list Test
 11 permit ip host 192.168.1.1 host 192.168.1.2
 13 permit ip host 192.168.1.3 host 192.168.1.4
 14 deny ip host 192.168.1.5 host 192.168.1.6
```

### 番外編
IOS-XEではASAのようにオブジェクトグループを用いてACLを定義することができる
```
object-group network Test1
 host 1.1.1.1

object-group network Test2 
 host 2.2.2.2

object-group network Test3 
 host 3.3.3.3

object-group network Test4 
 host 4.4.4.4
 
ip access-list extended obj-test
 remark ***  object-test  ***
 permit object-group Test1 object-group Test2
 remark ***  Line No test ***
 permit object-group Test3 object-group Test4
```
上記の場合でオブジェクトの設定を削除する等の場合は以下のようにする
①オブジェクトを使用しているACLを削除する
②オブジェクトを削除する

:::note warn
オブジェクトをACL等に適用したまま削除しようとすると
下記のようなエラーが発生する
```
# no object-group Test1
  Object group(Test1) is in use
```
:::

## ■NXOS
テスト筐体:「C5548UP」
    OS ver:「6.0.2.N1.2」
    OS ver:「7.1.4.N1.1」
    ※各OS共通の結果となり、以下に記載する。
```
[作成したコンフィグ]
ip access-list Test
 10 remark ***  remark-test  ***
 11 permit ip host 192.168.1.1 host 192.168.1.2
 12 remark ***  Sequence_No test ***
 13 permit ip host 192.168.1.3 host 192.168.1.4
 14 deny ip host 192.168.1.5 host 192.168.1.6

[投入コンフィグ]
ip access-list Test
 10 remark ***  remark-test  ***
 11 permit ip host 192.168.1.1 host 192.168.1.2
 12 remark ***  Sequence_No test ***
 13 permit ip host 192.168.1.3 host 192.168.1.4
 14 deny ip host 192.168.1.5 host 192.168.1.6

[出力]
#show running-config
ip access-list Test
 10 remark ***  remark-test  ***
 11 permit ip 192.168.1.1/32 192.168.1.2/32
 12 remark ***  Sequence_No test ***
 13 permit ip 192.168.1.3/32 192.168.1.4/32
 14 deny ip 192.168.1.5/32 192.168.1.6/32

#show access-lists Test
IPV4 ACL Test
 10 remark ***  remark-test  ***
 11 permit ip 192.168.1.1/32 192.168.1.2/32
 12 remark ***  Sequence_No test ***
 13 permit ip 192.168.1.3/32 192.168.1.4/32
 14 deny ip 192.168.1.5/32 192.168.1.6/32
```
### パターンA結果: remark文にシーケンス番号を付与して投入は可能
```
#10 remark ***  remark-test  ***

#show running-config
ip access-list Test
 10 remark ***  remark-test  ***
 11 permit ip 192.168.1.1/32 192.168.1.2/32
 12 remark ***  Sequence_No test ***
 13 permit ip 192.168.1.3/32 192.168.1.4/32
 14 deny ip 192.168.1.5/32 192.168.1.6/32

#show access-lists Test
IPV4 ACL Test
 10 remark ***  remark-test  ***
 11 permit ip 192.168.1.1/32 192.168.1.2/32
 12 remark ***  Sequence_No test ***
 13 permit ip 192.168.1.3/32 192.168.1.4/32
 14 deny ip 192.168.1.5/32 192.168.1.6/32
```

### パターンB結果: remark文をシーケンス番号指定して削除することは可能
```
# no 10 remark ***  remark-test  ***

#show running-config
ip access-list Test
 11 permit ip 192.168.1.1/32 192.168.1.2/32
 12 remark ***  Sequence_No test ***
 13 permit ip 192.168.1.3/32 192.168.1.4/32
 14 deny ip 192.168.1.5/32 192.168.1.6/32

#show access-list 
IPV4 ACL Test
 11 permit ip 192.168.1.1/32 192.168.1.2/32
 12 remark ***  Sequence_No test ***
 13 permit ip 192.168.1.3/32 192.168.1.4/32
 14 deny ip 192.168.1.5/32 192.168.1.6/32
```

### パターンC結果: remark文をシーケンス番号指定して元の位置へ挿入することが可能
```
# 10 remark ***  remark-test  ***

#show running-config
ip access-list Test
 10 remark ***  remark-test  ***
 11 permit ip 192.168.1.1/32 192.168.1.2/32
 12 remark ***  Sequence_No test ***
 13 permit ip 192.168.1.3/32 192.168.1.4/32
 14 deny ip 192.168.1.5/32 192.168.1.6/32

#show access-list Test
IPV4 ACL Test
 10 remark ***  remark-test  ***
 11 permit ip 192.168.1.1/32 192.168.1.2/32
 12 remark ***  Sequence_No test ***
 13 permit ip 192.168.1.3/32 192.168.1.4/32
 14 deny ip 192.168.1.5/32 192.168.1.6/32
```
### パターンD結果:シーケンス番号の重複により、投入不可
```
# 13 deny ip host 192.168.1.3 host 192.168.1.4
  ERROR: Duplicate sequence number

#show running-config
ip access-list Test
 10 remark ***  remark-test  ***
 11 permit ip 192.168.1.1/32 192.168.1.2/32
 12 remark ***  Sequence_No test ***
 13 permit ip 192.168.1.3/32 192.168.1.4/32
 14 deny ip 192.168.1.5/32 192.168.1.6/32

#show access-list
IPV4 ACL Test
 10 remark ***  remark-test  ***
 11 permit ip 192.168.1.1/32 192.168.1.2/32
 12 remark ***  Sequence_No test ***
 13 permit ip 192.168.1.3/32 192.168.1.4/32
 14 deny ip 192.168.1.5/32 192.168.1.6/32
```

## ■ASA
テスト筐体: 「ASA5510」
   OS ver: 「asa917-k8」
```
[作成したコンフィグ]
access-list Test line 10 remark ***  remark-test  ***
access-list Test line 11 extended permit ip host 192.168.1.1 host 192.168.1.2
access-list Test line 12 remark ***  Sequence_No test ***
access-list Test line 13 extended permit ip host 192.168.1.3 host 192.168.1.4
access-list Test line 14 extended deny ip host 192.168.1.5 host 192.168.1.6

[投入したコンフィグ]
access-list Test line 10 remark ***  remark-test  ***
access-list Test line 11 extended permit ip host 192.168.1.1 host 192.168.1.2
access-list Test line 12 remark ***  Sequence_No test ***
access-list Test line 13 permit ip host 192.168.1.3 host 192.168.1.4
access-list Test line 14 extended deny ip host 192.168.1.5 host 192.168.1.6

[出力]
# show running-config
 access-list Test remark ***  remark-test  ***
 access-list Test extended permit ip host 192.168.1.1 host 192.168.1.2
 access-list Test remark ***  Sequence_No test ***
 access-list Test extended permit ip host 192.168.1.3 host 192.168.1.4
 access-list Test extended deny ip host 192.168.1.5 host 192.168.1.6

# show access-list Test
 access-list Test; 3 elements; name hash: 0x173428b0
 access-list Test line 1 remark ***  remark-test  ***
 access-list Test line 2 extended permit ip host 192.168.1.1 host 192.168.1.2 (hitcnt=0) 0x33bf103c
 access-list Test line 3 remark ***  Sequence_No test ***
 access-list Test line 4 extended permit ip host 192.168.1.3 host 192.168.1.4 (hitcnt=0) 0xace9c594
 access-list Test line 5 extended deny ip host 192.168.1.5 host 192.168.1.6 (hitcnt=0) 0x51853e71
```
:::note warn
シーケンス番号を10-14で指定して投入したが、どうやら既存でACLがないとシーケンス番号が1からとなるらしい。
:::

### パターンA結果: remark文にシーケンス番号を付与して投入は可能
```
# access-list Test line 10 remark ***  remark-test  ***

# show running-config
access-list Test remark ***  remark-test  ***
access-list Test extended permit ip host 192.168.1.1 host 192.168.1.2
access-list Test remark ***  Sequence_No test ***
access-list Test extended permit ip host 192.168.1.3 host 192.168.1.4
access-list Test extended deny ip host 192.168.1.5 host 192.168.1.6

# show access-list Test
access-list Test; 3 elements; name hash: 0x173428b0
access-list Test line 1 remark ***  remark-test  ***
access-list Test line 2 extended permit ip host 192.168.1.1 host 192.168.1.2 (hitcnt=0) 0x33bf103c
access-list Test line 3 remark ***  Sequence_No test ***
access-list Test line 4 extended permit ip host 192.168.1.3 host 192.168.1.4 (hitcnt=0) 0xace9c594
access-list Test line 5 extended deny ip host 192.168.1.5 host 192.168.1.6 (hitcnt=0) 0x51853e71
```
### パターンB結果:remark文をシーケンス番号指定して削除することは可能
```
#no access-list Test line 1 remark ***  remark-test  ***

#show running-config
 access-list Test extended permit ip host 192.168.1.1 host 192.168.1.2
 access-list Test remark ***  Sequence_No test ***
 access-list Test extended permit ip host 192.168.1.3 host 192.168.1.4
 access-list Test extended deny ip host 192.168.1.5 host 192.168.1.6

#show access-list Test
 access-list Test; 3 elements; name hash: 0x173428b0
 access-list Test line 1 extended permit ip host 192.168.1.1 host 192.168.1.2 (hitcnt=0) 0x33bf103c
 access-list Test line 2 remark ***  Sequence_No test ***
 access-list Test line 3 extended permit ip host 192.168.1.3 host 192.168.1.4 (hitcnt=0) 0xace9c594
 access-list Test line 4 extended deny ip host 192.168.1.5 host 192.168.1.6 (hitcnt=0) 0x51853e71
```
:::note info
削除後、既存のACLのシーケンス番号が繰り下がる。 line2 → line1となった。
:::

### パターンC結果: remark文をシーケンス番号指定して元の位置へ挿入することが可能
```
# access-list Test line 1 remark ***  remark-test  ***

#show running-config
 access-list Test remark ***  remark-test  ***
 access-list Test extended permit ip host 192.168.1.1 host 192.168.1.2
 access-list Test remark ***  Sequence_No test ***
 access-list Test extended permit ip host 192.168.1.3 host 192.168.1.4
 access-list Test extended deny ip host 192.168.1.5 host 192.168.1.6
#show access-list Test
 access-list Test; 3 elements; name hash: 0x173428b0
 access-list Test line 1 remark ***  remark-test  ***
 access-list Test line 2 extended permit ip host 192.168.1.1 host 192.168.1.2 (hitcnt=0) 0x33bf103c
 access-list Test line 3 remark ***  Sequence_No test ***
 access-list Test line 4 extended permit ip host 192.168.1.3 host 192.168.1.4 (hitcnt=0) 0xace9c594
 access-list Test line 5 extended deny ip host 192.168.1.5 host 192.168.1.6 (hitcnt=0) 0x51853e71
```
:::note info
投入後、既存のACLのシーケンス番号が繰り上がる。 line2 → line3となった。
:::

### パターンD結果:指定したシーケンス番号の行に今回投入したACLが挿入された。
```
# access-list Test line 4 deny ip host 192.168.1.3 host 192.168.1.4

#show running-config
 access-list Test remark ***  remark-test  ***
 access-list Test extended permit ip host 192.168.1.1 host 192.168.1.2
 access-list Test remark ***  Sequence_No test ***
 access-list Test extended deny ip host 192.168.1.3 host 192.168.1.4
 access-list Test extended permit ip host 192.168.1.3 host 192.168.1.4
 access-list Test extended deny ip host 192.168.1.5 host 192.168.1.6

# show access-list Test
 access-list Test; 4 elements; name hash: 0x173428b0
 access-list Test line 1 remark ***  remark-test  ***
 access-list Test line 2 extended permit ip host 192.168.1.1 host 192.168.1.2 (hitcnt=0) 0x33bf103c
 access-list Test line 3 remark ***  Sequence_No test ***
 access-list Test line 4 extended deny ip host 192.168.1.3 host 192.168.1.4 (hitcnt=0) 0x0bfae242
 access-list Test line 5 extended permit ip host 192.168.1.3 host 192.168.1.4 (hitcnt=0) 0xace9c594
 access-list Test line 6 extended deny ip host 192.168.1.5 host 192.168.1.6 (hitcnt=0) 0x51853e71
```
:::note info
パターンCまで line 4 だった「permit ip host 192.168.1.3」 が
line 5 の「permit ip host 192.168.1.3」 に数字が繰り上がった。
:::


# ■まとめ
ASAのACLが一番フレキシブルに設定が可能。

IOS系列はremark文にシーケンス番号を付与できないので
「既存ACLのremark文の内容をリネームする」などという場合はとても苦労をすることになりそうです。

NXOSはremark文にシーケンス番号指定ができるところは良いですが
重複シーケンス番号が弾かれてしまうあたりが残念。
IOSとASA OSのハイブリッドといったところ。