スターウォーズと VRF

togetter で面白いネタを見つけたのですが、まとめられているコメントに微妙なものもあるので、技術的なところを簡単にメモ書きしておきます。 そのネタとは、ある IP アドレス (216.81.59.173) に traceroute をかけると Star Wars のオープニングのテキストスクロール (のパロディ?) が表示されるというものです。 実際に traceroute をかけた時の動画が YouTube にアップロードされていて、技術的な内容はこちらにまとめられています。 なお、有名になったため、(DDoS のものも含め) 大量のトラフィックを受けてしまったようで今も試せるかはわかりません。 少なくとも私の ISP からでは現在到達できないようです。

さて、実際にどうやってこれを実現しているかというと構成要素は二つあって、まず一つは DNS の逆引きを利用しているわけです。 これは 251.214.206.in-addr.arpa ゾーン内の対応する各レコードに表示する内容 (ホスト名) を書いておけばよいわけで、さして難しいことはありません。 以下のような内容が書かれているのでしょう。

1 IN PTR Episode.IV.
6 IN PTR A.NEW.HOPE.
9 IN PTR It.is.a.period.of.civil.war.

もう、一つの構成要素は 251.214.206.0/24 のネットワーク構成になります。 論理的に細かく分けて多くのゲートウェイを通過するようにしなければならないので、DNS レコードの登録よりもこちらの方が面倒くさいと思います。 何も考えずに構成を組むと大量のルータが必要となりそうですが、そこで利用されるのが Cisco ルーターの VRF という機能です。

VRF は簡単に言うと複数のルーティングテーブルを持つ機能です (Cisco の設定例)。 今回は多数の VLAN を作成し、VRF を用いて各 VLAN 固有のルーティングテーブルを設定することで、実際には 2台のルータ間を行き来するだけで多数のゲートウェイを通過するように設定したようです。 先に紹介したページの PHP スクリプトを実行すると 2台分のルータの設定が生成されますが、これを見ると /30 を割り当てた VLAN を 2台のルータに多数作って 216.81.59.173 宛のパケットを 2台の間で行ったりきたりするようになっています。 ですので、見た目よりはずっと簡単な物理構成で実現されています。

こういった遊び心と技術センスは真似してみたいところですね。

ntp clock-period を手動設定したくなる時

ある Cisco 機器 (router1:192.168.1.1) に上位 NTP サーバ (ts:10.10.10.1) を参照するよう NTP の設定を入れ、さらにその機器を参照するよう別の機器 (router2) にしたところ、うまく router2 が router1 に同期しないという事象がありました。 ネットワーク構成上の理由で router2 は直接 ts を参照できないので、代わりに router1 に同期させなければならないという状況でした。

[router1 NTP 関連設定]
ntp update-calendar
ntp server 10.10.10.1
[router2 NTP 関連設定]
ntp update-calendar
ntp server 192.168.1.1

以下のような階層になります。

[router2] ----> [router1 (192.168.1.1)] ----> [ts (10.10.10.1)] ----> 更に上位の NTP サーバ

さて、設定投入後1週間程度経過してみても router2 はこんな状況でした。 router1 に同期しません。

router2#show ntp associations
Load for five secs: 0%/0%; one minute: 1%; five minutes: 0%
Time source is NTP, .11:47:41.679 JST Mon Aug 16 2010
address         ref clock     st  when  poll reach  delay  offset    disp
~192.168.1.1      10.10.10.1        4   297  1024  377    80.8  -63873  3115.8
* master (synced), # master (unsynced), + selected, - candidate, ~ configured
router2#

本来なら 192.168.1.1 の行頭に「*」がついて、マスターとして router1 が選ばれ同期されなければならないのですが、そうならなかったのです。 ここで root disp (dispersion) が 1000 を超えていると同期しないという情報を見つけました。 router2 で確認すると下のように root disp の値が 1000 を超えています。

