「体験しながら学ぶ ネットワーク技術入門」のテスト環境でネットワーク管理も体験する方法

# はじめに

「体験しながら学ぶネットワーク管理技術入門」

https://www.sbcr.jp/product/4815618599/

のテストネットワークではネットワーク管理の体験ができません。
そこで、ネットワーク管理も体験できるようにするための方法を解説します。
具体的には

- 自宅側のネットワークにTWSNMP FCというSNMPマネージャを設置
- 自宅側のネットワークのルーターとスイッチにSNMPエージェント,NetFlow,syslog,LLDP対応ソフトをインストール
- それらのソフトを設定して起動

する方法の説明です。


TWSNMP FCは、日本でよく使われているSNMPマネージャTWSNMPの後継ソフトで、コンテナでも動作します。
詳しくは、

https://note.com/twsnmp/n/nc6e49c284afb

をみてください。


# 必要な環境

「体験しながら学ぶネットワーク管理技術入門」で紹介されているWSL2が動作する Windows11のパソコン、MultipassかUTMが動作するMac、Linuxが動作するPCでOKです。メモリー8GBあればOKだと思います。
本にも紹介されていますが、
WSL2 Ubuntuをインストールする方法は

https://note.com/hiro20180901/n/nc798a07485e2

などをみてください。
後々、UbuntuのIPアドレスが必要になるので、ここで確認しておくとよいです。

```terminal
$ip a

```

のコマンドです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874862/51d83338-fbf9-8e29-1d28-a613799c4ee4.png)


Macの場合は
本で紹介されているMultipass

https://multipass.run

本では、home brewでインストールする方法が紹介されていますが、現在は、Mac版のインストラーが用意されていて簡単にインストールできます。
または、UTM

https://mac.getutm.app

でも環境をつくれると思います。


# テストネットワーク環境のセットアップ

本に紹介されている方法でセットアップします。

https://www.sbcr.jp/support/4815617794/

からファイルはダウンロードできます。
Kindle版の試し読みの範囲にセットアップ方法が記載されています。
ダウンロードしたファイルの中のspec_01.yamlを変更していきます。
何か好きなディレクトリ(twsnmpとか）を作ってspec_01.yamlをspec.yamlという名前でコピーします。


# 自宅側にTWSNMP FCを追加


自宅側にTWSNMP　FCを追加します。

## twsnmpノードの定義

spec.yamlのnodes-cl3の定義の後に

```yaml:spec.yaml
- name: twsnmp
    net_base:　bridge
    image:　twsnmp/twsnmpfc
    interfaces:　
      - { name:　eth1, type:　direct, args:　sw1#port5 }
    mounts:　 
      - /mnt/c/tinet:/tmp/tinet
      - /mnt/c/tinet/twsnmp/datastore:/datastore
    docker_run_extra_args:　 -p 8080:8080

```

を追加します。

Apple CPU(M1/M2/M3/M4)のMacの環境の場合は、

```yaml:spec.yaml
- name: twsnmp
    net_base:　 bridge
    image:　twsnmp/twsnmpfc:arm64_v1.45.0
    interfaces:　
      - { name:　eth1, type:　direct, args:　sw1#port5 }
　　　mounts: 
      - /mnt/c/tinet:/tmp/tinet
      - /mnt/c/tinet/twsnmp/datastore:/datastore
    docker_run_extra_args: -p 8080:808
```

です。ARM６４版のDockerイメージを使います。
ネットワークをbridgeにするのと８０８０番ポートを公開するのがポイントです。

tinetを使っているUbuntuに
/mnt/c/tinet/twsnmp/datastore
のディレクトリは作成しておいてください。

## twsnmpノード設定

node_configs-cl3の定義の後に

```yaml:spec.yaml
- name: twsnmp
    cmds:　
      - cmd:　ip addr add 192.168.11.200/24 dev eth1
      - cmd:　apk update
      - cmd:　apk add ethtool
      - cmd:　ethtool -K eth1 tx off rx off tso off gso off gro off
      - cmd:　route add -net 10.0.0.0/8 gw 192.168.11.254
```

IPアドレスの設定、ethtoolをインストールしたあと、ethtoolでLANポートのoffloadをすべてoffにします。こうしないとルータとSNMPの通信でできません。これでTWSNMP FCのノードは追加できましたが、接続先のスイッチ(sw1)にポートがないので、このままではエラーになります。

# 自宅側のルーター(rt1)の変更

元のspec_01.yamlで利用されているルーターのDcokerイメージには、snmpdなどのネットワーク管理に必要なソフトがインストールされていません。インストールしたDcokerイメージを作る必要があります。
tinetにはbuildコマンドがあり、設定から必要なイメージをビルドできます。


## rt1ノードの定義

```diff_yaml:spec.yaml
 - name: rt1
-    image: sphalerite1313/frr-iptables-dnsmasq
+    image: frr-iptables-dnsmasq__nm
+    buildfile: Dockerfile_rt1
    interfaces:　
      - { name: net0, type: direct, args: rt2#net0 }
      - { name: net1, type: direct, args: sw1#port4 }
　　　dns: 10.1.2.53
　　　mounts:　/mnt/c/tinet:/tmp/tinet

```

のように変更します。imageの名前とbuildfileでビルドするDockerfileを指定します。

## rt1のDockerfile

同じディレクトリにDockerfile_rt1を作成します。

```dockerfile:Dockerfile_rt1
FROM sphalerite1313/frr-iptables-dnsmasq
RUN apt update && apt install -y snmpd lldpd softflowd frr-snmp snmp rsyslog
```

Apple CPU のMac環境では

```dockerfile:Dockerfile_rt1
FROM sphalerite1313/frr-iptables-dnsmasq_arm
RUN apt update && apt install -y snmpd lldpd softflowd frr-snmp snmp rsyslog
```

です。元(FROM)のイメージをARM用に変えます。
ネットワーク管理に必要なパッケージを追加でインストールしています。

## rt1ノードの設定

node_config-rt1の最後の方に、

```yaml
      - cmd: bash -c "echo -e '*.* @192.168.11.200' > /etc/rsyslog.d/60-twsnmp.conf"
      - cmd: /etc/init.d/rsyslog start
      - cmd: bash -c "echo -e 'agentaddress  udp:161' > /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'master  agentx' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'view   all  included   .1' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'rocommunity  public default -V all' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'sysServices 72' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'sysLocation labo' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'sysContact  Me <me@example.org>' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'trap2sink 192.168.11.200 trap' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'rouser _internal' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'createUser _internal MD5 _internalPassword DES' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'agentSecName _internal' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'linkUpDownNotifications yes' >> /etc/snmp/snmpd.conf"
      - cmd: /usr/sbin/snmpd -LSwd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux -p /run/snmpd.pid
      - cmd: /usr/sbin/lldpd -x
      - cmd: bash -c "echo -e 'interface=net0' > /etc/softflowd/default.conf"
      - cmd: bash -c "echo -e 'options=\"-n 192.168.11.200:2055 -v 10 -T ether\"' >> /etc/softflowd/default.conf"
      - cmd: /etc/init.d/softflowd start
```

を追加します。

やっていることは

- syslogサーバー(rsyslogd)を設定して起動
- SNMPエージェント(snmpd)を設定して起動
- lldpdをSNMPエージェント機能付きで起動
- softflowdをIPFIXモードに設定して起動（インターネット側をモニタ）

です。

syslog,TRAP,NetFlowの送信先は、TWSNMP FCになっています。

rt1の設定の

```yaml
    - cmd: bash -c "echo -e 'dhcp-range=192.168.11.101,192.168.11.253,1h              ' >> /etc/dnsmasq.conf"
  
```
の行は削除しておいたほうが安全です。DHCPでアドレスを割り当てる範囲からTWSNMP FCのアドレスを除外するためです。

# 自宅スイッチの(sw1)の変更

スイッチも同じようにネットワーク管理機能付きのイメージをビルドして使います。また、TWSNMP　FCを接続するポートを増設して管理できるようにIPアドレスを設定します。

## sw1ノードの定義

nodes-sw1の定義を

```diff_yaml:spec.yaml
  - name: sw1
-   image: sphalerite1313/ovs
+   image: ovs_nm
+   buildfile: Dockerfile_ovs
    interfaces:　
      - { name:　port1, type:　direct, args:　cl1#net0 }
      - { name:　port2, type:　direct, args:　cl2#net0 }
      - { name:　port3, type:　direct, args:　cl3#net0 }
      - { name:　port4, type:　direct, args:　rt1#net1 }
+     - { name:　port5, type:　direct, args:　twsnmp#eth1 }
    dns:　127.0.0.1
    mounts:　/mnt/c/tinet:/tmp/tinet

```

のように変更します。
Dockerイメージをビルドするように変更したのと、port5を増設してtwsnmpと接続しました。

## sw1のDockerfile

spec.yamlと同じディレクトリにDockerfile_ovsを作成します。
内容は

```Dockerfile
FROM sphalerite1313/ovs
RUN apt update && apt install -y snmpd lldpd softflowd snmp rsyslog
```

## sw1ノードの設定

node_config-sw1に

```yaml
      - cmd: ovs-vsctl add-port sw1 port5
      - cmd: ethtool -K port5 tx off rx off tso off gso off gro off
      - cmd: ip addr add 192.168.11.101/24 dev port5
      - cmd: bash -c "echo -e '*.* @192.168.11.200' > /etc/rsyslog.d/60-twsnmp.conf"
      - cmd: /etc/init.d/rsyslog start
      - cmd: bash -c "echo -e 'agentaddress  udp:161' > /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'master  agentx' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'view   all  included   .1' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'rocommunity  public default -V all' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'sysServices 72' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'sysLocation labo' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'sysContact  Me <me@example.org>' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'trap2sink 192.168.11.200 trap' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'rouser _internal' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'createUser _internal MD5 _internalPassword DES' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'agentSecName _internal' >> /etc/snmp/snmpd.conf"
      - cmd: bash -c "echo -e 'linkUpDownNotifications yes' >> /etc/snmp/snmpd.conf"
      - cmd: /usr/sbin/snmpd -LSwd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux -p /run/snmpd.pid
      - cmd: /usr/sbin/lldpd -x
      - cmd: bash -c "echo -e 'interface=net0' > /etc/softflowd/default.conf"
      - cmd: bash -c "echo -e 'options=\"-n 192.168.11.200:2055 -v 10 -T ether\"' >> /etc/softflowd/default.conf"
      - cmd: /etc/init.d/softflowd start

```

 を追加します。port5を追加してIPアドレスを設定しています。syslogやsnmpdの設定と起動はルーターと同じです。NetFlowは、ルーターとの通信
をモニターしています。


# テストの追加

testの最後に

```yaml
    - cmd: docker exec twsnmp ping -c2 192.168.11.254
    - cmd: docker exec twsnmp ping -c2 10.1.3.12

```
を追加します。TWSNMP FCノードの動作確認のためです。


# checkの実行

tinetのcheckコマンドで確認します。


```terminal
#tinet check
```

何も表示なければ、問題なしです。接続の間違いなどを指摘してくれます。


# Dockerイメージのビルド

ルーターとスイッチのDockerイメージをtinet buildコマンドでビルドします。

```terminal
#tinet build | sh -x
```

# 起動

tinetのupconfコマンドで起動します。


```terminal
#tinet uoconf | sh -x
```

いろいろコマンドを実行してすべてのノードを起動できるはずです。

# テスト

tinetのtestコマンドでテストします。

```terminal
#tinet test | sh -x
```

PINGが実行されればOKです。


# TWSNMP FCにアクセス

TWSNMP　FCは、UbuntuのIPアドレスの8080番ポートからアクセスできるはずです。
WindowsまたはMacのブラウザーから
http://<UbuntuのIPアドレス>:8080でアクセスすれば

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874862/4bd41770-5e79-3857-f8b4-c5e8f4a9071a.png)

