アクセスリストを設定する上での注意点

ここまでアクセスリストについて解説してきましたが、ここでアクセスリストを設定する上で注意しなければいけない点を書いておきましょう。

定義したアクセスリストをチェックする順番

Ciscoルータは、アクセスリストのチェックを上から順番にチェックして、条件に合った時点でチェックを終了するという動作を行います。

例えば、以下のような拡張アクセスリストを上から順番に設定したとしましょう。

Router(config)#access-list 100 deny ip 192.168.0.0 0.0.255.255 any
Router(config)#access-list 100 permit ip host 192.168.1.1 any
Router(config)#access-list 100 deny ip any host 192.168.17.1
Router(config)#access-list 100 permit ip any any

ここで、192.168.1.1 のホストから通信があった場合、アクセスリストは上からチェックしていきます。

すると最初の定義に合致しますよね。そのため2行目のアクセスリストで本来は通信を許可したいのにもかかわらず、破棄してしまいます。

この動作をしっかりと意識して設定をしないと、通るはずのパケットが通らないことにもなりかねません。

では、どの順番にすればよいのでしょうか?
今回の例だと 1 行目と 2 行目を入れ替えれば問題無さそうです。

Router(config)#access-list 100 permit ip host 192.168.1.1 any
Router(config)#access-list 100 deny ip 192.168.0.0 0.0.255.255 any
Router(config)#access-list 100 deny ip any host 192.168.17.1
Router(config)#access-list 100 permit ip any any

アクセスリストのチェックは、当然全てのパケットに対して行いますから、出来るだけ合致するパケットが多い定義を上にしたほうがルータの処理を軽減することができます。

実際の運用ではもっとたくさんの定義を設定していることもあるでしょう。

そんな時にこそ、「アクセスリストは上から順番にチェックしていく」という基本動作を頭に入れて運用することが大切なんですね。

ちなみに、拡張アクセスリストの場合は、アクセスリストを追加した順番に末尾に組み込まれていきますが、標準アクセスリストの場合、host指定したものから先頭にくるように順序を書き換える仕様になっています。

例えば、以下のような順番で標準アクセスリストを設定した場合、

Router(config)#access-list 1 permit host 192.168.1.1
Router(config)#access-list 1 deny 192.168.1.0 0.0.0.255
Router(config)#access-list 1 deny host 10.1.1.1
Router(config)#access-list 1 permit host 172.16.1.1
Router(config)#access-list 1 permit any
Router(config)#exit

と設定した場合でも、host指定したものから先頭に書き換えられます。

Router#show access-lists
Standard IP access list 1
    deny   10.1.1.1
    deny   172.16.1.1
    permit 192.168.1.1
    deny   192.168.1.0, wildcard bits 0.0.0.255
    permit any
Router#

暗黙の拒否

以下のアクセスリストを見てください。

Router(config)#access-list 1 permit host 192.168.1.1
Router(config)#access-list 1 deny 192.168.0.0 0.0.255.255
Router(config)#access-list 1 deny host 10.1.1.1

このアクセスリストで、172.16.1.1 というホストからアクセスがあった場合どうなると思いますか?

アクセスリストは上から順番にチェックしていきますが、送信元IPアドレス 172.16.1.1 は、どの条件にも合いません。
この場合はどうなるのでしょうか?

すべての条件に合わない場合、アクセスリストはそのパケットを拒否してしまいます。
つまり今回の例ですと、172.16.1.1 のパケットは拒否されて通信できないわけですね。

この動作のことを「暗黙のdeny」と呼んでいます。

そこで定義したもの以外のパケットをすべて許可したい場合は、必ず最後にすべてを許可する定義を設定しなければいけません。

Router(config)#access-list 1 permit host 192.168.1.1
Router(config)#access-list 1 deny 192.168.0.0 0.0.255.255
Router(config)#access-list 1 deny host 10.1.1.1
Router(config)#access-list 1 permit any

アクセスリストの追加と削除

もう1つアクセスリストについて、ネットワーク運用者が知っておかなければいけない大事な注意点があります。

例えば、下記の定義を設定したあるルータに、

Router(config)#access-list 1 permit host 192.168.1.1
Router(config)#access-list 1 deny 192.168.0.0 0.0.255.255
Router(config)#access-list 1 deny host 10.1.1.1
Router(config)#access-list 1 permit any

172.16.1.1 のホストを拒否する設定を追加したいとしましょう。

ここで、単純に以下の定義を設定すれば良いのでは?と考えた方は残念ながらハズレです。

Router(config)#access-list 1 deny host 172.16.1.1

実際に設定を確認して見ましょう。

access-list 1 permit host 192.168.1.1
access-list 1 deny 192.168.0.0 0.0.255.255
access-list 1 deny host 10.1.1.1
access-list 1 permit any
access-list 1 deny host 172.16.1.1

以上のように追加した設定は、既存の設定の下に設定されてしまいます。

そうすると、4行目の定義「access-list 1 permit any」で、すべてのパケットを許可していますから、最後の定義はまったくもって意味がありません。

つまりアクセスリストの定義は既存の定義の途中に入れることが出来ません。

また既存の設定の1行だけ削除したいという場合もあるでしょう。実はこれも出来ません。

access-list コマンドを削除する場合は、頭に no を付けることで削除することは出来るんですが…

Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.

Router(config)#no access-list 1 [リターン]
Router(config)#exit

設定を確認してみると…

Router#sh run
Building configuration...

Current configuration : 815 bytes

version 15.1
service timestamps debug datetime msec
service timestamps log datetime msec
service password-encryption
!