router2#show ntp associations detail
Load for five secs: 0%/0%; one minute: 1%; five minutes: 0%
Time source is NTP, .11:47:43.799 JST Mon Aug 16 2010
192.168.1.1 configured, insane, invalid, stratum 4
ref ID 10.10.10.1, time D013219E.E1C6AC50 (11:31:58.881 JST Mon Aug 16 2010)
our mode client, peer mode server, our poll intvl 1024, peer poll intvl 1024
root delay 36.30 msec, root disp 8131.24, reach 377, sync dist 11305.618
delay 80.78 msec, offset -638738.7960 msec, dispersion 3115.84
precision 2**18, version 3
org time D01321A4.D66F1EE6 (11:32:04.837 JST Mon Aug 16 2010)
rcv time D0132423.9DE81031 (11:42:43.616 JST Mon Aug 16 2010)
xmt time D0132423.89392A69 (11:42:43.536 JST Mon Aug 16 2010)
filtdelay =    80.78   82.21   81.04   75.70   82.34   81.18   82.69   82.00
filtoffset = -638738 -637128 -635511 -633898 -632285 -630629 -628951 -627338
filterror =     0.02   15.67   31.31   46.97   62.62   78.26   93.92  109.56
router2#

root dispersion とは分散値で、要するに router1 の時刻に揺れがあるので同期しないということのようです。 router1 を見てみるとこんな状況でした。

router1#show ntp associations
Load for five secs: 18%/9%; one minute: 2%; five minutes: 1%
Time source is NTP, 11:36:01.890 JST Mon Aug 16 2010
address         ref clock     st  when  poll reach  delay  offset    disp
*~10.10.10.1       11.22.33.44       3    50    64   37     1.0  -461.4  1042.4
* master (synced), # master (unsynced), + selected, - candidate, ~ configured
router1#show ntp associations detail
Load for five secs: 18%/9%; one minute: 2%; five minutes: 1%
Time source is NTP, 11:36:04.959 JST Mon Aug 16 2010
10.10.10.1 configured, our_master, sane, valid, stratum 3
ref ID 11.22.33.44, time D01321B6.77DBD9B0 (11:32:22.468 JST Mon Aug 16 2010)
our mode client, peer mode server, our poll intvl 64, peer poll intvl 64
root delay 35.32 msec, root disp 94.80, reach 37, sync dist 1155.380
delay 0.98 msec, offset -461.4556 msec, dispersion 1042.43
precision 2**6, version 3
org time D013225E.BBF46D24 (11:35:10.734 JST Mon Aug 16 2010)
rcv time D013225F.32366574 (11:35:11.196 JST Mon Aug 16 2010)
xmt time D013225F.31F65E57 (11:35:11.195 JST Mon Aug 16 2010)
filtdelay =     0.98    0.95    0.99    0.98    0.96    0.00    0.00    0.00
filtoffset = -461.46 -355.70 -250.50 -144.79 -105.69    0.00    0.00    0.00
filterror =     0.02    0.99    1.98    2.96    3.94 16000.0 16000.0 16000.0
router1#

offset は参照する NTP サーバとの差を表すのですが、64 秒間隔のポーリングの度に 105ms ずつ進んでいることがわかります。 様子を見ているとこのまま差が大きくなり offset が 1500ms 程度になるとリセットがかかって同期を取り直しているように見えました。 リセットされた後はまたこの出力の様に filtdelay が 0 となります。

つまり router1 自体は上位のサーバをマスターとして同期していて、数ms ~ 1秒強の間を揺れ動いているようです。 そこで思い切って clock-period を変えることにしました。 clock-period の値は本来手動設定すべきでなく、マニュアルにもそのように記されています。 しかし、設定後1週間程度経っても自動調整がうまく働いていないようなので手動設定を試すことにしたのです。

まずは現在の clock-period の値を確認します。

router1#show running-config | include clock-period
ntp clock-period 17208028

設定すべき clock-period の値を n とすると以下の式がなりたちます。 (clock-period の詳細はこちらの記事を参照)

17208028 * (64 - 0.105) 秒 = n * 64 秒

これより n の値を求めます。

n = 17208028 * 63.895 / 64 ≒ 17179796

この値を設定します。

router1(config)#ntp clock-period 17179796

結果を言うと、結局これがうまく効いて、その後 router1 は安定動作し、router2 も router1 に同期するようになりました。以下はしばらく経過してからの出力です。