の画面が表示されるはずです。

ここまでくれば、

https://note.com/twsnmp/n/nc6e49c284afb

の「ブラウザーからアクセス」の項目から先を試して見られます。
自動発見では

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874862/292592a5-af39-3aca-0ac6-a3a965479811.png)

クティブモードに設定して、「自動IP範囲」のボタンを押せば、
192.168.11.0-192.168.11.254の範囲が表示されるはずです。別のアドレスが表示されるときは、何度か押してみてください。
＜開始＞すれば、ノードを５つ発見するはずです。sw1とrt1はSNMP対応になっているはずです。


マップ上を右クリックして「新規ネットワーク」を実行します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874862/ed560e28-a76e-8b51-075f-6916a394c089.png)

sw1のアドレス192.168.11.101を入力して名前にsw1を設定して保存すれば、しばらくして、sw1のポートが表示されるはずです。

「システム設定」ー「マップ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874862/101d4716-651d-ddae-f3c6-180fb790b4b7.png)

でsyslog,SNMP TRAP,NetFlowをONすれば、ルーターとスイッチからのログやTRAPを受信できるようになるはずです。

# 管理対象のネットワークの構成

TWSNMP FCのマップをいろいろ編集すれば

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874862/7129f757-1e5f-4f77-005e-d7a92cf1ef1d.png)



のような構成図が描けます。