ACL(アクセス制御リスト)とは

ACL(Access Control List)は、送信元・宛先アドレスやプロトコル・ポート番号といった条件をもとに、ルータを通過するパケットを許可(permit)または拒否(deny)する仕組みです。ACLは1つ以上のエントリ(ACE:Access Control Entry)の集まりで構成され、パケットはエントリの並び順に上から順番に照合され、最初に一致したエントリの動作(許可/拒否)が適用されます。どのエントリにも一致しなかった場合、ACLの末尾には暗黙のdeny(implicit deny)が存在し、そのパケットは自動的に拒否されます。

ワイルドカードマスク

ACLで対象となるアドレス範囲を指定する際には、サブネットマスクではなくワイルドカードマスクを使います。ワイルドカードマスクは、ビットが0の部分を「一致させる(照合する)」、1の部分を「無視する(どの値でもよい)」という意味で使われ、通常のサブネットマスクとはビットの意味が逆になります。

ワイルドカードマスク意味
0.0.0.0特定の1台のホストのみに一致(hostキーワードと同義)
0.0.0.255該当ネットワークの/24(256アドレス)全体に一致
0.0.255.255該当ネットワークの/16全体に一致
255.255.255.255すべてのアドレスに一致(anyキーワードと同義)

ワイルドカードマスクは、対象とするサブネットマスクの各オクテットを255から引くことで求められます。例えば、/24(255.255.255.0)に対応するワイルドカードマスクは、255.255.255.0を各オクテットごとに255から引いた0.0.0.255になります。

標準ACLと拡張ACL

Cisco IOSのACLには、大きく分けて標準ACLと拡張ACLの2種類があります。

標準ACL(Standard ACL)

標準ACLは、送信元アドレスのみを照合条件とする、シンプルなACLです。番号付きACLの場合、1〜99・1300〜1999の番号を使います。

Router(config)# access-list 10 permit host 192.168.10.5
Router(config)# access-list 10 permit 192.168.20.0 0.0.0.255
Router(config)# access-list 10 deny any

送信元アドレスのみで判断するため、標準ACLは、フィルタしたい宛先にできるだけ近い場所に適用するのが基本原則です。宛先の近くに置かないと、本来その宛先以外にも届くはずの通信まで、意図せず途中で遮断してしまう可能性があるためです。

拡張ACL(Extended ACL)

拡張ACLは、送信元アドレスに加えて、宛先アドレス・プロトコル(TCP/UDP/ICMP等)・ポート番号まで指定できる、より詳細な条件を扱えるACLです。番号付きACLの場合、100〜199・2000〜2699の番号を使います。

Router(config)# access-list 110 permit tcp 192.168.10.0 0.0.0.255 host 10.1.1.100 eq 443
Router(config)# access-list 110 permit icmp any any echo-reply
Router(config)# access-list 110 deny ip any any

拡張ACLは、送信元・宛先の両方を条件にできるため、標準ACLとは逆に、フィルタしたい送信元にできるだけ近い場所に適用するのが基本原則です。不要なトラフィックを、ネットワークの奥まで転送する前に、発生源の近くで早めに遮断できます。

名前付きACL(Named ACL)

番号の代わりに、分かりやすい名前を付けてACLを作成することもできます。名前付きACLは、後から特定の行だけを削除できるなど、番号付きACLより編集がしやすいという利点があります。

Router(config)# ip access-list standard MGMT-ACCESS
Router(config-std-nacl)# 10 permit host 192.168.10.5
Router(config-std-nacl)# 20 permit 192.168.20.0 0.0.0.255
Router(config-std-nacl)# 30 deny any

Router(config)# ip access-list extended WEB-FILTER
Router(config-ext-nacl)# permit tcp any host 10.1.1.100 eq 443
Router(config-ext-nacl)# deny ip any any

ACLをインターフェースに適用する

ACLは作成しただけでは効果を持ちません。インターフェースに、方向(in/out)を指定して適用して、初めて機能します。

Router(config)# interface GigabitEthernet0/1
Router(config-if)# ip access-group 110 in
  • in:そのインターフェースに入ってくるパケットを評価します。
  • out:そのインターフェースから出ていくパケットを評価します。

なお、VTY回線(リモートアクセス用の仮想端末)にACLを適用する場合は、ip access-groupではなくaccess-classコマンドを使います。

Router(config)# line vty 0 4
Router(config-line)# access-class 10 in

設定の確認

show access-lists

作成したACLの内容と、各エントリに何回一致したか(マッチ数)を確認できます。

Router# show access-lists

Standard IP access list 10
    10 permit 192.168.10.5
    20 permit 192.168.20.0, wildcard bits 0.0.0.255 (5 matches)
    30 deny   any (2 matches)

Extended IP access list 110
    10 permit tcp 192.168.10.0 0.0.0.255 host 10.1.1.100 eq 443 (120 matches)
    20 permit icmp any any echo-reply
    30 deny ip any any (8 matches)

各エントリの先頭に表示される10・20・30という数字は、シーケンス番号で、エントリの並び順(照合される順序)を表します。matchesが付いている行は、実際にその条件に一致したパケットが存在したことを示します。

名前付きACLでは、このシーケンス番号を使って、既存のACLの途中に新しいエントリを挿入したり、特定の1行だけを削除したりできます。Cisco IOSのバージョンによっては番号付きACLでも同様の編集が可能ですが、対応状況や操作方法は異なります。例えば、上記の名前付き標準ACL(10 permit・20 permit・30 deny)に対して、10番と20番の間に新しい許可エントリを追加し、20番のエントリだけを削除するには、次のように設定します。

Router(config)# ip access-list standard MGMT-ACCESS
Router(config-std-nacl)# 15 permit 192.168.15.0 0.0.0.255
Router(config-std-nacl)# no 20

15のように未使用のシーケンス番号を指定して新しいACEを入力すると、そのACEは既存の10番と20番の間に挿入され、他のエントリの並び順には影響しません。また、no 20のようにシーケンス番号だけを指定してnoを実行すると、その番号のエントリ1行だけが削除されます。番号付きACLでも、Cisco IOSのバージョンによっては途中の1行だけを削除・挿入できますが、古いIOSではACL全体を削除して作り直す必要がある場合があります。この点でも、名前付きACLは編集しやすい形式です。

show ip interface

特定のインターフェースに、どのACLがどの方向で適用されているかを確認できます。

Router# show ip interface GigabitEthernet0/1

GigabitEthernet0/1 is up, line protocol is up
  Internet address is 10.1.1.1/24
  Outgoing access list is not set
  Inbound  access list is 110

Inbound access list is 110という表示から、このインターフェースの受信方向(in)に、ACL番号110(拡張ACL)が適用されていることが分かります。