router1#show ntp associations detail
Load for five secs: 0%/0%; one minute: 1%; five minutes: 1%
Time source is NTP, 15:10:48.679 JST Tue Aug 31 2010
10.10.10.1 configured, our_master, sane, valid, stratum 3
ref ID 11.22.33.44, time D0271AD1.69C39368 (15:08:17.413 JST Tue Aug 31 2010)
our mode client, peer mode server, our poll intvl 64, peer poll intvl 64
root delay 33.89 msec, root disp 80.25, reach 377, sync dist 99.716
delay 0.84 msec, offset -4.5950 msec, dispersion 2.11
precision 2**6, version 3
org time D0271B37.29C39368 (15:09:59.163 JST Tue Aug 31 2010)
rcv time D0271B37.2B0C8C76 (15:09:59.168 JST Tue Aug 31 2010)
xmt time D0271B37.2AD4E20B (15:09:59.167 JST Tue Aug 31 2010)
filtdelay =     0.84    1.40    0.93    0.89    0.95    0.92   20.42    0.93
filtoffset =   -4.60   -3.95   -2.50   -1.04    0.62    3.08   -3.37    9.44
filterror =     0.02    0.99    1.97    2.94    3.92    4.90    5.87    6.85
router1#

このように router1 はぐっと安定しました。 router2 についても確認すると以下の出力が得られました。

router2#show ntp associations
address         ref clock     st  when  poll reach  delay  offset    disp
*~192.168.1.1      10.10.10.1        4    16  1024  377    11.2   -1.12     2.0
* master (synced), # master (unsynced), + selected, - candidate, ~ configured
router2#

「*」がついていることからわかるように、router2 はきちんと router1 をマスターとして選択し同期しています。

今回はルータを NTP サーバとして参照する構成としたのでこの現象に気づきましたが、ただ上位の外部 NTP サーバを参照するだけだったら気づかなかったと思います。 気になる場合は「show ntp associations detail」を実行して offset の変化を確認すると良いです。 12.4(15)T12 以下の複数のバージョン、複数の機器でこの現象の発生を確認しています。

コマンドの利用は自己責任でお願いします。 ルータのコマンド出力は実際のログ出力を説明のために再構成したもので、表示項目に関して完全には整合性が取れていない可能性があります。

Cisco IOS の NTP 機能

Cisco IOS の NTP 関連の情報をまとめます。 といっても自分が気になったところだけですが。

最低限の設定

実環境では通常 NTP サーバが用意されていると思います。 そのサーバを参照して同期を取るためには ntp server コマンドを設定します。

ntp server 10.10.10.1

ntp server コマンドで複数のサーバを設定する程度で十分な環境も多いと思います。

ntp server コマンドを入れるとその Cisco 機器自身も NTP サーバとして動作し始めます。 従って他の NTP クライアントがその機器を NTP サーバとして参照することが可能となります。 敢えてこれを防ぐ場合は ntp access-group コマンドでアクセス制御を行う必要があります。

ntp master コマンドが必要な時

ntp master コマンドはタイムソースとして自身のハードウェアクロックを参照するためのコマンドです。 このコマンドを正しく使うためには、機器はハードウェアクロック (いわゆる内部時計) とソフトウェアクロックの2つを持っているということをまず理解しなければなりません。 これら2つは別物で時刻に差が生じることもあり得ます。

通常ハードウェアクロックが参照されるのは OS の起動時のみで、あとはソフトウェアクロックによって時間が刻まれます (clock read-calendar とか calendar set のようなハードウェアクロック関連コマンドもありますが)。 ログなどの時刻表示には全てソフトウェアクロックの値が使われます。 ntp 関連コマンドはソフトウェアクロックを指定したタイムソースに同期させるためのものです。

ntp master コマンドが設定されるとハードウェアクロックをタイムソースとして参照して、ソフトウェアクロックを調整するようになります。 先に書いた通り、ntp server コマンドを入れれば上位サーバの次の階層の NTP サーバとして動作するので、タイムソースが上位サーバのみで良い場合は ntp master コマンドを追加する必要はありません。 ntp master コマンドが必要なのは以下の2つの場合だと思います。

  1. 閉じられたネットワーク等他に NTP サーバがいない環境で、この Cisco 機器を NTP サーバにしたい時
  2. 障害等の原因で上位の NTP サーバを参照することができないときにこの機器の内部時計をタイムソースとしたい時

