らくがきちょう

なんとなく

Cisco ASA のマルチモード (マルチコンテキスト) 設定

Cisco ASA のマルチモード (マルチコンテキスト) 設定についてメモしておきます。

マルチモードへの変更

ASA のモード設定は show mode で確認出来ます。single と表示された場合はシングルモード (非マルチモード) です。既にマルチモードになっているようであれば、以降のモード変更手順は不要です。

ciscoasa# show mode
Security context mode: single

マルチモードに変更するには mode multiple を設定後に再起動します。もしくは mode noconfirm multiple を設定すると自動的に再起動が開始されます。

ciscoasa# configure terminal
ciscoasa(config)# mode noconfirm multiple

再起動が完了するとマルチモードになっているはずです。

ciscoasa# show mode
Security context mode: multiple

シングルモード時のコンフィグがマルチモード用に変換され、startup-config に残っているはずです。意図したコンフィグしか設定したくないので、write erase で startup-config を削除して再起動します。

ciscoasa# write erase
Erase configuration in flash memory? [confirm]
[OK]
ciscoasa# reload
Proceed with reload? [confirm]

マルチモードへ変更した際、自動的に admin.cfg 等のファイルが作成されています。再起動が完了したら、これらのファイル (*.cfg ファイル) を削除します。

ciscoasa# delete *.cfg

Delete filename [*.cfg]?

Delete disk0:/old_running.cfg? [confirm]

Delete disk0:/admin.cfg? [confirm]

Failover の設定

コンテキストを含む、あらゆる設定を実施する前に、まずは Failover を設定します。ASA の Failover 設定については以前の記事で記載しました。今回は以下のように設定しました。

ASA-1 側の設定

マルチモードではプロンプトに「現在のコンテキスト」を表示した方が便利なので promptcontext も指定しています。

interface GigabitEthernet0/0
 channel-group 1 mode active
 no shutdown
!
interface GigabitEthernet0/1
 channel-group 1 mode active
 no shutdown
!
interface Port-channel1
!
failover
failover lan unit primary
failover lan interface FAILOVER Port-channel1
failover link FAILOVER Port-channel1
failover interface ip FAILOVER 10.0.0.1 255.255.255.252 standby 10.0.0.2
!
prompt hostname state priority context

ASA-2 側の設定

interface GigabitEthernet0/0
 channel-group 1 mode active
 no shutdown
!
interface GigabitEthernet0/1
 channel-group 1 mode active
 no shutdown
!
interface Port-channel1
!
failover
failover lan unit secondary
failover lan interface FAILOVER Port-channel1
failover link FAILOVER Port-channel1
failover interface ip FAILOVER 10.0.0.1 255.255.255.252 standby 10.0.0.2

状態確認

設定が完了し、Failover が構成されたら show failover state で状態を確認しておきます。

ciscoasa/act/pri# show failover state

               State          Last Failure Reason      Date/Time
This host  -   Primary
               Active         None
Other host -   Secondary
               Standby Ready  None

====Configuration State===
	Sync Done
====Communication State===

最初の状態

設定されたコンテキストの一覧は show context で確認出来ます。(write erase を実施しているので) 最初の状態では追加コンテキストが存在しません。つまり、「system コンテキストしか無い状態」と言えます。

ciscoasa/act/pri# show context
Context Name      Class      Interfaces           Mode         URL

Total active Security Contexts: 0

「ASA 内に system コンテキストしか存在しない」状態を図示すると以下のようになります。

f:id:sig9:20160503001816p:plain

管理用コンテキストを作成する

コンテキストを作成する

管理用に「admin」コンテキストを作成します。コンテキストの作成は context [NAME] で行いますが管理用コンテキストに限り、明示的に admin-context [NAME] を一緒に設定し、該当コンテキストが管理用である旨を宣言します。具体的には以下のように設定します。この例では管理用コンテキストの名前を「admin」にしました。

ciscoasa/act/pri# configure terminal
ciscoasa/act/pri(config)# admin-context admin
Creating context 'admin'... Done. (1)
ciscoasa/act/pri(config)# context admin
ciscoasa/act/pri(config-ctx)#