~ 省略 ~
!
end

すべて定義が消えてしまいます。
つまり定義を 1 行削除したいときでも、もう一度すべての定義を設定しないといけません。

さらに厄介なのが、no access-list コマンドで定義を消しても、インタフェースに適用した ip access-group コマンドは削除されない点です。

定義がなくて ip access-group だけ残っている場合ってどうなると思いますか?

アクセスリストには暗黙のDenyという考え方があるので、すべて拒否されてしまうと思えるかもしれませんが、実はその逆で全てのパケットを許可してしまいます。

覚えておいてください。

このように、アクセスリストの運用はとても不便です。
その不便を解消する方法が次に解説する「名前付きアクセスリスト」です。

名前付きアクセスリスト

access-list コマンドで定義を設定したら、特定の定義だけを削除することはできないという問題を解決するには、「名前付きアクセスリスト」を利用する必要があります。

今までのアクセスリストとの主な違いは以下の通り。

  • アクセスリスト番号を使う代わりに、英数字を使った名前で指定することができる。
  • アクセスリストを定義した後に、特定の定義だけ削除することが可能

名前付きアクセスリストのコマンド

名前付きアクセスリストの使用方法は、まずアクセスリストの種類と名前を定義します。

アクセスリストの種類と名前を定義

Router(config)#access-list [standard | extended] [アクセスリスト名]

「standard」を指定すると、標準アクセスリストを、「extended」だと拡張アクセスリストを意味します。アクセスリスト名は、任意の文字列を入力します。

続いてフィルタリングの定義を以下のコマンドを使用して設定していきます。

フィルタリングの定義設定

Router(config [std- | ext-]nacl)\#[permit | deny] [条件]

最後にインタフェースに定義を適用します。

インタフェースに定義を適用

Router(config-if)#ip access-group [アクセスリスト名] [in | out]

名前付きアクセスリストの設定例

例として下図のように、インターネットから192.168.17.1 のHTTPアクセスのみを許可する名前付き拡張アクセスリストを作成してみましょう。
アクセスリスト名は「WWW-Filter」とします。

コマンド実行結果

Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.

Router(config)#ip access-list extended WWW-Filter
Router(config-ext-nacl)#permit tcp any host 192.168.17.1 eq 80
Router(config-ext-nacl)#deny ip any any
Router(config)#exit
Router(config)#interface ethernet 0
Router(config-if)#ip access-group WWW-Filter in
Router(config-if)#end

特定の定義だけ削除

名前付きアクセスリストの特徴は、特定の定義だけを削除できるという点です。

Router(config)#ip access-list extended TEST-Filter
Router(config-ext-nacl)#permit tcp any host 192.168.17.1 eq 80
Router(config-ext-nacl)#permit tcp any host 192.168.17.2 eq 23
Router(config-ext-nacl)#permit tcp any host 192.168.17.3 eq 53
Router(config-ext-nacl)#deny ip any any

上記の定義を設定した後に、

permit tcp any host 192.168.17.2 eq 23

の定義のみ削除する場合の削除例をみてみましょう。

コマンド実行結果

Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.

Router(config)#ip access-list extended TEST-Filter
Router(config-ext-nacl)#no permit tcp any host 192.168.17.2 eq 23
Router(config)#exit

このように削除したい定義の先頭に「no」を付けることで、その定義のみを削除することが可能です。

ルータへのTelnet制限

ここまでは、ルータに入ってくるパケットや、出ていくパケットに対して許可・拒否を指定する設定を解説してきました。

最後にルータへのアクセスの制限を行う設定を解説しておきましょう。

ルータにアクセスできるアドレスやネットワークを制限することで、セキュリティを高めることが出来ます。

例として 192.168.1.1 のホストからのみ、Telnet 許可する設定をしてみましょう。

コマンド実行結果

Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.

Router(config)#access-list 10 permit host 192.168.1.1
Router(config)#line vty 0 4
Router(config-line)#access-class 10 in

以上のように、Vty インタフェースに適用することで、Telnet の制限をアクセスリストで行うことが可能です。

この時のコマンドは、「ip access-group」ではなくて、「access-class」というコマンドを使用しますので注意しましょう。

また、「access-class」コマンドの「in | out」は以下のような意味になりますので合わせて覚えておくとよいでしょう。

  • in
    指定した発信元アドレスからの接続のみ許可(禁止)する。
  • out
    指定した送信先アドレスへの接続のみ許可(禁止)する。

インタフェースへの適用はインバウンドとアウトバウンドのどちらがよいか?

標準アクセスリストなら、宛先アドレスに近いインタフェースに、拡張アクセスリストなら、送信元アドレスに近いインタフェースに設定する方が良いというのが一般的な考え方です。
(もちろん構成やポリシーによって変わってきますので、あくまで一般的な考え方です。)

標準アクセスリストは、送信元アドレスしか指定できません。
そのため送信元の近くに適用すると、すべての宛先が拒否or許可される可能性があるためです。

拡張アクセスリストの場合は、宛先、送信元、プロトコルといった細かい指定が可能なので、送信元アドレスにちかいところで適用してあげるのが良いといわれています。

関連記事

メールマガジン

ネットワ-ク初心者のみなさま。
ネットワークの基礎知識を疎かにすることは
大変危険です!!

「初心者にも理解できるネットワーク技術」

これを読めばネットワークの基礎が分かる!!
ネットワーク関連の仕事に就きたいとお考えの学生の方や、ネットワークに興味があって転職を考えている社会人の方、まずは登録してみてください。

もちろん無料です!!

↓メールマガジン購読はこちら↓

メールアドレス: