TCP/IP ネットワーク障害対応

システム運用やシステム構築プロジェクトの推進において、ネットワークの不具合の切り分けができると、結構役に立つため、今回、簡単に不具合対応について記事にしました。


# TCP/IPネットワークについて(初めに)

・**ネットワークの全体像の把握**
最低限、下記のモデルに関する理解をしておいてください。
説明について詳細な技術説明は省いております。
何が書いてあるかわからない場合は、Google検索と併用して読み進めてください。

また、ぜひ記事に対する意見があればよろしくお願い致します。


<table>
  <caption>ネットワークの全体像</caption>
  <thead>
    <tr>
      <th>レイヤ</th> <th>OSI参照モデル</th> <th>TCP/IPプロトコルスタック</th> <th>簡略な説明</th>
    </tr>
  </thead>
  <tr>
    <td> L7 </td> <td>アプリケーション層</td> <td rowspan=3>アプリケーション層</td> <td>利用目的</td>
  </tr>
  <tr>
    <td> L6 </td> <td>プレゼンテーション層</td> <td>文字の設定</td>
  </tr>
  <tr>
    <td> L5 </td> <td>セッション層</td><td>通信の手続き</td>
  </tr>
  <tr>
    <td> L4 </td>  <td>トランスポート層</td>  <td>トランスポート層</td> <td>通信品質・稼働サービスの選択</td>
  </tr>
  <tr>
    <td> L3 </td>  <td>ネットワーク層</td>  <td>インターネット層</td>　<td>最終宛先への通信</td>
  </tr>
  <tr>
    <td> L2 </td>  <td>データリンク層</td>  <td rowspan=2>ネットワーク<br>インターフェース層</td> <td>一つ隣への通信</td>
  </tr>
<tr>
    <td> L1 </td>  <td>物理層</td>  <td>電気、光信号、ケーブル</td>
  </tr>
</table>

**■ポイント**
・データリンク層は物理依存層ともいう
　L2 EthernetのCSMA/CDにより、物理的制約(L1)がある
・アプリケーション層（ネットワークを利用するための目的）を動作させるためにその下のレイヤーがある
・L2はLLC（ロジカルリンクコントロール）副層とMAC（メディアアクセスコントロール）副層に分けられる
・ICMP(InternetControlManagementProtocol)はIPの拡張機能
・階層化(上記のモデル)を行うことで、機能ごとに改修、不具合対応がしやすくしている

**上記の理解があると、資料を読みやすいです。**
各層の機能については下記を参照
　・<a href="https://www.infraexpert.com/study/networking3.html">ネスペイージス OSI参照モデル 1


# 不具合の原因切分けについて

前提として、下記のような流れで、不具合原因の切分けを進める。


### １．エラーメッセージから切分け

どういったエラーが出ているかで原因がある程度特定ができる場合があるため、
エラーが出ていないかはネットワークに限らず、システムとかかわっていくうえで重要。


>**例 HTTPステータスコードなど**
>
>4XX　→　クライアント側のエラーの可能性が高い
>
>例えば 404 Not Foundはクライアントのアクセスしようとしているファイルが存在しない
>
>5XX  →　サーバ側のエラーの可能性が高い
>
>例えば、500 Internal Server Errorはサーバ内部の処理にてエラーが発生して、
>処理ができていない場合が多い。



↓他にもたくさんあるので参考までに。

<a href="https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89">HTTPステータスコード Wiki</a>

　

**例 ICMPのエラーメッセージ**
<table>
<caption>引用:<a href="https://beginners-network.com/icmp.html">ICMPコード</a></caption>
 <thead>
 <tr><th>コード</th><th>意味</th><th>説明</th></tr>
 </thead> 
 <tr><td>0</td><td>network unreachable</td><td>相手ルーターがダウンしてarp解決出来ない等</td></tr>
 <tr><td>1</td><td>host unreachable</td><td>サーバーがダウンしてarp解決出来ない等</td></tr>
 <tr><td>3</td><td>port unreachable</td><td>サーバーまでたどり着いたが、ポートが解放されていない</td></tr>
 <tr><td>4</td><td>fragmentation needed and DF set</td><td>フラグメントが必要だがフラグメント不可ビットが有効</td></tr>
 <tr><td>6</td><td>destination network unknown</td><td>宛先ネットワークがルーティングテーブルに載っていない</td></tr>
 <tr><td>13</td><td>communication administratively prohibited by filtering</td><td>管理上遮断されている<td><tr>
</table>

 

引用元のサイトがわかりやすい。

上記の説明でイメージがつかない場合はサイト閲覧推奨。

ついでに、RFCも<a href="http://srgia.com/docs/rfc792j.html">どうぞ</a>


:::note info
ICMP(Internet Control Message Protocol)はIP(Internet Protocol)の拡張機能のようなもの。

不具合対応におけるPingコマンドやTracertなど、ICMPの機能を使用している。

