ネットワーク調査の方法
時折、原因不明の挙動を見せるのがネットワークです。経路中のケーブルやHUB、ルータといった通信機器の故障だけでなく、直接接続されていない付近にある電子機器や電気系統の故障が原因で断線状態になったりすることもあります。
最近ではSSL通信がデフォルトで得られる情報も少なくなってしまいまいたが、そのような時の調査の一例を覚書として残しておきます。
ルーターでSyslogを出力する
かつて Debian(Linux)のログについてでも少し触れましたが、ルーターにはSyslogという共通フォーマットに則ったログを出せる機能があることが多いです。
Syslogの利点はその記録を管理サーバーに送信できる点です。ルーター内だけで保存しておこうとするとどうしても容量制限が問題になってくるので、これを使ってディスク容量に余裕のあるサーバーにログを保存します。
またログサーバーのOSにある豊富なライブラリから正規表現やスクリプトによるログ精査なども容易になります。
ここでは筆者の保有しているアライドテレシスのAR415Sを例にSyslogを出力してサーバーに転送する設定をしてみます。
# ログ出力を有効にします。(通常有効になっています) >ENABLE LOG OUTPUT # ログ出力の設定です。 # OUTPUT=1では出力のインデックスを1に # DESTINATION=SYSLOGではログをSYSLOGモードに # SERVER=192.168.1.1ではSYSLOGサーバーのIPを # FACILITYではSyslognoのファシリティをLOCAL2に指定しています。 >CREATE LOG OUTPUT=1 DESTINATION=SYSLOG SERVER=192.168.1.1 FACILITY=LOCAL2 # フィルタリングのルールを設定します。ここではすべてのログを転送します。 >ADD LOG OUTPUT=1 FILTER=1 ALL # 状態を確認するには >SHOW LOG OUTPUT # フィルター込で状態を確認するには >SHOW LOG OUTPUT FULL # ログ出力の設定を削除するには >DELETE LOG OUTPUT=1 FILTER=ALL >DESTROY LOG OUTPUT=1
Syslogサーバーの方はDebianのRSYSLOGを利用しています。
デフォルトでは外部からのログは記録されないようになっているので、その設定をします。
/etc/rsyslog.confのmodulesにあるsyslog receptionのコメントアウトを外します。ここではUDPの514番を利用しているので次のように有効化させました。
module(load="imudp")
input(type="imudp" port="514")
SNMP
SNMP(Simple Network Management Protocol)はネットワーク上の機器を監視するためのプロトコルで主にUDPのポート161番と162番を使います。ルーターがこれに対応していれば、例えばポート毎の転送量やリンク状態といった情報が得られます。機器起きた事象を記録してlogとして転送するSyslogに対して、SNMPは機器のリアルタイムの状態を確認できるプロトコルです。
この仕組みは、マネージャとエージェントに別れます。ルーターにこのエージェント機能があればマネージャーからの問い合わせに答えたり、TRAPといって自らマネージャーに情報を送ることができます。これらはMIB(Management Information Base)という規格化されたデータベース内に保持します。
ルーターにSNMPのTRAPを送信する設定をします。先と同様にAR415Sでの設定を紹介します。
>ENABLE SNMP
# コミュニティ名と呼ばれるパスワードを兼ねる文字列を決めます。
# 慣例では、読み込み専用のコミュニティ名はpublic 書き込みができる場合はprivateという名前になっています。
> CREATE SNMP COMMUNITY=public ACCESS=READ
# 管理ホストとトラップホストを設定します。管理ホストのREAD要求に答え、またトラップホストにTRAPを送信します。
> ADD SNMP COMMUNITY=public TRAPHOST=192.168.1.1 MANAGER=192.168.1.1
# トラップ送信を有効にします。
> ENABLE SNMP COMMUNITY=public TRAP
# リンクアップダウンのトラップを有効にします。
> ENABLE INTERFACE=eth0 LINKTRAP
# 状況を確認します
> SHOW SNMP
# 上記の設定を削除するには次のようにします。
> DESTROY SNMP COMMUNITY=public
# 設定を削除したら、SNMPも止めておきます。
> DISABLE SNMP
次にDebianサーバーの設定をします。trapを受信するには、smtptrapdを使います。この方法はネットワークチェンジニアとして:「snmptrapd 設定方法」を参考にさせていただきました。
SNMP TRAPでは通常UDPの162番ポートが使われますのでファイアウォールを通過できるようにしておいてください。
...
# apt install snmptrapd
...
設定ファイルは/etc/snmp/snmptrapd.confにあります。次のようにします。logはログ出力、executeはプログラムの実行、netは他のサーバーへの転送を許可する設定です。publicはコミュニティ名です。
authCommunity log,execute,net public
これでsnmptrapdを再起動すれば、サーバーはルーターからのTRAPデータを受け取りSyslogに出力するようになります。ただしそのままの状態だと非常にわかりづらいデータなので、監視ツールなどに転送して管理するのが一般的です。この監視ツールにはZabbixやnagiosなどがあります。
サーバをSNMPマネージャーにして定期的に監視対象からデータを取得したり、TRAPで受け取ったデータを蓄積することを考えているのなら、「SNMPをDebian10のZabbix5.2で」の記事も参考にしてみてください。
パケット監視
SNMPはトラフィックや装置のリンクのアップダウンを検知して把握することができました。ここからさらに通信を調べたい場合はポートミラーリングによるパケット監視をします。
ミラーリングとはパケットをコピーする機能です。現在主流になっているスイッチングハブは経路を記憶し経路外のポートにはパケットを流しませんが、ミラーリングが可能なHUBを使ってそれを指定するとそのHUBに出入りするパケットをすべてコピーのポートに転送してくれます。
観測対象となる機器と現在使っているスイッチの間にミラーリングができるHUBを設置し、一方は元のスイッチへもう一方は記録用のPCにつなぎます。
ちなみにトップ画像になっているのがNETGEAR製のミラーポートを設定できるHUBです。
Debianならtcpdump、windowsならWireSharkなどを使ってコピーしたパケットデータを保存します。よくHTTP上のBASIC認証が危険だというのはこういうパケット監視でデータ中身を見るとパスワードがほぼそのまま含まれているからです。
筆者は記録用のPCにDebianを使いますので、tcpdumpを使ってログをディスクへ保存します。tcpdumpの使い方はDebianでtcpdumpの記事も参考にしてください。
...
# apt install tcpdump
...
インストールが終わったら実行します。nohupと&をつけることでコンソールを切断しても、バックグラウンドで実行し続けます。-wオプションで出力したデータはあとから-rオプションで読み込むことができます。
nohupで実行したtcpdupを止めるには「pkill tcpdump」を使います。他「ps x」を使ってプロセス番号を探して止める方法もあります。
tcpdumpを実行するときは、試しに短い時間で実行してみて十分空き容量があるのを確認した上で実行しましょう。データが大きくなりすぎるようならフィルタで絞り込みます。
表示されるデータはオプションやプロトコルによっても変わりますが、TCP通信の例を挙げると次のようになります。
フォーマットの詳細はtcpdumpのmanやTCPDUMPの出力を見てみように掲載されています。
主に確認するのは、先頭部の[時刻] [プロトコル] [送信元IP.ポート] > [宛先IP.ポート]の部分だと思います
間違いなく送信しているか、送信に対するレスポンスがあるか、さらにそのレスポンスは?といった具合に追いかけていきます。
21:16:09.903363 IP testdeb.ssh > 192.186.1.1.53270: Flags [P.], seq 676544:676788, ack 253, win 501, length 244
2点間の単純な疎通状態の確認ならtcpdumpよりpingを使った方が早いと思います。Debianのpingはデフォルトで無制限に実行できます。-iオプションで間隔を秒数で指定してリダイレクトで保存します。この時のxargsでの時刻のつけ方はQuiita:「pingに日時(タイムスタンプ)をつける」を参考にさせていただきました。
参考にさせていただきましたサイトの皆様ありがとうございました。