show context を確認すると admin コンテキストが表示されるようになりました。

ciscoasa/act/pri# show context
Context Name      Class      Interfaces           Mode         URL
*admin            default                         Routed       (not entered)

Total active Security Contexts: 1

現在の状態を図示すると以下の通りです。system コンテキスト上で admin コンテキストを作成しました。

f:id:sig9:20160503001854p:plain

インターフェイスを割り当てる

次は作成したコンテキストにインターフェイスを割り当てます。コンテキスト内部からは割り当てられたインターフェイスしか認識することが出来ません。インターフェイスの割り当ては allocate-interface [INTERFACE] で行います。今回は admin コンテキストに Management0/0 を割り当ててみます。

ciscoasa/act/pri# configure terminal
ciscoasa/act/pri(config)# context admin
ciscoasa/act/pri(config-ctx)# allocate-interface Management0/0

これまでの状態を図示すると以下のようになります。admin コンテキストを作成し、Ma0/0 インターフェイスを割り当てました。

f:id:sig9:20160503001902p:plain

コンフィグの保存位置を指定する

コンテキスト毎のコンフィグはテキストファイルとして保存されます。保存位置は config-url [LOCATION] で指定します。今回は disk0:admin.cfg として保存してみます。まず、設定前に disk0:admin.cfg ファイルが存在しないことを dir で確認します。

ciscoasa/act/pri# dir disk0:admin.cfg

%Error opening disk0:/admin.cfg (No such file or directory)

admin コンテキストのコンフィグ保存位置を config-url [LOCATION] で指定します。

ciscoasa/act/pri# configure terminal
ciscoasa/act/pri(config)# context admin
ciscoasa/act/pri(config-ctx)# config-url disk0:admin.cfg
INFO: Converting disk0:admin.cfg to disk0:/admin.cfg

WARNING: Could not fetch the URL disk0:/admin.cfg
INFO: Creating context with default config
INFO: Admin context will take some time to come up .... please wait.

これでコンフィグの保存位置は指定完了です。しかし、まだこの状態ではコンフィグファイルは作成されていません。これは「該当コンテキストでの初回コンフィグ保存時にコンフィグファイルが作成される」為です。

ciscoasa/act/pri# dir disk0:/admin.cfg

%Error opening disk0:/admin.cfg (No such file or directory)

write memory では現在のコンテキストのコンフィグのみを保存します (=他のコンテキストのコンフィグは保存しません)。しかし、system コンテキストだけで利用出来る write memory all を実行すると全コンテキストのコンフィグを保存することが出来ます。但し、「コンテキストをエンドユーザ毎に割り当て、自身で設定させている場合」等は一括して全コンテキストのコンフィグを保存してはならないケースもあるので、write memory all の使用には注意が必要です。今回は初期設定中なので write memory all を実行し、全コンテキストの設定を保存します。

ciscoasa/act/pri# write memory all
Building configuration...
Do you wish to continue? [confirm]
Saving context :           system : (000/001 Contexts saved)
Cryptochecksum: 7835d168 7161969b 2b2e085d e0b46987

1862 bytes copied in 0.730 secs
Saving context :            admin : (001/001 Contexts saved)
Cryptochecksum: 8ebc25be 88f63985 d5403b94 852ac8ce

1747 bytes copied in 0.120 secs
[OK]

write memory all の実行結果を確認すると全コンテキスト (system と admin) の設定が一度に保存されているのが分かります。これで admin コンテキストのコンフィグファイルが生成されました。

ciscoasa/act/pri# dir disk0:/admin.cfg

Directory of disk0:/admin.cfg

80     -rwx  1747         15:30:27 May 02 2016  admin.cfg

8238202880 bytes total (4848738304 bytes free)

現在の状態を図示すると以下の通りです。admin コンテキストを作成して Management0/0 を割り当て、コンフィグの保存位置も指定しました。

f:id:sig9:20160503001909p:plain

一般用コンテキストを作成する (context2)

コンテキストを作成する

