A.BIND9のACL(Access Controll Lists)の癖となります。詳しくは[[https://kb.isc.org/docs/aa-00723|参考文献]]をお読みください。 というのは不親切なので、解説すると、 1. ACLの処理はリストの左から右へ評価されます。これはAND結合であるということを意味しません。 1. よってブール論理で解釈するのではなく、ファーストマッチ・ファーストアウトで解釈する必要があります。 1. 接続元IPアドレスに対して、以下の3つが判断されます。 * match and accept(一致かつ受諾) * match and reject(一致かつ拒絶) * no match(一致しない、なので次のリストに委ねる) 1. これは「!」(reject)と「 」(accept、「!」が指定されてない)のニュアンスが直感的に違うことを意味します(今まで一致・不一致に見えませんでしたか?)。 1. ネスト({・・・})されていた場合、その内容について下記の2つの評価を行い(ここでは一致・不一致の直感とマッチする)、その結果に対して上記3つの判断が実施されます。 * match(一致) * no match(不一致) 1. 当然ネストの中に更にネストできるので、それは上記2評価(match または no match)の繰り返しとなる。 上記ルールを踏まえ、問題のルールを解析すると・・・。 * 大枠は2つのリストに分かれる(「!」の意味に注意)。 1. !{ !IPv4アドレス; !IPv6アドレス; any; } → match and reject 1. key "TSIGキー名." → accept or reject * 最初のネストを分解すると、3つのリストに分かれる。 1. !IPv4アドレス → 一致した場合「no match」という評価で完了 1. !IPv6アドレス → 一致した場合「no match」という評価で完了 1. any → 一致(常に一致する)した場合「match」という評価で完了 上記をまとめて解釈すると、 * 最初のネスト内では以下の評価を行う(「!」の評価に注意)。 1. 「IPv4アドレス『ではない』」の評価をする。 * 指定された「IPv4アドレス」であれば「no match」として評価完了。 * そうでないなら「match」として次の評価。 1. 「IPv6アドレス『ではない』」の評価をする。 * 指定された「IPv6アドレス」であれば「no match」として評価完了。 * そうでないなら「match」として次の評価。 1. 「any」(任意の全てのアドレス)に・・・とここまで来ると常に match と解釈され、評価が終了する。 1. また any の時点で既に、「match」評価されてるので、この場合の「any」の指定のあり/無しに意味はない * ※人間の直感には反するから入れておいた方がいい。 * このネストでの結果を全体「!」=match and reject で評価することから、「no match」(つまり次のリストの評価)の時は、次のリスト key が評価される。