zaki work log

作業ログやら生活ログやらなんやら

Arista EOSのcEOS-labコンテナでSNMPサーバー(SNMPエージェント)

とある作業でSNMP接続を試したかったけど手持ちの環境でSNMPサーバーが無かったので、Arista EOSのコンテナ版cEOS-labでSNMPサーバーを有効にして外部SNMPマネージャー(snmpwalk)から値を取得できるようにしてみた。
Linuxサーバーに入れても良かったけど、仕事ではAWS上のCisco CSR(Cloud Service Router)で同じことをしたため、手元のcEOSでも同じことできるのかなーと試してみた。

zaki-hmkc.hatenablog.com

SNMP用161/UDPのpublish設定

SNMPエージェントは161/UDPを使用するため、Dockerコンテナの起動オプションで161/UDPをpublishするように以下のオプションでコンテナ起動。
UDPの場合のpublish設定はポート番号の後ろに/udpを付与する。

docker run --name=ceos-snmp \
  --privileged \
  -p 45022:22 \
  -p 45161:161/udp \
  -e CEOS=1 \
  -e container=docker \
  -e EOS_PLATFORM=ceoslab \
  -e SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 \
  -e ETBA=1 \
  -e INTFTYPE=eth \
  -d \
  ceos:4.21.12M /sbin/init

以下実行結果。

[zaki@cloud-dev image]$ docker run --name=ceos-snmp \
>   --privileged \
>   -p 45022:22 \
>   -p 45161:161/udp \
>   -e CEOS=1 \
>   -e container=docker \
>   -e EOS_PLATFORM=ceoslab \
>   -e SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 \
>   -e ETBA=1 \
>   -e INTFTYPE=eth \
>   -d \
>   ceos:4.21.12M /sbin/init
0380ca057b80ce29cb37d2b469573d095e44ab4fbf31c085cf5986186ce99446

起動したらコンテナのシェルを起動して初期設定(ユーザー作成)を行う。 (前回と同じ内容)

[zaki@cloud-dev image]$ docker exec -it ceos-snmp bash
bash-4.3# Cli
0380ca057b80>enable 
localhost#configure 
localhost(config)#username lab-user privilege 15 secret p@ssword
localhost(config)#exit
localhost#exit
bash-4.3# exit
exit
[zaki@cloud-dev image]$ 
[zaki@cloud-dev image]$ ssh lab-user@localhost -p 45022
The authenticity of host '[localhost]:45022 ([::1]:45022)' can't be established.
ECDSA key fingerprint is SHA256:BVnPKEnu8jkuxHBJxLP225oto+2nI4UWSUe6Km3A4us.
ECDSA key fingerprint is MD5:f6:8d:f5:4b:ca:ed:00:b2:83:a4:a4:50:81:38:50:02.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:45022' (ECDSA) to the list of known hosts.
Password: 
localhost>en
localhost#

SNMPの有効化だけであれば、機器設定用のユーザー作ってsshしなくてもdocker exec -itで入った状態でCliしてenableしてconfigureのあとに以下の作業は可能。

SNMPの有効化

SNMPの状態を確認。
(この表示だと有効なんだか無効なんだか。。。)

localhost>show snmp
SNMP agent enabled in VRFs: default
Transmit message maximum size: 65536
SNMP agent disabled: no communities or users configured

SNMPエージェントを有効にする。

localhost>enable 
localhost#configure 
localhost(config)#
localhost(config)#snmp-server community public ro

状態を確認。
(478となっているパケット数は状況によって増える)

localhost(config)#show snmp
478 SNMP packets input
    0 Bad SNMP version errors
    0 Unknown community name
    0 Illegal operation for community name supplied
    0 Encoding errors
    478 Number of requested variables
    0 Number of altered variables
    0 Get-request PDUs
    478 Get-next PDUs
    0 Set-request PDUs
478 SNMP packets output
    0 Too big errors
    0 No such name errors
    0 Bad value errors
    0 General errors
    478 Response PDUs
    0 Trap PDUs
Access Control
    0 Users
    0 Groups
    0 Views
SNMP logging: disabled
SNMP agent enabled in VRFs: default
Transmit message maximum size: 65536

show running-configでも確認。
(includeについてはこちら)

localhost#show running-config | include snmp
snmp-server community public ro

ちなみに(docker exec -itbashシェルを起動して)ポートのListen状態を確認するとこんな感じ。

bash-4.3# ss -anpu
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
UNCONN     0      0                 *:161                           *:*                   users:(("snmpd",pid=2270,fd=7))
UNCONN     0      0                :::161                          :::*                   users:(("snmpd",pid=2270,fd=10))

SNMPエージェントを無効にするには、有効にした時のコマンドの頭にnoを付けて実行すれば良い。(SNMPに限らず機能共通)

localhost(config)#no snmp-server community public ro

snmpwalkの実行

インストール

yumで入れる場合はnet-snmp-utilsパッケージをインストール。(net-snmpだと入らない)
aptの場合はsnmpパッケージで入る。

実行

デフォルトは161/UDPを使用するけど今回は45161/UDPに変更しているので、ホスト名の後ろにポート番号を明示する。

[zaki@cloud-dev ~]$ snmpwalk -v1 -c public localhost:45161
SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost 3.10.0-1160.11.1.el7.x86_64 #1 SMP Fri Dec 18 16:34:56 UTC 2020 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.30065.1.2600
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (81009) 0:13:30.09
SNMPv2-MIB::sysContact.0 = STRING: 
SNMPv2-MIB::sysName.0 = STRING: 
SNMPv2-MIB::sysLocation.0 = STRING: 
SNMPv2-MIB::sysServices.0 = INTEGER: 14
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (18932) 0:03:09.32
SNMPv2-MIB::sysORID.1 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.2 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.3 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.4 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup

:
:

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1 = STRING: "cEOSLab"
SNMPv2-SMI::mib-2.47.1.1.1.1.2.1100004000 = STRING: "Chip Container"
SNMPv2-SMI::mib-2.47.1.1.1.1.2.1100006000 = STRING: "Sensor Container"
SNMPv2-SMI::mib-2.47.1.1.1.1.2.1100140000 = STRING: "Port Container"
SNMPv2-SMI::mib-2.47.1.1.1.1.2.1100300000 = STRING: "Xcvr Slot Container"
SNMPv2-SMI::mib-2.47.1.1.1.1.2.1100600000 = STRING: "Fan Tray Slot Container"
SNMPv2-SMI::mib-2.47.1.1.1.1.2.1100700000 = STRING: "Power Supply Slot Container"

:
:

こんな感じで情報取得できている。

今回はここまで。

関連ドキュメント

試した後にドキュメント探したらあった。

www.arista.com

(memo)ESXiのSNMPエージェント

cEOSでお試ししたあとに「もしや…」と思って見てみたら、ホストの「管理」->「サービス」のリストに「SNMPサーバ」ってあった。ESXiでも使えそう…