リフレクシブ(Reflexive)ACLとは

リフレクシブ(Reflexive)ACLとは、許可した行きの通信に対して戻りの通信を自動的に許可するACLです。Cisco IOSで設定できる簡易的なSPI(Stateful Packet Inspection)機能です。

「ネットワークのおべんきょしませんか?」Webサイトで、しつこいぐらい繰り返し繰り返し述べていますが、「通信は双方向」ということをきちんと考えることがとても重要です。パケットフィルタリングのときには、ますます「通信は双方向」ということを意識しなければいけません。何らかの通信を許可するときには、行きと戻りの両方を許可しなければいけません。そして、できれば「行きの通信に対応する戻りだけ」を許可したほうがいいです。これを簡単に実現するための設定がリフレクシブACLです。

プライベートネットワークをインターネットに接続するとき

プライベートネットワークをインターネットに接続するときには、主に以下のようなパケットフィルタリングを行います。

  • インターネットからプライベートネットワークへの行きの通信はすべてブロック
  • プライベートネットワークからインターネット宛ての行きの通信を許可。その戻りのインターネットからプライベートネットワーク宛ての通信も許可

リフレクシブACLの設定によって、2点目のパケットフィルタリングを簡単に設定できまます。リフレクシブACLにより、許可した行きの通信の戻り通信「だけ」を自動的に許可するACLの条件が作成されます。リフレクシブは英単語の「reflexive」を単にカタカナ表記しています。reflexiveとは「反射的な」という意味で、行きの通信が反射して戻りの通信になっているイメージです。

図  プライベートネットワークをインターネットに接続するときのパケットフィルタリング
図 プライベートネットワークをインターネットに接続するときのパケットフィルタリング

リフレクシブACLの設定と確認コマンド

リフレクシブACLの設定の流れは以下のようになります。

  1. プライベートネットワークからインターネット宛ての通信についての条件を作成する
  2. インターネットからプライベートネットワーク宛ての通信についての条件を作成する
  3. インターネット側のインタフェースに上記2つの条件を適用する

リフレクシブACLの設定コマンド

リフレクシブACLを設定するときには、行きと戻りの通信についての名前付き拡張アクセスリストを作成します。行きの通信についてのアクセスリストの条件で、プライベートネットワークからインターネット宛てに許可する通信がどんなものかを決めます。そのときに戻りの通信だけを自動的に許可する条件を作成するようにします。自動的に作成される戻りの通信を許可する条件が狭義のリフレクシブACLです。

プライベートネットワークからインターネット宛ての通信の条件として、話を簡単にするために、ここではすべて許可する設定のみを解説します。つまり、プライベートネットワークからインターネット宛ての通信については特に制限を設けない場合についてです。グローバルコンフィグレーションモードで次のコマンドを入力します。

行きの通信のACL(config)#ip access-list extended <ACL-name1>
(config-ext-acl)#permit ip any any reflect <ref-acl-name>

<ACL-name1> : 行きの通信についての条件のACL名
<ref-acl-name> : リフレクシブACL名

reflect <ref-acl-name>は、permitした通信の戻りを許可するリフレクシブACLの条件を<ref-acl-name>という名前で作成するという意味です。

インターネット宛ての通信を無制限に許可するのは、セキュリティ上はあまり望ましくありません。実際には、許可すべきインターネット宛ての通信を考えて、その通信のみを許可してください。

戻りの通信についてのアクセスリストの条件の中で、自動的に作成されたリフレクシブACLを評価するように設定します。グローバルコンフィグレーションで次のコマンドを入力します。

戻りの通信のACL(config)#ip access-list extended <ACL-name2>
(config-ext-nacl)#evaluate <ref-acl-name>
(config-ext-nacl)#deny ip any any

<ACL-name2> : 戻りの通信についての条件のACL名
<ref-acl-name> : 行きの通信についての条件で指定したリフレクシブACL名

evaluate <ref-acl-name>で、自動的に作成されたリフレクシブACL(<ref-acl-name>)の条件をチェックするという意味です。戻りの通信の条件について、最後に明示的な拒否の条件を入れています。暗黙の拒否の条件があるので、明示的なdenyの条件はなくてもいいのですが、わかりやすくするためです。

インターネットから他に許可すべき通信があれば、deny ip any anyの前に設定してください。

そして、インターネット側のインタフェースに行きと戻りの拡張アクセスリストを適用します。インタフェースコンフィグレーションモードで次のコマンドを入力します。

ACLをインタフェースに適用(config)#interface <interface-name>
(config-if)#ip access-group <ACL-name1> out
(config-if)#ip access-group <ACL-name2> in

<interface-name> : インターネット側のインタフェース名
<ACL-name1> : 行きの通信についての条件のACL名
<ACL-name2> : 戻りの通信についての条件のACL名

行きの通信についての条件は「out」で適用して、戻りの通信についての条件は「in」で適用します。

必ずしもインターネット側のインタフェースにinとoutで適用しなければいけないわけではありません。

リフレクシブACLの確認コマンド

リフレクシブACLの設定を確認するために主に利用するコマンドを以下の表にまとめています。

showコマンド表示内容
#show ip access-list通信を許可または拒否するアクセスリストの条件を表示します。
#show ip interfaceインタフェースに適用されているアクセスリストの条件を表示します。
表 リフレクシブACLの主な確認コマンド

show ip access-list

show ip access-listコマンドで、設定したアクセスリストの条件を表示します。通信を許可または拒否している条件が正しいことを確認します。また、自動的に作成されるリフレクシブACLの条件もわかります。

R1#show ip access-lists
Extended IP access list FROM_INET
    10 evaluate REF
    20 deny ip any any
Reflexive IP access list REF
     permit icmp host 100.100.100.100 host 100.0.0.1  (16 matches) (time left 257)
Extended IP access list TO_INET
    10 permit ip any any reflect REF (9 matches)

show ip interface

show ip interfaceコマンドの真ん中あたりに、そのインタフェースに適用されているアクセスリストが表示されます。正しい方向で正しいアクセスリストが適用されていることを確認します。

R1#show ip interface FastEthernet 0/1
FastEthernet0/1 is up, line protocol is up
  Internet address is 100.0.0.1/24
  Broadcast address is 255.255.255.255
  Address determined by non-volatile memory
  MTU is 1500 bytes
  Helper address is not set
  Directed broadcast forwarding is disabled
  Outgoing access list is TO_INET
  Inbound  access list is FROM_INET
~省略~