snmpsimを使用して環境構築 (2)

# Docker環境でSNMPシミュレーション環境を構築する

この記事では、`snmpsim` を使用してDocker環境でSNMPシミュレーション環境を構築する方法を紹介します。前回の記事「[snmpsimを使用して環境構築 (1)](https://qiita.com/tkhr68000/items/2a637a18e65c7182faaa)」の続きとして、今回はDockerを利用した構築手順を説明します。
Dockerを使うことにより、管理者権限を使って161ポート番号も使えるようになります。

## 必要なファイル

以下の2つのファイルを作成します。

### 1. `docker-compose.yml`

以下は `docker-compose.yml` の内容です。このファイルを使用して、`snmpsim` コンテナを構築・起動します。

```yaml:docker-compose.yml
version: '3.8'

services:
  snmpsim:
    build:
      context: .
    container_name: snmpsim
    ports:
      - "161:161/udp"
    volumes:
      - ./data:/opt/snmpsim/data
```

```docker:dockerfile
FROM python:3.12-slim

# Install required dependencies
RUN pip install snmpsim

# Create a directory for SNMP simulation data
RUN mkdir -p /opt/snmpsim/data

# Set the working directory
WORKDIR /opt/snmpsim

# Expose the SNMP port
EXPOSE 161/udp

# Command to run the SNMP simulator
RUN addgroup --system snmpsim && adduser --system --ingroup snmpsim snmpsim
USER snmpsim
CMD ["snmpsim-command-responder", "--data-dir=/opt/snmpsim/data", "--agent-udpv4-endpoint=0.0.0.0:161"]
```
### 2. `data` ディレクトリ
`data` ディレクトリは、SNMPシミュレーションに必要なデータを格納するためのディレクトリです。このディレクトリには、SNMPエージェントが使用するMIBファイルやデータファイルを配置します。
以下のような構成にします。
```
data/
└── public.snmprec
```
public.snmprecは、SNMPエージェントが応答するデータを定義するファイルです。
前回と同様の内容を記述しています。
```snmprec:public.snmprec
# sysDescr: A textual description of the entity.
1.3.6.1.2.1.1.1.0|4|Simulated SNMPv2-MIB::sysDescr
# sysObjectID: The vendor's authoritative identification of the network management subsystem.
1.3.6.1.2.1.1.2.0|6|1.3.6.1.4.1.8072.3.2.10
# sysUpTime: The time since the network management portion of the system was last re-initialized.
1.3.6.1.2.1.1.3.0|67|123456789
# sysContact: The contact information for the administrator.
1.3.6.1.2.1.1.4.0|4|admin@example.com
# sysName: An administratively-assigned name for this managed node.
1.3.6.1.2.1.1.5.0|4|SimulatedDevice
# sysLocation: The physical location of this node.
1.3.6.1.2.1.1.6.0|4|DataCenter
# ifIndex: A unique value for each interface.
1.3.6.1.2.1.2.2.1.1.1|2|1
#
# 5 - NULL
1.3.6.1.2.1.2.2.1.4.1|5|
# 64 - IpAddress
1.3.6.1.2.1.2.2.1.5.1|64|192.168.64.1
# 65 - Counter32
1.3.6.1.2.1.2.2.1.6.1|65|12345
# 66 - Gauge32
1.3.6.1.2.1.2.2.1.6.1|66|100000000
# 67 - TimeTicks
1.3.6.1.2.1.2.2.1.6.1|67|987654321
# 68 - Opaque
1.3.6.1.2.1.2.2.1.6.1|68|200000000
# 70 - Counter64
1.3.6.1.2.1.2.2.1.6.1|79|300000000

```

## Dockerコンテナの起動
以下のコマンドを実行して、Dockerコンテナを起動します。
```bash
docker-compose up -d
```
このコマンドを実行すると、`snmpsim` コンテナがバックグラウンドで起動します。コンテナが正常に起動したことを確認するには、以下のコマンドを実行します。
```bash
docker-compose ps
```
正常に起動している場合、以下のような出力が表示されます。
```bash
NAME      IMAGE         COMMAND                   SERVICE   CREATED          STATUS          PORTS
snmpsim   002-snmpsim   "snmpsim-command-res…"   snmpsim   46 minutes ago   Up 46 minutes   0.0.0.0:161->161/udp
```

## SNMPシミュレーションの実行
SNMPシミュレーションを実行するには、以下のコマンドを実行します。
```bash
snmpwalk -v 2c -c private localhost
```
このコマンドを実行すると、SNMPエージェントが応答します。SNMPシミュレーションの結果は、コンソールに表示されます。

## まとめ
SNMPシミュレーション環境をDockerで構築することで、簡単にSNMPエージェントのシミュレーションが可能になります。Dockerを利用することで、環境構築が容易になり、他のプロジェクトとの依存関係を気にせずにSNMPシミュレーションを行うことができます。
この手法を利用して、SNMPエージェントのテストやデバッグを行うことができます。SNMPシミュレーション環境は、ネットワーク管理や監視の分野で非常に役立つツールですので、ぜひ活用してみてください。