ただし、2. の目的で ntp master を用いるときは、参照する上位の NTP サーバより下の階層となるよう適切な stratum を設定する必要があります。 最低でも (上位サーバの stratum) + 2 を設定しておけば、ハードウェアクロックの方を下位に位置づけることができます。

例えば上位の NTP サーバが stratum 3 で動作しているとき、ntp master コマンドの stratum は 5 以上に設定します。 以下は ntp master 5 を投入した機器での表示例です。

router#show ntp associations
Load for five secs: 0%/0%; one minute: 3%; five minutes: 2%
Time source is NTP, 20:29:53.946 JST Wed Aug 4 2010
address         ref clock     st  when  poll reach  delay  offset    disp
*~10.10.10.1       11.22.33.44       3    45    64  377     0.8   -4.60     2.1
+~127.127.7.1      127.127.7.1       4     3    64  377     0.0    0.00     0.0
* master (synced), # master (unsynced), + selected, - candidate, ~ configured
router#

127.127.7.1 が内部時計で、(ntp master で設定した stratum) – 1 となっていることに注意が必要です。

ネットワークに複数の機器がある場合はどの機器に ntp master を設定するか決めておき、他はそれを参照するようにした方が管理しやすいと思います。 不適切な stratum で ntp master コマンドを設定するのは NTP 環境を不安定にしてしまうので気をつけましょう。

また、ntp master を設定する場合は以下の2つも必要になると思います。

clock update-calendar
clock calendar-valid

前者は NTP でハードウェアクロックも更新するための設定です。 後者は「ハードウェアクロックを authoritative なタイムソースとする」のだそうですが、正直なところ今ひとつ効果がよくわかりません (試すことができていません)。 それでも Cisco が紹介しているベストプラクティスの設定例に含まれていて推奨されているように読めるので、少なくとも害はないと思います。

昔は機器をリブートする度に時刻はリセットされていた気がしますが、最近の機器はきちんと覚えてるようなので、ntp master を設定する/しないに関わらず NTP 環境では clock update-calendar を入れておくのが良いと思います。

次回も NTP 関連について書く予定です。

Cisco ASA 冗長構成でのもろもろ

Cisco ASA の Failover 構成 (シングルコンテキスト) についての補足です。 7.2 で動作確認しています。 以前書いた関連記事は最後にリストしています。

Management インターフェイスの扱い

予想に反して Failover 構成の場合、 Management 用インターフェイス (management-only の指定をしているインターフェイス) も Primary/Secondary 用ではなく Active/Standby 用としてアドレスを用意しなければなりません。 つまり、Failover 時はアドレスがスワップされてしまうということです。 管理用ならば、障害発生時もアドレスがスワップされない方が良いように思えるのですが、そのような設定をする方法は見つかりませんでした。

ただし、Management インターフェイスの障害による Failover の発生を防ぐことはできます。 以下のコマンドでインターフェイス名 management を持つインターフェイスを監視対象からはずし、このインターフェイスの障害による Failover が発生しないようにできます。

no monitor-interface management

Failover 関連のタイマー値

polltime unit で設定するタイマー値は Failover インターフェイスでの HELLO メッセージの間隔で、polltime interface で設定するタイマー値は間隔は各データ用インターフェイスでの HELLO メッセージの送出間隔です。

failover polltime unit 1 holdtime 10
failover polltime interface 3 holdtime 15

上の例では以下の通りとなります。

  • Failover インターフェイスで 1秒間隔で HELLO を送出し、10秒届かないと相手が死んだと判断する。
  • データ用インターフェイスで 3秒間隔で HELLO を送出し、15秒届かないと相手が死んだと判断する。

ただし、これらの設定を入れても、データ用インターフェイスダウンの場合はダウンを検知するとすぐに Failover します。 failover polltime interface の設定はインターフェイスがアップしているが HELLO が届かないという場合のタイマーです。