管理用では無い、一般コンテキストは context [NAME] で作成します。

ciscoasa/act/pri# configure terminal
ciscoasa/act/pri(config)# context context2
Creating context 'context2'... Done. (2)

これで context2 コンテキストが作成されました。

ciscoasa/act/pri# show context
Context Name      Class      Interfaces           Mode         URL
*admin            default    Management0/0        Routed       disk0:/admin.cfg
 context2         default                         Routed       (not entered)

Total active Security Contexts: 2

現在の状態を図示すると以下の通りです。admin コンテキストに続いて context2 コンテキストを作成しました。

f:id:sig9:20160503005857p:plain

インターフェイスを割り当てる

context2 には GigabitEthernet0/2 を割り当てます。admin コンテキストの設定時同様、allocate-interface [INTERFACE] で設定します。

ciscoasa/act/pri# configure terminal
ciscoasa/act/pri(config)# context context2
ciscoasa/act/pri(config-ctx)# allocate-interface GigabitEthernet0/2

show context を確認すると context2 に GigabitEthernet0/2 が割り当てられていることを確認出来ます。

ciscoasa/act/pri# show context
Context Name      Class      Interfaces           Mode         URL
*admin            default    Management0/0        Routed       disk0:/admin.cfg
 context2         default    GigabitEthernet0/2   Routed       (not entered)

Total active Security Contexts: 2

現在の状態を図示すると以下の通りです。作成した context2 コンテキストに GigabitEthernet0/2 を割り当てました。

f:id:sig9:20160503005904p:plain

コンフィグの保存位置を指定する

context2 コンテキストのコンフィグ保存位置も指定しておきます。今回は disk0:context2.cfg にします。必ずしもコンテキスト名とファイル名をあわせる必要はありませんが、管理のし易さを考慮するとコンテキスト名とファイル名は揃えておいた方が無難だと思います。

ciscoasa/act/pri# configure terminal
ciscoasa/act/pri(config)# context context2
ciscoasa/act/pri(config-ctx)# config-url disk0:context2.cfg
INFO: Converting disk0:context2.cfg to disk0:/context2.cfg

WARNING: Could not fetch the URL disk0:/context2.cfg
INFO: Creating context with default config

show context を確認すると context2 コンテキストも URL が指定されたことが分かります。

ciscoasa/act/pri# show context
Context Name      Class      Interfaces           Mode         URL
*admin            default    Management0/0        Routed       disk0:/admin.cfg
 context2         default    GigabitEthernet0/2   Routed       disk0:/context2.cfg

Total active Security Contexts: 2

現在の状態を図示すると以下の通りです。admin コンテキストに加え、context2 コンテキストを作成し、GigabitEthernet0/2 を割り当て、コンフィグの保存位置も指定しました。

f:id:sig9:20160503010114p:plain

一般用コンテキストを作成する (context3)

もうひとつ、一般用コンテキストを作成します。コンテキスト名は「context3」、割り当てるインターフェイスは「GigabitEthernet0/3」、コンフィグファイルの保存位置は「disk0:context3.cfg」にします。

ciscoasa/act/pri# configure terminal
ciscoasa/act/pri(config)# context context3
Creating context 'context3'... Done. (3)
ciscoasa/act/pri(config-ctx)# allocate-interface GigabitEthernet0/3
ciscoasa/act/pri(config-ctx)# config-url disk0:context3.cfg
INFO: Converting disk0:context3.cfg to disk0:/context3.cfg

WARNING: Could not fetch the URL disk0:/context3.cfg
INFO: Creating context with default config

write memory all で全コンテキストのコンフィグを保存しておきます。

ciscoasa/act/pri# write memory all
Building configuration...
Do you wish to continue? [confirm]
Saving context :           system : (000/003 Contexts saved)
Cryptochecksum: 4b24510b 804daf7f 84115d13 c14f93d3

2058 bytes copied in 0.730 secs
Saving context :            admin : (001/003 Contexts saved)
Cryptochecksum: 8ebc25be 88f63985 d5403b94 852ac8ce

