Cisco PIX/ASA の小ネタをいくつか書きます。対象ソフトウエアバージョンは特に断りなければ 6.X、7.X です。
permit のログが出ない?
「access-list コマンドで log オプションをつけたら、 deny されたログは出るんだけれど permit のログが出ないなあ」なんて思った経験はありませんか? access-list の log オプションはレベルを指定しなければ informational (=6) で出力されるので logging コマンドでこれ以上のレベルを指定しなければなりません。
logging buffered informational (内部バッファ用) logging trap informational (SYSLOG 用)
レベルを適切に設定しなければならないのは deny の場合も同じですが、以下のようなところから permit だけログが出ていないように思えてしまうようです。(経験に基づいています)
- access-list コマンドで log オプションをつけていないデフォルトの状態では、deny のログだけ出力される。(ちなみにこの時のメッセージ番号 は 106023 で warnings レベル。log オプションをつけた時はメッセージ番号 106100 で出力されます。)
- 他の理由で deny されたログを見て、permit だけ出ていないように思ってしまう。
ACE (Access Control Entry) をまとめて追加
Cisco の PIX/ASA には PDM やら ADSM やらという GUI がついています。しかし、私の触ったバージョンを見る限りでは access-list (ACL) 編集機能が今一つなので結局これらのツールは使用せず、 ACL はコマンドラインで直しています。コマンドラインで以下のように ACL の途中にまとめて行(ACE)を挿入したいとき何も考えずにそのまままとめてコピー&ペースト等で入力するといくつかの ACE でエラーが起きたとき順番が狂って大変なことになります。この場合一旦エラーが起きた以降の ACE を全部消してから入れ直さなければなりません。エディタで編集してターミナルエミュレータにコピー&ペーストなんてときにありがちですね。
access-list MYLIST line 10 extended permit tcp host 192.168.0.10 any eq telnet access-list MYLIST line 11 extended permit tcp host 192.168.0.11 any eq ssh access-list MYLIST line 12 extended permit tcp host 192.168.0.12 any eq sqlnet
やっている人も多いと思いますが、この時次のように逆順に並べて入力すればエラーが起きたときのダメージを最低限にすることができます。
access-list MYLIST line 10 extended permit tcp host 192.168.0.12 any eq sqlnet access-list MYLIST line 10 extended permit tcp host 192.168.0.11 any eq ssh access-list MYLIST line 10 extended permit tcp host 192.168.0.10 any eq telnet
そこで、まとまった量の ACE をコピー&ペーストするために逆順に並べるのにどうしたら楽か検討したのですが、
perl -e 'print reverse <>;'
っていうのを覚えました。結構 perl の一行ものは重宝しますね。
PIX には全然関係ないですが、以前はシェルスクリプト中で昨日の日付を求めるのに、
perl -e 'use POSIX qw(strftime); print strftime "%Y%m%d\n", localtime(time - 3600*24);'
というのをよく使いました。OS 標準の date コマンドではできないことが多いのでこれも重宝しました。
外側インターフェイスへの ping
マニュアルの記述だとわかりにくいところもありますが、デフォルトでは外側から外のインターフェイスに対して ping をかけると応答があります。これを防ぐには以下のコマンドを入力します。
icmp deny any outside
これで deny されるのはインターフェイスのアドレスに対しての ICMP メッセージのみです。ファイアーウォールの内側に存在するアドレスに対しての ICMP メッセージの制御は access-list コマンドで実行します。