質問: ((IPEndPoint)ClientSocket.RemoteEndPoint).Address.ToString(); Console.WriteLine(IpAddress); -------------- 出力結果:ロードバランサのIPアドレス -------------- ``` WireShark を使用してパケットモニタリングし、調査した結果、 IP ヘッダにはクライアント PC のIPアドレスが入っていることがわかりました。おそらく、プログラムで取得するやり方が悪いのだと思われるのですが、 IP ヘッダに記載されている IP アドレスを取得する方法がわかりません。 少しでも良いのでヒントになる情報があれば、ご教授くださると助かります。
回答: 考えられるのは 1. .NETのバグ 2. プログラムのバグ 3. クライアントのアドレスがNATされている 4. 実際にロードバランサとサーバが通信している と言うところでしょうか(順不同)。 英語版にも同様の質問がありましたが、proxyじゃないのか、という回答がついてます。 Socket.RemoteEndPoint returns gateway address コメントと重複するところもありますが、一般論として確認する項目や方法を列挙しておきます。 トレース情報の出力 トレース情報の出力を有効にすることで、Socketのトレースがとれます。 ``` System.Net.Sockets Information: 0 : [4292] Socket#45653674 - 192.168.1.2:58849 から 192.168.1.1:22222 への接続を受け入れました。 ``` netstat ``` C:\> netstat -n アクティブな接続 プロトコル ローカル アドレス 外部アドレス 状態 TCP 127.0.0.1:22222 127.0.0.1:51819 ESTABLISHED TCP 192.168.1.1:22222 192.168.1.2:58849 ESTABLISHED ``` 不要分を省略してますが、この例だとサーバのポート(22222)に対して2つの接続があります。 クライアント-サーバの接続が正しく表示されていますか?また、ロードバランサ-サーバの接続がありませんか? パケットダンプ Wireshark等のネットワークアナライザでパケットを取得し確認する。 このとき注意することとしては、「自分の意図どおりのパケット」以外にも注目することです。 今回の例では、PC-サーバ宛てのパケットが「意図通りのパケット」に当たりますが、実はそのパケットではコネクションが張れていないとか、それ以外にロードバランサ-サーバ間の通信が実際に存在したりしませんか。 ロードバランサ ロードバランサは(設計)設定によってクライアントだったりサーバだったりのアドレスを変換します。どのような設定になっているか確認してください。 また、ヘルスチェックを行っている場合、ロードバランサがサーバに接続します。これが意図しない不具合を起こす場合もあります。(ソケットが埋まるなど)