1747 bytes copied in 0.120 secs
Saving context :         context2 : (002/003 Contexts saved)
Cryptochecksum: 98671e5b 555f8999 840464a2 f5aafab8

1655 bytes copied in 0.110 secs
Saving context :         context3 : (003/003 Contexts saved)
Cryptochecksum: d95e8c9f 12e2b2b7 891630e5 1b6d6b95

1655 bytes copied in 0.110 secs
[OK]

dir でコンフィグファイルが保存されたことを確認しておきます。

ciscoasa/act/pri# dir *.cfg

Directory of disk0:/*.cfg

80     -rwx  1747         16:06:23 May 02 2016  admin.cfg
81     -rwx  1655         16:06:23 May 02 2016  context2.cfg
84     -rwx  1655         16:06:24 May 02 2016  context3.cfg

8238202880 bytes total (4848721920 bytes free)

現在の状態を図示すると以下の通りです。デフォルトで存在する system に加え、admin、context2、context3 というコンテキストを作成しました。

f:id:sig9:20160503010125p:plain

コンテキスト間の移動

管理用コンテキストからの移動

コンテキスト間の移動は changeto context [NAME] で行います。但し、system コンテキストに移動する場合のみ changeto system も使用することが出来ます (changeto context system を使うことも出来ます)。

f:id:sig9:20160503013252p:plain

一般用コンテキストからの移動

一般用コンテキストにも telnetssh の設定をすることは可能です。但し、telnetssh 等で一般用コンテキストにログインした場合、他のコンテキストに移動することは出来ません。

f:id:sig9:20160503013258p:plain

コンテキストから認識出来るインターフェイス

各コンテキストから認識出来るのは「system コンテキスト上で割り当てられたインターフェイスのみ」です。割り当てられていないインターフェイスshow interface 等で表示されないだけでなく、syslog や SNMP でもログを検知したり Trap を飛ばしたりすることは出来ません。ASA のコンテキストとインターフェイス割り当てが以下のようになっているとします。

ciscoasa/act/pri# show context
Context Name      Class      Interfaces           Mode         URL
*admin            default    Management0/0        Routed       disk0:/admin.cfg
 context2         default    GigabitEthernet0/2   Routed       disk0:/context2.cfg
 context3         default    GigabitEthernet0/3   Routed       disk0:/context3.cfg

Total active Security Contexts: 3

この状態で system コンテキストで show interface ip brief を確認すると全インターフェイスが表示されます。system では常に全てのインターフェイスが認識されます。

ciscoasa/act/pri# show interface ip brief
Interface                  IP-Address      OK? Method Status                Protocol
GigabitEthernet0/0         unassigned      YES unset  up                    up
GigabitEthernet0/1         unassigned      YES unset  up                    up
GigabitEthernet0/2         unassigned      YES unset  administratively down up
GigabitEthernet0/3         unassigned      YES unset  administratively down up
GigabitEthernet0/4         unassigned      YES unset  administratively down down
GigabitEthernet0/5         unassigned      YES unset  administratively down down
Internal-Control0/0        127.0.1.1       YES unset  up                    up
Internal-Data0/0           unassigned      YES unset  down                  up
Internal-Data0/1           unassigned      YES unset  up                    up
Internal-Data0/2           unassigned      YES unset  up                    up
Management0/0              unassigned      YES unset  administratively down up
Port-channel1              10.0.0.1        YES unset  up                    up

admin コンテキストでは以下のように表示されます。割り当てられている Management0/0 のみ、表示されています。

ciscoasa/act/pri/admin# show interface ip brief
Interface                  IP-Address      OK? Method Status                Protocol
Management0/0              unassigned      YES unset  up                    up

context2 コンテキストでも同様に、割り当てられているインターフェイスのみ、表示されています。

ciscoasa/act/pri/context2# show interface ip brief
Interface                  IP-Address      OK? Method Status                Protocol
GigabitEthernet0/2         unassigned      YES unset  down                  down

context3 コンテキストでも同様です。

ciscoasa/act/pri/context3# show interface ip brief
Interface                  IP-Address      OK? Method Status                Protocol
GigabitEthernet0/3         unassigned      YES unset  down                  down

インターフェイスの状態について

同じインターフェイスに対して「system コンテキストで shutdown / no shutdown」しつつ、コンテキストで「shutdown / no shutdown」した場合、インターフェイスの状態は以下のように表示されます。尚、対向スイッチとは正しく結線され、対向スイッチ側では no shutdown されているものとします。

No. system の設定 system での見え方 コンテキストの設定 コンテキストでの見え方
1 shutdown administratively down shutdown administratively down
2 shutdown administratively down no shutdown down
3 no shutdown up shutdown administratively down
4 no shutdown up no shutdown up

No.2 に該当しますが、system で shutdown している場合、コンテキストで no shutdown してもコンテキストでの状態表示は「down」と表示され、通信は出来ません。各コンテキストでインターフェイスを LinkUp させるには No.4 のように system コンテキストと各コンテキストの両方で no shutdown する必要があります (デフォルトで system のインターフェイスshutdown、各コンテキストのインターフェイスno shutdown になっているはずです)。

コンフィグの保存位置を指定しないとコンテキストを利用出来ない

以下のように config-url を指定しないコンテキストを作成したとします。

ciscoasa/act/pri# show running-config context context4
context context4
  allocate-interface GigabitEthernet0/3

changeto context でこのコンテキストに移動しようとするとエラーになってしまい、コンテキストを設定することが出来ません。

ciscoasa/act/pri# changeto context context4
ERROR: Context hasn't been initialized with 'config-url'

同じインターフェイスを別コンテキストで shutdown されたら?

結論から述べると「影響ありません」。

そもそも同じ物理インターフェイスを別のコンテキストに割り当てることも可能です。例えば、以下では context3 と context4 に同じ GigabitEthernet0/3 を割り当てています。

ciscoasa/act/pri# show context
Context Name      Class      Interfaces           Mode         URL
*admin            default    Management0/0        Routed       disk0:/admin.cfg
 context2         default    GigabitEthernet0/2   Routed       disk0:/context2.cfg
 context3         default    GigabitEthernet0/3   Routed       disk0:/context3.cfg
 context4         default    GigabitEthernet0/3   Routed       disk0:/context4.cfg

Total active Security Contexts: 4

system コンテキストで GigabitEthernet0/3 が no shutdown されているとします。

ciscoasa/act/pri# configure terminal
ciscoasa/act/pri(config)# interface GigabitEthernet 0/3
ciscoasa/act/pri(config-if)# no shutdown
ciscoasa/act/pri# show interface GigabitEthernet 0/3
Interface GigabitEthernet0/3 "", is up, line protocol is up

context3 では GigabitEthernet0/3 を shutdown します。一見、物理インターフェイスを閉塞したように見えますが、対向側の機器では LinkDown しません。

ciscoasa/act/pri/context3# configure terminal
ciscoasa/act/pri/context3(config)# interface GigabitEthernet 0/3
ciscoasa/act/pri/context3(config-if)# shutdown
ciscoasa/act/pri/context3# show interface GigabitEthernet 0/3
Interface GigabitEthernet0/3 "", is administratively down, line protocol is down
	Available but not configured via nameif

context4 では GigabitEthernet0/3 を no shutdown します。先程、context3 では shutdown したにも関わらず、インターフェイスの状態は LinkUp しています。実際に Ping 等で通信確認すると問題無く、通信出来ています。

ciscoasa/act/pri/context4# configure terminal
ciscoasa/act/pri/context4(config)# interface GigabitEthernet 0/3
ciscoasa/act/pri/context4(config-if)# no shutdown
ciscoasa/act/pri/context4# show interface GigabitEthernet 0/3
Interface GigabitEthernet0/3 "", is up, line protocol is up
	Available but not configured via nameif

マルチモードだと SSL-VPN が使えない?

従来はマルチモードにすると SSL-VPN が使えなかったようです。しかし、リリースノートを見る限り、OS バージョン 9.5(2) からはサポートされるようになったようです。

参考 URL