ブログ不精なもので久しぶりの投稿となります。
仕事をしている中で、製品にとある不具合が起き、色々調べててなるほどなと思ったことがありましたので、それを記事にしていこうかと思います。
つい最近、出荷済みの製品1台に関して、「サーバに接続できない」という報告がありました……。
1. 通信構成の概要
本製品は、以下のような構成で閉域網ネットワーク内のサーバと通信する設計になっています。
- 製品内部に通信基盤を搭載
- 通信基盤にはLANポートが2つあり、そのうち1つを使用
- 通信基盤のLAN1ポートを製品内のルータと接続
- ルータには閉域網SIMを挿入
- 閉域網を通じて外部サーバとWebSocket通信を行う
使用するIPアドレス(仮)
※以下のIPアドレスは全て解説用の仮アドレスです。
- 通信基盤 LAN1(使用ポート)
- IPアドレス:192.168.10.2
- デフォルトゲートウェイ:192.168.10.1(ルータ)
- DNSサーバ:192.168.10.1(ルータ) - 通信基盤 LAN2(未使用ポート)
- IPアドレス:192.168.20.2 - ルータ(ローカルIP):192.168.10.1
- ルータ(閉域網IP/グローバル相当):10.100.200.1
- 相手先サーバ(閉域網内):10.100.200.100
2. 正常な接続構成の図解
以下は、意図された正常な通信構成を示した図です。
図1:正常な通信構成(※図は下部に添付)
+----------------------------+ LAN1 (192.168.10.2)
| 通信基盤 |--------------+
| (WebSocket Client)| |
+----------------------------+ |
v
+-------------------------+
| ルータ |
| - ローカルIP: |
| 192.168.10.1 |
| - 閉域網IP: |
| 10.100.200.1 |
+-------------------------+
|
v
閉域網(10.100.200.0/24)
|
v
+-----------------------------+
| 相手先サーバ |
| IP: 10.100.200.100 |
+-----------------------------+
この構成では、通信基盤がルータのローカルIP(192.168.10.1)をデフォルトゲートウェイおよびDNSサーバとして使用し、ルータを経由して閉域網内のサーバに接続します。
3. 発生した問題と原因の分析
結論から書くと、接続できなかった原因は、通信基盤の未使用ポート(LAN2)に対する誤ったIPアドレス設定によるものでした。
と、言いますのも、不具合について伝えられた際に、「出荷段階で誤ってLAN2ポートに接続先サーバのIPアドレス(10.100.200.100)を設定してしまっている」ということも伝えられていたのです。なので、真っ先にそれが原因ではないかと疑いました
具体的には、LAN2に相手先サーバと同じIPアドレス(10.100.200.100)を設定してしまい、それによりループバックが発生してしまっていました。
※ループバックとは、通信先のIPアドレスが自機内のインターフェースに設定されている場合に、パケットが外部に出ず内部で処理されてしまう現象です。
このため、通信基盤は本来ルータに送るべきパケットを内部で完結させてしまい、パケットがルータを経由して外部へ出ていかない状態となっていたのです。
4. まとめ
本件では、未使用ポートへの誤設定により、ループバックが発生し、通信が成立しないという現象が発生しました。物理接続に問題がない場合でも、IP設定の整合性とネットワークインターフェースの明確な管理が重要であることを再確認する事例となりました。
ちなみに、ついでに調べたのですが、仮にLAN2ポートに設定したIPアドレスが相手サーバと同一ネットワークに属する別の値(例:10.100.200.200)だった場合も失敗するようです。LAN2ポートのネットワーク内に相手サーバがあると判断されて、デフォルトゲートウェイを通して外部ネットワークとの通信を行おうとしないんですね。
製品に不具合があったのは問題ですが、調べてて「ネットワークってちょっと面白いな」と思いました。