また、Failover リンクや Stateful リンクが切れた (該当インターフェイスがダウンした) だけでは Failover しません。 電源断等で相手が死んだときは polltime unit の設定値に従って Failover することになります。

ステートフルフェイルオーバーで同期される情報

これは本当に覚書で http://www.cisco.com/JP/support/public/ht/tac/102/1020859/pixfailover-j.shtml からの引用です。

スタンバイ ユニットには次のようなステート情報が渡されます。
NAT 変換テーブル
TCP 接続状態
UDP 接続状態
ARP テーブル
レイヤ 2 ブリッジ テーブル(透過フェールオーバー モードで稼働している場合)
HTTP 接続状態(HTTP 複製が有効になっている場合)
ISAKMP および IPSec の SA テーブル
GTP PDP 接続データベース
ステートフル フェールオーバーが有効になっていても、次の情報はスタンバイ ユニットには渡されません。
HTTP 接続テーブル(HTTP 複製が有効になっていない場合)
ユーザ認証(uauth)テーブル
ルーティング テーブル
セキュリティ サービス モジュールのステート情報

関連記事

Cisco MAC アドレス認証関連の情報アップデート

Cisco の MAC アドレス認証について以前書いた記事の内容が古くなっているので、最近の設定コマンドについてまとめておきます。 ただし、ドキュメントを当たっただけで、手許で動作確認はしていませんのでご了承ください。

mab コマンドの追加

最近は MAC アドレス認証 (MAB = MAC Authentication Bypass) を有効とするためには、(config-if) モードで mab コマンドを設定する必要があるようです。

Switch(config-if)# mab

その他結構コマンドが変わっているので、詳細は最後に挙げている Cisco のドキュメントを参照してみてください。 MAC アドレス認証のみであれば、「Standalone MAB Support」を読めば良いと思います。

認証の順序を変更できるようになった

前回の記事では 802.1X 認証 -> MAC アドレス認証という順番が固定であったため、802.1X 認証のタイムアウトを短く調節していたわけですが、最近は MAC アドレス認証を先に行うことができるようになりました。 具体的には以下のようなコマンドを打ちます。

authentication order mab dot1x webauth
authentication priority mab dot1x webauth

1行めのコマンドにより MAC アドレス認証 (mab) の方が 802.1x (dot1x) よりも先に実行されるようになります。 2行めのコマンドは優先順位の設定で、ある方式で認証された後に異なる認証方式で更に認証が実施されようとした時の動作を決めます。 この例では、1度 MAC アドレス認証された後は 802.1X による再認証ができないよう設定しています。

マルチ認証モードの追加

以前の記事では、

Catalyst の1ポートにハブ等を介して複数の端末を接続したときに、個々の端末を Catalyst で認証する仕掛けをつくるのは無理だと思います。

と書いていましたが、host-mode = multi-auth というモード (「マルチ認証モード」) が追加され、これが可能となっています。 個別に ACL が動的設定されアクセス制御が行われる様です。 ただし、MAC 認証と組み合わせて使えるものなのかよくわかりません。 また、現状ポートあたり8台が上限と聞いています。

以下、参考情報。いずれも Cisco のサイトです。

ASA5510 の Active/Standby 構成設定ログ

ASA5510 (Ver. 7.2) の Active/Standby failover 構成を設定した際のログです。 IP アドレスはCisco サイトで紹介されている構成例に合わせました。 ただし、stateful failover link の 10.0.0.0/8 というネットワークアドレスは気持ち悪いので 24ビットネットマスクに変更しています。