ネットワークにおける問題の診断等を目的として作られている。

:::

また、影響の範囲から不具合の原因がわかる場合もある。

・サービスの利用者全体

 　サーバやインフラ起因による、不具合の可能性が高い

・サービスの利用者のうち、特定のユーザのみ

　特定ユーザ(クライアント側)の設定による、不具合の可能性が高い


 ネットワークにおいては、特定のサブネットだけで不具合が発生など、そういった可能性もあるので、影響範囲も気にする。


### ２．ICMPによる切分け
　
ここが本記事のメイン。

ICMP系のWindowsコマンドはテスト用の通信を送ることで、どこまで通信が正常かを切り分けることが可能

対応方法としては下記がある。

１．一番シンプルな通信(IPアドレスで通信をして名前解決をしない等）から機能を増やしていく。

成功しなかった通信の周辺に不具合がある。

２．一番難しい通信(たくさんの機能を使う通信)から、どんどん機能を落としていく。

どこかでうまくいくようになり、そのうまく言った通信との差分の機能に不具合がある。


### ３．パケットキャプチャによる切り分け

今までのアプローチで切り分けれなかった場合、サーバやクライアント側の設定の問題であったり、
バグであったりする可能性が考えられる。

原因究明としては、パケットキャプチャを行ったり、不具合を複数回再発させて、
同一時間帯に、何かしらログが残っていないかの時間から分析を行う。

今回の記事の範囲外。

※アプリ通信のプロトコルヘッダ構造を覚えるとよい


# Windowsコマンドによる不具合切分け

不具合の切り分けをする際には下記のようなコマンドを使用していく。
全て重要なので、どのコマンドでどういうものを確認したら何がわかるかをしっかり理解する。



### 　ipconfig
　ネットワーク関連の設定を確認できる
　```ipconfig /all```
　設定が想定通りか事前確認
　**※ipconfigでIPアドレスが表示されない場合、LANケーブルが刺さっていない場合がある**

　netshコマンドでも設定の確認はできる（例）
　```netsh interface ipv4 show address```

### 　ping
　疎通確認ができる
　通常時に返答が返ってくるかを事前に確認しておく必要がある。
　※FWで遮断される可能性がある
　いろんなPingの使い方
　例１　ホスト名による疎通確認
　```ping <例 abc>```
　確認できるもの：DNSのサフィックス設定による名前解決+IPアドレスによる疎通

　例２　完全修飾ドメイン名による疎通確認
　```ping <例 abc.example.co.jp>```
　確認できるもの：名前解決+IPアドレスによる疎通

　例３　通信先IPアドレスによる疎通確認
　```ping <例 192.168.123.123>```
　確認できるもの：IPアドレスによる疎通

　例４　デフォルトゲートウェイに対する疎通確認
　(ipconfigでデフォルトゲートウェイを確認）
　```ping <デフォルトゲートウェイIPアドレス>```
　確認できるもの：デフォルトゲートウェイの設定（ルーター）

　例５　自分自身のIPアドレスに対する疎通確認
　```ping <自身のIPアドレス>```
　確認できるもの：自身のNIC（物理的な物）が正常

　例６　ループバックアドレスに対する疎通確認（自分自身）
　```ping 127.0.0.1```
　確認できるもの：PING.exe（プログラム）の正常性
　

　上記のPingテスト後の動きとして下記が考えられる
　■pingが正常な場合
　ルーティングは問題なし
　telnetでポートの正常性を確認する
　
　■pingが異常な場合
　FWでICMPを遮断している
　→この場合は、netstatを使って実際のサーバ（サービス）に対し確認をし、サービスが稼働している場合穴あけもしくはルーティングの不具合の可能性がある

　※見分け方として、通常時のpingを事前確認しておくと安心

　ルーティングに問題がある
　→この場合はtracertを使用して、どこまで正常なのか確認
　
　
### 　tracert
　pingでルーティングに問題がある可能性が高いと判断したときに使用するとよい
　```tracert <宛先IPアドレス>```
　どこまで正常に通信ができているかが確認できる

　■tracertで異常個所がわかったら
　１　どこまで返答が来ているかをもとにその次の経路を特定
　→構成図もしくは構成の理解が必要
　２　異常であろう箇所のネットワーク機器の設定を確認
　→ルーティングテーブル、ACLなど

### 　telnet

　※WindowsはTCPの接続のみ確認可能
　クライアントからポートの確認ができる
　```telnet <接続先のIPアドレス>```

　■telnetが正常な場合
　サーバ上のプログラム（通信の途中）で問題が起きている可能性が高い
　→WireSharkなどによる実際の通信のキャプチャが必要

　■telnetが異常な場合
　サーバのデーモン（待ち受けプログラム）と通信できていない可能性が高い
 netstatによるポートの待ち受け状況を確認

### 　netstat
　通信先サーバへアクセスし,サーバ上で実施する。
　```netstat```
　LISTENしていなければ待ち受けていない
　Linuxの場合はssなどが最近は使われている
　→OSのバージョンなどを確認する
　※プログラムを特定したい場合はプロセスIDを表示するオプションを使用する

### 　nslookup
　pingなどで名前解決に問題がありそうな場合に確認できる
　■一発で確認する場合
　```nslookup <ドメイン名> <ネームサーバ>```

　■対話的に確認（詳細な確認など）
　１```nslookup```
  ２```set type=<レコード名>```
　３```><ドメイン名>```


:::note alert
nslookup はホストファイルの確認はしない
DNSサーバの確認用のコマンド
:::


# 学習方法について
　細かく学びたい場合は、下記を参考

　・<a href="https://www.infraexpert.com/info/netspecial1.html">ネスペイージス</a>(無料)
　　なんでも結構詳しく書いてある。
　　分野を絞って、詳細を知りたいときにお勧め。

　・RFC（Request For Comment）(無料)
　　事実上の標準化文書
　　なぜそういう仕様になったかなどの理由がわかる
　　難しい
　　Wikipediaなどにリンクがある

<a target="_blank" href="https://www.amazon.co.jp/%25E6%2597%25A5%25E7%25B5%258CIT%25E3%2582%25A8%25E3%2583%25B3%25E3%2582%25B8%25E3%2583%258B%25E3%2582%25A2%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25BC%25E3%2583%25AB-%25E3%2583%258D%25E3%2583%2583%25E3%2583%2588%25E3%2583%25AF%25E3%2583%25BC%25E3%2582%25AF%25E3%2583%2597%25E3%2583%25AD%25E3%2583%2588%25E3%2582%25B3%25E3%2583%25AB%25E6%259C%2580%25E5%25BC%25B7%25E3%2581%25AE%25E6%258C%2587%25E5%258D%2597%25E6%259B%25B8-%25E6%2597%25A5%25E7%25B5%258CNETWORK-ebook/dp/B077FG5KXR/ref=sr_1_1?&_encoding=UTF8&tag=cbltowl7309-22&linkCode=ur2&linkId=6889f77e1a55152e0d51031ab9c53bbe&camp=247&creative=1211">ネットワークプロトコル最強の指南書</a>
<img width="150" src="https://m.media-amazon.com/images/I/517sdAb4g+L.jpg"/>

比較的ページ数が少なく、とっつきやすい
内容が簡単かつまとまっている
個人的に全体像を素早く理解したいなら、最推奨

<a target="_blank" href="https://www.amazon.co.jp/%25E3%2583%259E%25E3%2582%25B9%25E3%2582%25BF%25E3%2583%25AA%25E3%2583%25B3%25E3%2582%25B0TCP-IP-%25E5%2585%25A5%25E9%2596%2580%25E7%25B7%25A8%25EF%25BC%2588%25E7%25AC%25AC6%25E7%2589%2588%25EF%25BC%2589-%25E4%25BA%2595%25E4%25B8%258A%25E7%259B%25B4%25E4%25B9%259F-ebook/dp/B0827QNDNT/ref=sr_1_1?&_encoding=UTF8&tag=cbltowl7309-22&linkCode=ur2&linkId=b2d706037847d6a951808b2343aab04a&camp=247&creative=1211">マスタリング TCP/IP 入門編</a>
<img width="150" src="https://m.media-amazon.com/images/I/41GcGJkZ-6L.jpg"/>
入門といえばこれ
ある程度入門書を読んでいるなら 応用からでもOK

<a target="_blank" href="https://www.amazon.co.jp/%25E3%2583%258D%25E3%2583%2583%25E3%2583%2588%25E3%2583%25AF%25E3%2583%25BC%25E3%2582%25AF%25E6%258A%2580%25E8%25A1%2593%25E3%2581%25AE%25E6%2595%2599%25E7%25A7%2591%25E6%259B%25B8-%25E6%2595%2599%25E7%25A7%2591%25E6%259B%25B8%25E3%2582%25B7%25E3%2583%25AA%25E3%2583%25BC%25E3%2582%25BA-%25E9%2595%25B7%25E8%25B0%25B7%25E5%2592%258C%25E5%25B9%25B8/dp/4865751408/ref=sr_1_1?&_encoding=UTF8&tag=cbltowl7309-22&linkCode=ur2&linkId=f909ab13ca6b33cf18f2aa9244e7cd85&camp=247&creative=1211">ネットワーク技術の教科書</a>
<img width="150" src="https://m.media-amazon.com/images/I/610wTVXw0IL._SY291_BO1,204,203,200_QL40_ML2_.jpg">
ネットワーク関連で分からないものがあったら辞書として使える
プロトコルごとのフローや、パケット構造、ネットワーク設計に
近しいような知識など幅広く説明がされている


また、ネットワーク設計についても簡単に記載しておりますので、興味があれば下記のサイトを参考にしてください。

https://qiita.com/eguchi7309/items/69b52743bd5cb10f9249