3. ネットワークのトラブルシューティング

自分の赴任先でのネットワークのトラブルシューティングについて記載していこうと思います。

自分が赴任しているテクニカルカレッジでは、LAN (Local Area Network) とWiFiの2つのネットワークを使用しています。LANは社内サーバと接続していて共有フォルダを使用したりと仕事や勉強用で、WiFiはスマートフォンなどでインターネットが使えるように生徒向けに用意されています。WiFiまたはLANが繋がらない (インターネットが繋がらない) などの連絡は教職員からしょっちゅう掛かってきます。

WiFiが繋がらない場合

原因①:各棟のWiFiルータと接続しているスイッチが何らかの不具合
原因②:全てのWiFiルータと接続しているスイッチが何らかの不具合
原因③:ベンダー側の問題

WiFiが繋がらないと言われたら、原因②のスイッチをOFF/ONするか、明日も繋がらなかったら連絡してと先送りします(安定してないから翌日になると繋がるようになることもよくあるのと、この問題に逐一対応していたらキリがないので)。それでも特定の棟のみ繋がらないのであれば、原因①のスイッチをOFF/ON。大抵は上記対応で復旧します。それでも復旧しない場合は、ベンダー側の不具合と判断し、ベンダーへコールします。

※ 上記スイッチのIPアドレスとかパスワードも不明なままですが、ボツワナなので上記対応で充分かなと思い、調査していません。

LANが繋がらない場合(特定のPCのみ)

原因:電話を間に挟んでデスクトップPCと壁のLANポートが接続されているが、LANポートに問題があったり、接触に問題があったりする。

デスクトップと電話間のLANケーブルを抜き差し、電話と壁のLANポート間のLANケーブルを抜き差し。電話のアダプターを抜き差し。大抵これで復旧するが、それでも復旧しない場合はLANケーブルの交換や電話のアダプターの交換を試みる。それでもダメな場合は壁のポート故障なので(まれにPCのNIC故障の場合もあり)、諦める。壁のポート故障はとても多く(設立して5年くらいしか経ってないのに、3割くらい壊れている)、ポートの修理や正常なポートからハブを介して利用できるポートを増やすように提案しているが、ボツワナなのでほとんど進展がありません。

LANが繋がらない場合(カレッジ全体)

原因①:カレッジ内のサーバやスイッチのトラブル
原因②:ベンダーのネットワークのトラブル
原因③:政府系ITネットワークのトラブル

テクニカルカレッジはボツワナに8校あり、いずれも政府系ITネットワークに属しています。政府系ITネットワークとカレッジのネットワークはベンダーのルータで接続されています。pingコマンドでカレッジの内外に対して疎通ができるか確認し、外のみ疎通不可の場合は原因②か③のどちらかで、そして度々あることなので、1日様子を見ます。翌日も復旧していない場合は、ガバメントまたはベンダーへ連絡して、状況を確認します。LAN経由でインターネットに接続できない場合、大抵の問題はこちらです。

カレッジ内で疎通不可の場合は、全サーバ&ネットワーク機器に対してpingを打ち、被疑箇所を確認します。赴任時にスイッチのコンフィグが飛んでいたという問題があったが、基本的にはサーバダウンしているか、ネットワークループが発生しているかのどちらかです。ネットワークループが発生している場合のSwitchのトラフィックは、下記のように50-100%近くになっています。

loop

■全サーバ&ネットワーク機器に対してpingするシェルスクリプト (check.sh)
IP.lstというファイルを読み込んで、該当IPアドレスへpingを実行して結果を表示します。正常時でもパケットロスすることもあるので、パケットロスがあった場合はもう一度実行し、2回ともパケットロスが確認された場合のみNGの結果を返します。併せて名前解決が問題なく処理できているかチェックしています。

・check.sh

#!/bin/sh

#############
# ping check
#############

echo -e "\n ### ping check ### \n"

while read LINE
do
    n=0
    while [ $n -lt 2 ]                          # 2 times continue
    do
        n=`expr $n + 1`
        echo $LINE | awk '{print $1}' > ip.tmp
        IP=`cat ip.tmp`
        echo $LINE | awk '{print $2}' > host.tmp
        HOST=`cat host.tmp`
        ping -c 3 $IP | grep " 0% packet loss" > /dev/null
        if [ $? -eq 0 ] ; then                  # ping OK
            echo -e "[OK] \t $IP \t $HOST"
            break
        elif [ $n -le 1 ] ; then                # ping NG (1 time)
            continue
        else                                    # ping NG (2 times)
            echo -e "[NG] \t $IP \t $HOST"
        fi
    done
done < IP.lst

#############
# DNS check
#############

echo -e "\n ### DNS check ### \n"

DNSSV=xxx.ac.bw
DNSCL1=xxx.ac.bw
DNSCL2=xxx.gov.bw
DNSCL3=xxx.xxx.bw

DNSSVIP1=10.X.X.X
DNSSVIP2=10.X.X.X
DNSCLIP1=10.X.X.X
DNSCLIP2=10.X.X.X
DNSCLIP3=X.X.X.X

### nslookup check ###
GETSVIP=`nslookup $DNSSV | grep Server | awk '{print $2}'`
GETCLIP1=`nslookup $DNSCL1 | grep -v 10.X.X.X | grep Address | awk '{print $2}'`
GETCLIP2=`nslookup $DNSCL2 | grep -v 10.X.X.X | grep Address | awk '{print $2}'`
GETCLIP3=`nslookup $DNSCL3 | grep -v 10.X.X.X | grep Address | awk '{print $2}'`

if [ -z "$GETSVIP" ] ; then
    echo -e "{NG] \t DNS Server could not be found."
    exit 0
fi

### compare ###
if [ $GETSVIP = $DNSSVIP1 ] ; then
    echo -e "[OK] \t $GETSVIP \t DNSSERVER"
elif [ $GETSVIP = $DNSSVIP2 ] ; then
    echo -e "[OK] \t $GETSVIP \t DNSSERVER"
else
    echo -e "{NG] \t $GETSVIP \t DNSSERVER"
fi

for i in 1 2 3
do
    GETCLIP=`eval echo '$'GETCLIP$i`
    DNSCLIP=`eval echo '$'DNSCLIP$i`
    DNSCL=`eval echo '$'DNSCL$i`
    if [ -z $GETCLIP ] ; then                   # DNS Server can't find
        echo -e "[NG] \t Unknown  \t $DNSCL"
    elif [ $GETCLIP = $DNSCLIP ] ; then         # DNS Server can find
        echo -e "[OK] \t $GETCLIP \t $DNSCL"
    else
        echo -e "{NG] \t $GETCLIP \t $DNSCL"
    fi
done

・IP.lst

10.X.X.1	server1
10.X.X.2	server2
10.X.X.3	server3
    :
10.X.X.253	switch1
10.X.X.253	switch2
    :
10.X.X.254	router(college)
    :
10.X.X.254	router(vendor)
10.X.X.254	router(government)
    :
10.X.X.1	server1(government)
10.X.X.2	server2(government)
    :
8.8.8.8		GooglePublicDNS(Internet)

・実行結果

$ ./check.sh

 ### ping check ###

[OK]     10.X.X.1      server1
[OK]     10.X.X.2      server2
[OK]     10.X.X.3      server3
    :

 ### DNS check ###

[OK]     10.X.X.X      DNSSERVER
[OK]     10.X.X.X      xxx.ac.bw
[OK]     10.X.X.X      xxx.gov.bw
[OK]     XX.X.X.X      xxx.xxx.bw
$