(Primary機:インターフェイスの設定)
asa1# configure terminal
asa1(config)# interface ethernet0/0
asa1(config-if)# nameif outside
INFO: Security level for "outside" set to 0 by default.
asa1(config-if)# ip address 172.16.1.1 255.255.0.0 standby 172.16.1.2
asa1(config-if)# interface ethernet0/1
asa1(config-if)# nameif inside
INFO: Security level for "inside" set to 100 by default.
asa1(config-if)# ip address 192.168.1.1 255.255.255.0 standby 192.168.1.2
asa1(config-if)# exit
asa1(config)#
(Primary機:failover の設定)
asa1(config)# failover lan unit primary
asa1(config)# failover lan interface failover ethernet0/2
INFO: Non-failover interface config is cleared on Ethernet0/2 and its sub-interfaces
asa1(config)# failover interface ip failover 10.1.0.1 255.255.255.0 standby 10.1.0.2
asa1(config)#
(stateful failover link の設定)
asa1(config)# failover link state ethernet0/3
INFO: Non-failover interface config is cleared on Ethernet0/3 and its sub-interfaces
asa1(config)#
asa1(config)# failover interface ip state 10.0.0.1 255.255.255.0 standby 10.0.0.2
(Secondary機:failover の設定)
ciscoasa(config)# failover lan interface failover ethernet0/2
INFO: Non-failover interface config is cleared on Ethernet0/2 and its sub-interfaces
ciscoasa(config)# failover interface ip failover 10.1.0.1 255.255.255.0 standby 10.1.0.2
ciscoasa(config)#
ciscoasa(config)#
(Primary機:インターフェイスの有効化)
asa1(config)# interface ethernet 0/0
asa1(config-if)# no shutdown
asa1(config-if)# interface ethernet 0/1
asa1(config-if)# no shutdown
asa1(config-if)# interface ethernet 0/2
asa1(config-if)# no shutdown
asa1(config-if)# interface ethernet 0/3
asa1(config-if)# no shutdown
asa1(config-if)#
(Secondary機:インターフェイスの有効化)
ciscoasa(config)#
ciscoasa(config)# interface ethernet0/0
ciscoasa(config-if)# no shutdown
(以下同様に 0/1、0/2、0/3 を有効化)
(Primary機:failover 有効化)
asa1(config)# failover
asa1(config)#
(Secondary機:failover 有効化)
ciscoasa(config)# failover
ciscoasa(config)# .
Detected an Active mate
Beginning configuration replication from mate.
End configuration replication from mate.
asa1(config)#     (ホスト名が同期される)
(Primary機:設定の保存-これで Secondary機の設定も保存される)
asa1(config)#  copy running-config startup-config
Source filename [running-config]? (Enter)

これでとりあえず failover 関連の基本設定はできたはずです。 詳しくは先のサイトの解説を参照してください。

ASA5500 シリーズの冗長構成

Cisco ASA の HA 構成についてまとめておきます。 Version 7.2 についての話ですが、ドキュメントをパラパラと見る限りでは 8.x でも大きく変わることは無いと思います。

Cisco ASA の HA 構成は以下のような特徴を持っています。

  1. フェイルオーバー時に Active 機/Standby 機間で MAC アドレスと IP アドレスが入れ替わる
  2. 設定が HA 構成を組む2台の間で同期される
  3. Active/Standby 構成では preempt な設定は不可

それぞれ説明して行きますが、その前に Primary/Secondary という言葉と Active/Standby という言葉について説明しておきます。

Primary/Secondary
フェイルオーバーしても変化しない 1台めの ASA、2台めの ASA という絶対的な関係を表しています。

Active/Standby
稼働中/待機中という状態を表します。 フェイルオーバーすると Active/Standby が入れ替わります。

ここでは特に断りがなければシンプルな Active/Standby 構成 (シングルコンテキスト) を想定し、Primary = Active、Secondary = Standby となっているのが正常な状態とします。

1. フェイルオーバー時に Active 機/Standby 機間で MAC アドレスと IP アドレスが入れ替わる
この動きはかなり独特です。 例えば VRRP や HSRP では2台の機器それぞれのインターフェイスに実 IP アドレスを振って更に仮想 IP アドレスを1つ用意し、合計3アドレスを使う、というような構成にすることが多いと思います。 これに対し、ASA では Active 用のアドレスと Standby 用の2つのアドレスを用います。 そしてフェイルオーバーするとアドレスが入れ替わります。

例えば、Primary = Active の状態で Ethernet0/0 に下のように IP アドレスが割り当てられているとします。

unit status address
Primary Active 192.168.0.1
Secondary Standby 192.168.0.2

ここで、Primary 機に障害が生じてフェイルオーバーが起こるとアドレスの割り当ては以下のようになります。 この時、MAC アドレスも同時に入れ替わります。

