らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

IOS-XE で GuestShell を有効化し、外部ネットワークと通信する

IOS-XE では簡単な設定で Linux コンテナを動作させることが出来ます。 今回は Catalyst8000v 17.06.01a 上で GuestShell を動作させ、GuestShell から外部ネットワークへ通信出来るように設定する手順をメモしておきます。 尚、逆向きの「外部ネットワーク → GuestShell へのアクセス」は想定しない (出来ない) ものとします。

GuestShell 用の事前設定

インターフェイスは以下の設計とします。

  1. GigabitEthernet1 (Gi1) が外部ネットワークと接続しているインターフェイス
  2. VirtualPortGroup0 (VPG0) が GuestShell 側の内部ネットワークと接続しているインターフェイス

GuestShell のアドレス帯 (今回は 100.64.0.0/24) を ACL で定義し、これを Gi1 / VPG0 で NAT することで GuestShell から外部へ通信出来るようにします。 GuestShell に割り当てるアドレス帯は VRF (今回は GuestShell という名前の VRF を定義) で分離することで「GuestShell のアドレス帯が既存ネットワークと重複してしまい、ルーティング出来なくなる」ことを避けています (※ 副作用として外部ネットワーク → GuestShell にはアクセス出来なくなります)。

まず外部接続インターフェイスを設定します。

interface GigabitEthernet1
 ip address 10.0.0.1 255.255.255.0
 ip nat outside
 no shutdown
!
end

次に GuestShell 関連の設定を行います。

iox
!
vrf definition GuestShell
 rd 1:1
 !
 address-family ipv4
 exit-address-family
!
interface VirtualPortGroup0
 vrf forwarding GuestShell
 ip address 100.64.0.254 255.255.255.0
 ip nat inside
!
ip access-list standard ACL_GuestShell
 10 permit 100.64.0.0 0.0.0.255
!
ip nat inside source list ACL_GuestShell interface GigabitEthernet1 vrf GuestShell overload
ip route vrf GuestShell 0.0.0.0 0.0.0.0 GigabitEthernet1 10.0.0.254 global
!
app-hosting appid guestshell
 app-vnic gateway1 virtualportgroup 0 guest-interface 0
  guest-ipaddress 100.64.0.1 netmask 255.255.255.0
 app-default-gateway 100.64.0.254 guest-interface 0
 name-server0 1.1.1.1
 name-server1 1.0.0.1
!
end

GuestShell の有効化

デフォルトで GuestShell は起動していません。 show app-hosting detail で確認すると GuestShell (App id:guestshell) を含む、いずれのアプリケーションも起動していないことが分かります。

C8000v# show app-hosting detail
No App found

特権モードで guestshell enable を実行し、GuestShell を有効化します。 コンフィギュレーションモードでは無いので、間違えないように気をつけます。

guestshell enable

これで GuestShell が起動しました。 show app-hosting detail で起動すると App id が guestshell となっている GuestShell アプリケーションが起動していることが分かります。

C8000v# show app-hosting detail
App id                 : guestshell
Owner                  : iox
State                  : RUNNING
Application
  Type                 : lxc
  Name                 : GuestShell
  Version              : 3.3.0
  Description          : Cisco Systems Guest Shell XE for x86_64
  Author               : Cisco Systems
  Path                 : /guestshell/:guestshell.tar
  URL Path             :
Activated profile name : custom

Resource reservation
  Memory               : 256 MB
  Disk                 : 1 MB
  CPU                  : 800 units
  CPU-percent          : 23 %
  VCPU                 : 1

Platform resource profiles
  Profile Name                  CPU(unit)  Memory(MB)  Disk(MB)
  --------------------------------------------------------------

Attached devices
  Type              Name               Alias
  ---------------------------------------------
  serial/shell     iox_console_shell   serial0
  serial/aux       iox_console_aux     serial1
  serial/syslog    iox_syslog          serial2
  serial/trace     iox_trace           serial3

Network interfaces
   ---------------------------------------
eth0:
   MAC address         : 11:22:33:44:55:66
   IPv4 address        : 100.64.0.1
   IPv6 address        : ::
   Network name        : VPG0

Port forwarding
  Table-entry  Service  Source-port  Destination-port
  ---------------------------------------------------

GuestShell へのログイン

GuestShell へログインするには特権モードで guestshell を実行します。 これで GuestShell の bash を起動することが出来ます。

C8000v# guestshell
[guestshell@guestshell ~]$

試しに 1.1.1.1 へ Ping してみました。 下記では「GuestShell から外部へ通信出来ていること」が分かります。

[guestshell@guestshell ~]$ ping -c 1 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=56 time=28.9 ms

--- 1.1.1.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 28.912/28.912/28.912/0.000 ms

/etc/resolv.conf を確認すると name-server0name-server1 で定義した DNS サーバが設定されていることが分かります。

[guestshell@guestshell ~]$ cat /etc/resolv.conf
nameserver 1.1.1.1
nameserver 1.0.0.1
(snip)

GuestShell からのログアウト

exit を実行すると GuestShell からログアウトし、IOS-XE へ戻ります。

[guestshell@guestshell ~]$ exit
exit

C8000v#

IOS-XE を再起動すると GuestShell は自動起動するのか? しないのか?

IOS-XE を再起動すると GuestShell は自動起動するのか? しないのか?」は GuestShell が有効化されているか、否かに応じて決定されるようです。

GuestShell が有効化されている場合 → 自動起動する

guestshell enable で GuestShell が有効化されている場合、IOS-XE を再起動しても GuestShell は 自動起動しません。 GuestShell の状態は show app-hosting list で確認出来ます。 下記では RUNNING になっているので「有効化されている」ことが分かります。

C8000v# show app-hosting list
App id                                   State
---------------------------------------------------------
guestshell                               RUNNING

GuestShell が無効化されている場合 → 自動起動しない

guestshell disable で GuestShell が無効化されている場合、IOS-XE を再起動しても GuestShell は 自動起動しませんshow app-hosting list で確認すると DEPLOYED と表示されますが、これは デプロイはされているが無効化されている ことを意味します。

C8000v# show app-hosting list
App id                                   State
---------------------------------------------------------
guestshell                               DEPLOYED

GuestShell コンテナを廃棄するには?

GuestShell コンテナを廃棄するには guestshell destroy を実行します。 guestshell enable を実行して GuestShell コンテナした後に app-hosting appid guestshell セクションで GuestShell のパラメータを変更しても 反映されない ようです。 変更したパラメータを反映する為には guestshell destroy でコンテナを廃棄し、再度 guestshell enable でデプロイし直す必要があります。

C8000v# guestshell destroy
Guestshell destroyed successfully

C8000v# show app-hosting list
No App found