はじめに
「体験しながら学ぶネットワーク管理技術入門」
のテストネットワークではネットワーク管理の体験ができません。
そこで、ネットワーク管理も体験できるようにするための方法を解説します。
具体的には
- 自宅側のネットワークにTWSNMP FCというSNMPマネージャを設置
- 自宅側のネットワークのルーターとスイッチにSNMPエージェント,NetFlow,syslog,LLDP対応ソフトをインストール
- それらのソフトを設定して起動
する方法の説明です。
TWSNMP FCは、日本でよく使われているSNMPマネージャTWSNMPの後継ソフトで、コンテナでも動作します。
詳しくは、
をみてください。
必要な環境
「体験しながら学ぶネットワーク管理技術入門」で紹介されているWSL2が動作する Windows11のパソコン、MultipassかUTMが動作するMac、Linuxが動作するPCでOKです。メモリー8GBあればOKだと思います。
本にも紹介されていますが、
WSL2 Ubuntuをインストールする方法は
などをみてください。
後々、UbuntuのIPアドレスが必要になるので、ここで確認しておくとよいです。
$ip a
のコマンドです。
Macの場合は
本で紹介されているMultipass
本では、home brewでインストールする方法が紹介されていますが、現在は、Mac版のインストラーが用意されていて簡単にインストールできます。
または、UTM
でも環境をつくれると思います。
テストネットワーク環境のセットアップ
本に紹介されている方法でセットアップします。
からファイルはダウンロードできます。
Kindle版の試し読みの範囲にセットアップ方法が記載されています。
ダウンロードしたファイルの中のspec_01.yamlを変更していきます。
何か好きなディレクトリ(twsnmpとか)を作ってspec_01.yamlをspec.yamlという名前でコピーします。
自宅側にTWSNMP FCを追加
自宅側にTWSNMP FCを追加します。
twsnmpノードの定義
spec.yamlのnodes-cl3の定義の後に
- 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の環境の場合は、
- 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
です。ARM64版のDockerイメージを使います。
ネットワークをbridgeにするのと8080番ポートを公開するのがポイントです。
tinetを使っているUbuntuに
/mnt/c/tinet/twsnmp/datastore
のディレクトリは作成しておいてください。
twsnmpノード設定
node_configs-cl3の定義の後に
- 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ノードの定義
- 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を作成します。
FROM sphalerite1313/frr-iptables-dnsmasq
RUN apt update && apt install -y snmpd lldpd softflowd frr-snmp snmp rsyslog
Apple CPU のMac環境では
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の最後の方に、
- 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の設定の
- 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の定義を
- 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を作成します。
内容は
FROM sphalerite1313/ovs
RUN apt update && apt install -y snmpd lldpd softflowd snmp rsyslog
sw1ノードの設定
node_config-sw1に
- 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の最後に
- 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コマンドで確認します。
#tinet check
何も表示なければ、問題なしです。接続の間違いなどを指摘してくれます。
Dockerイメージのビルド
ルーターとスイッチのDockerイメージをtinet buildコマンドでビルドします。
#tinet build | sh -x
起動
tinetのupconfコマンドで起動します。
#tinet uoconf | sh -x
いろいろコマンドを実行してすべてのノードを起動できるはずです。
テスト
tinetのtestコマンドでテストします。
#tinet test | sh -x
PINGが実行されればOKです。
TWSNMP FCにアクセス
TWSNMP FCは、UbuntuのIPアドレスの8080番ポートからアクセスできるはずです。
WindowsまたはMacのブラウザーから
http://:8080でアクセスすれば
の画面が表示されるはずです。
ここまでくれば、
の「ブラウザーからアクセス」の項目から先を試して見られます。
自動発見では
クティブモードに設定して、「自動IP範囲」のボタンを押せば、
192.168.11.0-192.168.11.254の範囲が表示されるはずです。別のアドレスが表示されるときは、何度か押してみてください。
<開始>すれば、ノードを5つ発見するはずです。sw1とrt1はSNMP対応になっているはずです。
マップ上を右クリックして「新規ネットワーク」を実行します。
sw1のアドレス192.168.11.101を入力して名前にsw1を設定して保存すれば、しばらくして、sw1のポートが表示されるはずです。
「システム設定」ー「マップ」
でsyslog,SNMP TRAP,NetFlowをONすれば、ルーターとスイッチからのログやTRAPを受信できるようになるはずです。
管理対象のネットワークの構成
TWSNMP FCのマップをいろいろ編集すれば
のような構成図が描けます。