unit status address
Primary Standby 192.168.0.2
Secondary Active 192.168.0.1

仮にこのアドレスを ICMP (ping) 監視していたとすると Primary 機がダウンしても Secondary 機がダウンしても 192.168.0.2 がダウンして見えるので、これだけではどちらがダウンしたのか判別できないので注意が必要です。

2. 設定が HA 構成を組む2台の間で同期される
最初に最低限の設定をそれぞれにしてしまえば、後は Primary/Secondary 間で設定が自動的に同期されます。 設定変更は Active なユニット (それは Secondary かも知れません) で行わなければならないので注意が必要です。 同期されない設定項目は以下のもので、それ以外は同期されます。

  • failover lan unit
  • firewall
  • mode

また、Active 側で copy running-config startup-config コマンドや write mem コマンドで設定をフラッシュメモリーに保存すれば Secondary 側でも保存されます。

ここでちょっと困るのがホスト名も同期されて同一のものになってしまうことです。 ホスト名で区別することはできませんが、prompt コマンドを使ってプロンプトに「priority」を設定しておくと Primary/Secondary を区別をプロンプトに表示することができ便利です。

3. Active/Standby 構成では preempt な設定は不可
つまり以下のような話です。

  • Primary 機が障害を起こして Secondary = Active とフェイルオーバーした。 その後 Primary 機を復旧させた時に自動的に Primary = Active と戻す設定はできない。
  • HA 構成を組んだ2台の ASA に電源投入して起動する際、Secondary 機が先に起動してしまうと、Primary 機の起動後も Secondary = Active のままとなる。

このような場合に Primary = Active に戻すためには Primary 機上で以下のコマンドを実行して手動で戻します。

failover active

これで Primary 機が Active となります。 telnet、ssh 等でリモートよりこれを実施する場合は Standby 用のアドレスへアクセスすることになりますので注意が必要です。


関連記事

Cisco Secure ACS へのユーザ一括登録

認証サーバである Cisco Secure ACS (Access Control Server) を構築する際にユーザの登録を一括で行うための手順をまとめておきます。 これを行うためには CSUtil というツールを用います。 Version 3.3 と 4.1 で試しています。 Windows 版の ACS では、CSUtil.exe は以下のフォルダ内にあります。

(V 3.3 の場合)
Program Files\CiscoSecure ACS v3.3\Utils
(V 4.1 の場合)
Program Files\CiscoSecure ACS v4.1\bin

まず、インポートするための以下のような内容のテキストファイルを作成します。

OFFLINE
ADD:user01:CSDB:password01:PROFILE:1
ADD:user02:CSDB:password02:PROFILE:1

"OFFLINE" は認証サービスを止めてデータをインポートするための指定です。 インポート中も認証サービスを継続したい場合は "ONLINE" としますがパフォーマンスが落ちます。

2行目以降の "ADD" から始まる行が各ユーザ情報です。ここでは "ADD" 、 "CSDB"、"PROFILE" はパラメータ指定用トークンで、それぞれユーザ名、パスワード、グループ番号が後に続きます。

この他ユーザ情報の更新/削除や NAS の一括登録/削除用のコマンドも用意されていますが、詳しくはユーザガイドを参照ください。

先の内容のファイルを "userlist.txt" という名前で保存し、以下のコマンドを実行します。

CSUtil.exe -i userlist.txt

以上でユーザが一括登録されます。 最後に V 4.1 の場合の実行例を載せておきます。強調字はユーザ入力です。

C:\Program Files\CiscoSecure ACS v4.1\bin>csutil -i c:\work\userlist.txt
CSUtil v4.1(1.23), Copyright 1997-2005, Cisco Systems Inc
If the import file contains the OFFLINE: clause CSAuth will be stopped.
Are you sure you want to import? (y/Y = proceed)y
IMPORT: Importing records direct to database file
Finished processing import file.
Done
C:\Program Files\CiscoSecure ACS v4.1\bin>

Cisco Catalyst を使った MAC アドレス認証

