IPv4 アドレスでフィルタリングしようとしているのに、現在 IPv6 アドレスでフィルタリングしています! これが、IPAddress.ToString() がコロン 16 進表記で IP を返す理由です。
IPv4 アドレスでフィルタリングするには、代わりに AddressFamily.InterNetwork に従ってフィルタリングする必要があります。
if (ipa.AddressFamily == AddressFamily.InterNetwork)
{ }
あなたが公開アドレスを取得したいということは承知しています。リストしたコードは、プライベート (ローカル) アドレスを返します!
Windows オペレーティング システムは、パブリック IP を気にしません。オペレーティング システムは、定義されたゲートウェイにルーティングするだけで、詳細は気にしません。パブリック IP を解決する唯一の方法は、外部システムにクエリを実行することです。外部の助けが必要です。
パブリック アドレスを取得する最も信頼できる方法は、パブリック アドレスを解決してプレーンテキストで出力できる外部 Web サーバーに接続することです。あなたの質問には、すでに適切なサービスがリストされています。自分でサービスを提供することで、サービスの責任を負うこともできます。これを実現するための PHP コードは非常に単純です。
ルーターが UPnP (または SNMP) をサポートしている場合、ルーターにクエリを実行できますが、これは機能しない可能性があります。あなたのマシンにはこれで十分かもしれませんが、一部のルーターは UPnP をサポートしておらず、セキュリティ意識の高いユーザーはセキュリティ ホールのために UPnP を無効にしている可能性があります。管理された UpNp ライブラリについては、この SO の質問を参照してください。
tracertを使用して、確立された Web サイト (オンラインになることがわかっている Web サイト) にアクセスでき、最初の「ホップ」がルートになることを読みました。私はこれを試したことがありません。