Cisco の Catalyst スイッチを用いた MAC アドレス認証を試してみました。 RADIUS サーバに MAC アドレスを登録しておいて、スイッチのポートに端末がつながった時にその端末の MAC アドレスが RADIUS サーバに登録されていれば通信を許可するという動作です。 1つのポートには1つの端末がつながる想定 (Cisco の用語でシングルホストモード:host-mode = single-host) です。

MAC アドレス認証は 802.1X 認証機能の一部を使って行います。802.1X 認証機能の中に MAC 認証バイパス (MAC Authentication Bypass) という機能があるのですが、これを使うと、 802.1X の EAPOL を使った認証にクライアントが反応しない時は MAC アドレスによって認証を行い、成功すればアクセスを許可するような動作をとることができます。 MAC 認証バイパス機能が使えるのは IOS Release 12.2(25)SEE 以降です。

早速ですが関連する設定は以下のようになりました。12.2(35)SE5 で試しました。

aaa new-model
aaa authentication dot1x default group radius
!
aaa session-id common
dot1x system-auth-control
interface FastEthernet0/1
switchport access vlan 10
switchport mode access
dot1x mac-auth-bypass
dot1x pae authenticator
dot1x port-control auto
dot1x timeout tx-period 3
spanning-tree portfast
radius-server host 192.168.0.1 auth-port 1645 acct-port 1646
radius-server source-ports 1645-1646
radius-server key cisco

斜体のところは明示的に入力していないけれど、設定表示には表示されるようになったコマンドです。

インターフェイスの "dot1x timeout tx-period 3" と "spanning-tree portfast" の設定は、端末をポートに接続してから通信ができるようになるまでの時間を短縮するために必要です。 tx-period は 802.1X 認証 (EAP-Request/Identity) に対してのクライアントからの応答を待つ時間ですが、802.1X 認証は使わず MAC アドレスを使って認証するのでこれを短くします。ただし、tx-period を短くすると認証失敗時 (=許可されない端末接続時) の再認証間隔も短くなってしまうので、環境に合わせたチューニングが必要かも知れません。

RADIUS サーバ関連の設定 (サーバアドレス、キー等) や VLAN 番号等はあくまでも一例です。

RADIUS 側は User-Name、User-Password を共にその端末の MAC アドレス16進の小文字 (例:"000a0b0c0102") として許可する端末のレコードを登録しておけばオッケーです。

ちなみに host-mode には他に multi-host、multi-domain (12.2(35)SE 以降) というのがありますが、Catalyst の1ポートにハブ等を介して複数の端末を接続したときに、個々の端末を Catalyst で認証する仕掛けをつくるのは無理だと思います。 multi-host モードでは1ポートに複数端末がつながっている時、それらの端末のうちのどれかの認証が通ってしまえば、そのポートに接続している全ての端末がアクセス可となります。multi-domain は試していませんが、ドキュメントを読む限り音声とデータを独立して扱うためのもので複数のデータ端末を個々に認証するためのモードではないようです。


Cisco の認証関連について 2009.6 現在の情報をまとめましたので、こちらの記事も参照ください。 802.1X 認証と MAC 認証の実行順を指定するコマンドや新しい host-mode が導入されています。

Cisco PIX/ASA もう一つの MSS 関連設定

前回 PIX/ASA の MSS がらみのコマンドの話を書きましたが、MSS 関連では "sysopt connection tcpmss" というコマンドもありますね。 これは、通過する通信の TCP ヘッダの MSS オプション値が指定された最大値を超えていたときは、その最大値に書き換えてしまうというものです。 デフォルトでは最大値が 1380 になっていて (6.x、7.x 共)、これを超えるものは 1380 に書き換えられます。1380 以外 (例えば 1200) に設定したい場合は次のようにコマンドを入力します。

sysopt connection tcpmss 1200

この書き換えを止めるには以下のコマンドを入力します。

sysopt connection tcpmss 0

"sysopt connection tcpmss minimum" で最小値も設定できます。

"sysopt connection tcpmss" はあくまで MSS オプションの書き換え動作だけであり、 MSS 値を超えた通信を許可/拒否するのは、先の記事のリンク先にある "exceed-mss allow/drop" の設定になるのでごっちゃにならないようにしなければ、ですね。