C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

グローバルIPアドレスで通信する方法

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■102796 / inTopicNo.1)  グローバルIPアドレスで通信する方法
  
□投稿者/ まーくん (1回)-(2024/01/01(Mon) 15:47:34)

分類:[.NET 全般] 

VB.NETを使っていて、
職場と自宅PCの間でデータのやりとりを行うソフトを作りたいと考えています。
TCPによるデータ転送の方法は
https://dobon.net/vb/dotnet/internet/tcpclientserver.html
このページに記載されているものを使用しました。

どうも、職場にあるPC同士でローカルIPアドレスを使用した場合だと
うまく通信できております。

しかし、職場と自宅PCの間で通信しようとするとうまくいきません。
恐らく、ルーターが原因なのではないかと思います。

サーバー側の設定で自身のグローバルIPアドレス
160.237.xxx.xx
をlistenerに設定して、
listener.Start()
を実行すると以下のエラーが発生します。

型 'System.Net.Sockets.SocketException' のハンドルされていない例外が System.dll で発生しました

追加情報:要求したアドレスのコンテキストが無効です。


以下のようにして任意のIPアドレスを受け入れる設定にするとエラーは発生しないのですが、

listener = New System.Net.Sockets.TcpListener(
System.Net.IPAddress.IPv6Any, 2001)
'IPv6Onlyを0にする
listener.Server.SetSocketOption(
System.Net.Sockets.SocketOptionLevel.IPv6,
System.Net.Sockets.SocketOptionName.IPv6Only,
0)

クライアント側から、
160.237.xxx.xx
のIPアドレスに通信しようとしても
いつまで経っても通信が成立しません。

一体、どのように設定すれば良いのでしょうか?

ちなみ、ポートは以下のバッチファイルを使って、解放しております。

netsh advfirewall firewall add rule name="test firewall" dir=in action=allow protocol=tcp localport=2001 profile=private,public localip=any

netsh advfirewall firewall add rule name="test firewall4" dir=out action=allow protocol=tcp remoteport=2001 profile=private,public remoteip=any



引用返信 編集キー/
■102797 / inTopicNo.2)  Re[1]: グローバルIPアドレスで通信する方法
□投稿者/ Azulean (1295回)-(2024/01/02(Tue) 17:03:40)
2024/01/02(Tue) 17:41:45 編集(投稿者)

No102796 (まーくん さん) に返信
> 職場と自宅PCの間でデータのやりとりを行うソフトを作りたいと考えています。

職場においてそういった行為が OK となっているのでしょうか?
日本の職場では、多くの場合、業務目的であろうと、そういったやりとりは NG としているケースが多いためです。

また、職場で OK と出ていたとしても、本当に「自作する必要」があるのでしょうか?
後述しますが、セキュリティ対策を自分で実現しきるのは大変です。
リモートデスクトップサービスやクラウドストレージを使った方が、安全かつ低コストという可能性もありますので「自作ありき」ではなく、ゼロベースで検討してみてください。


> サーバー側の設定で自身のグローバルIPアドレス
> 160.237.xxx.xx
> をlistenerに設定して、
> listener.Start()
> を実行すると以下のエラーが発生します。

少なくとも、以下の突っ込みポイントがありそうです。

・前述の話と重なりますが、任意のアドレス・任意のポートへの通信を職場が許可するように構成しているか?
 保守的であれば、多くの場合、未知のポートへの通信は遮断していると思います。

・サーバー側がルーターを通してインターネットに接続しているのであれば、TcpListener に設定するべきは「自分のローカルアドレス」である。
 そのサーバーに割り当てられていない「グローバル IP アドレス」を指定することは誤りなので例外が起きるのは自然なことと言える。
 また、その環境ならルーター側に特定のポートを特定のデバイスに転送するような設定が必要である。


・技術的に実現したとしても、第三者による攻撃リスクに対して、十分に配慮できているか?
 IP アドレスは当てられますし、ポート番号は総当たりで見つけられる可能性があります。
 そのとき、不正なパケットが送られて変な動きをしないか、無認証でデータを盗まれたりしないか。
引用返信 編集キー/
■102798 / inTopicNo.3)  Re[2]: グローバルIPアドレスで通信する方法
□投稿者/ まーくん (2回)-(2024/01/02(Tue) 19:35:16)
2024/01/02(Tue) 19:48:27 編集(投稿者)

ご回答ありがとうございます。


最終的には、自宅と職場PC間で通信したいと考えているのですが、
障害が多いようであれば、とりあえず、職場のPC間だけで通信したいと考えております。
同じ職場なのですが、別のLANネットワークに入ったPC同士で通信するにはどのようにしたら良いでしょうか?

これならセキュリティの問題も、
職場のコンプライアンスの問題もクリアできると思います。
もし仮に、セキュリティの問題が発生するとして
一時的にしか使わないため問題ありません。

ルーターの設定は自分でも変更することができますが、
どのようにポートを開けたら良いか分かりません。
TeamViewerというソフトをいつも使っていて、
こうしたポートやグローバルIPアドレスなどの問題を考えずに
外部PCと接続することができているのですが、
これはどういう仕組みで動いているのでしょうか?


あと、リモートデスクトップサービスやクラウドストレージといったソフトを使うことも考えたのですが、
VB.NETあるいはC#で実装したいと考えております。

あるいは、需要ありそうなので、ライブラリなどは公開されていないのでしょうか?

よろしくお願いいたします。


引用返信 編集キー/
■102799 / inTopicNo.4)  Re[3]: グローバルIPアドレスで通信する方法
□投稿者/ Azulean (1296回)-(2024/01/02(Tue) 20:38:11)
2024/01/02(Tue) 20:54:23 編集(投稿者)

No102798 (まーくん さん) に返信
> TeamViewerというソフトをいつも使っていて、こうしたポートやグローバルIPアドレスなどの問題を考えずに
> 外部PCと接続することができているのですが、これはどういう仕組みで動いているのでしょうか?

下記の参考サイトを読み込めば、「2者間接続」ではなく、「3者間接続」であることがわかるかと思います。
https://www.lac.co.jp/lacwatch/service/20200303_002135.html


> 最終的には、自宅と職場PC間で通信したいと考えているのですが、
> 障害が多いようであれば、とりあえず、職場のPC間だけで通信したいと考えております。
> 同じ職場なのですが、別のLANネットワークに入ったPC同士で通信するにはどのようにしたら良いでしょうか?

ping を含めて直接通信ができるのであれば、何も工夫なしでそのまま実現できるでしょう。
直接通信ができないのであれば、先にも書いたように、ルーターのポートを開けてそれを別のデバイスに転送するような設定が必要です。


> ルーターの設定は自分でも変更することができますが、
> どのようにポートを開けたら良いか分かりません。

メーカーや機種によりますので、第三者に尋ねるのではなく、取説を読んでください。


> あと、リモートデスクトップサービスやクラウドストレージといったソフトを使うことも考えたのですが、
> VB.NETあるいはC#で実装したいと考えております。
> あるいは、需要ありそうなので、ライブラリなどは公開されていないのでしょうか?

文脈次第ですが、クラウドストレージを VB.NET/C# で操作するライブラリであれば、サービスによっては存在しますので、探してください。

自前のサーバーの話で「ライブラリ」という言葉を出されたのであれば、今回の話は「ネットワークの知識や構築作業」の領域の問題であり、「誰かの実装(ライブラリ)」で解決する問題ではありません。


「ライブラリ」ではなく、「サービス」として模索するなら、VPN サービスがそれに近いでしょう。
ただ、職場からパケットが外に出るという意味では、VPN も職場の承認が前提となるのでご注意ください。
引用返信 編集キー/
■102800 / inTopicNo.5)  Re[4]: グローバルIPアドレスで通信する方法
□投稿者/ まーくん (3回)-(2024/01/02(Tue) 21:32:22)
ご回答ありがとうございます。


> 下記の参考サイトを読み込めば、「2者間接続」ではなく、「3者間接続」であることがわかるかと思います。

3者接続であることは理解しているのですが、
なぜ3者接続にするとルーターの存在を無視することができるのかが全く理解できておりません。



> 直接通信ができないのであれば、先にも書いたように、ルーターのポートを開けてそれを別のデバイスに転送するような設定が必要です。

恐らくルーターのポートの開け方は説明書を読めば分かると思うのですが、
TcpListenerを使ってどのようにして、
グローバルIPアドレス(ルーターのアドレス)とローカルIPアドレス(PCのアドレス)を同時に設定するのでしょうか?


引用返信 編集キー/
■102801 / inTopicNo.6)  Re[5]: グローバルIPアドレスで通信する方法
□投稿者/ Azulean (1297回)-(2024/01/03(Wed) 00:17:01)
2024/01/03(Wed) 00:26:18 編集(投稿者)

No102800 (まーくん さん) に返信
>>下記の参考サイトを読み込めば、「2者間接続」ではなく、「3者間接続」であることがわかるかと思います。
>
> 3者接続であることは理解しているのですが、
> なぜ3者接続にするとルーターの存在を無視することができるのかが全く理解できておりません。

なぜ、ルーターを介すると通信できないのかを学びましょう。
その理解を経ずに今回やりたいことを実現すること自体が無理筋です。

・この仕掛けは「ルーターの存在を無視する」わけではありません。(3者接続であれ、ルーターを経由します)
・ルーターを介すると一切の通信できないなら、普段のインターネット接続すらできないことになる(ルーターの存在意義がない)ことになるので、論理的に破綻します。
・ルーターが何をしてくれるのか、どういった特性の通信は成り立つのかを理解しておく必要がある。
・その特性を理解すれば、3者通信にすれば成り立つことも納得できるでしょう。
・ルーターの存在意義・期待される役割もきちんと意識して、構築しましょう。
(そうしないと、ネットワークを危険にさらすか、ネットワークを破壊することになる)


> TcpListenerを使ってどのようにして、
> グローバルIPアドレス(ルーターのアドレス)とローカルIPアドレス(PCのアドレス)を同時に設定するのでしょうか?

そんなことは必要ありません。
厳しいことを言いますが、このように思われるということは、前提知識が足りないと言わざる得ません。
ネットワークを理解せずに適当に作り上げることは、ネットワークを危険にさらすので「絶対に」やめてください。


技術的には、少し前に "・サーバー側がルーターを通してインターネットに接続しているのであれば、TcpListener に設定するべきは「自分のローカルアドレス」である。" と書いた通りです。
これでなぜ通信が成り立つかわからないなら、確実に学びが足りません。
引用返信 編集キー/
■102802 / inTopicNo.7)  Re[6]: グローバルIPアドレスで通信する方法
□投稿者/ まーくん (4回)-(2024/01/03(Wed) 13:57:12)
ありがとうございます。

サーバー側の設定は「自分のローカルアドレス」であることは理解できましたが、
クライアント側の設定では、サーバーのグローバルIPアドレス(ルーターのアドレス)とローカルIPアドレス(PCのアドレス)の
両方を設定する必要があるのではないでしょうか?
どのように設定すれば良いでしょうか?


引用返信 編集キー/
■102803 / inTopicNo.8)  Re[7]: グローバルIPアドレスで通信する方法
□投稿者/ Azulean (1298回)-(2024/01/03(Wed) 14:21:03)
2024/01/03(Wed) 14:45:15 編集(投稿者)

No102802 (まーくん さん) に返信
> サーバー側の設定は「自分のローカルアドレス」であることは理解できましたが、
> クライアント側の設定では、サーバーのグローバルIPアドレス(ルーターのアドレス)とローカルIPアドレス(PCのアドレス)の
> 両方を設定する必要があるのではないでしょうか?

ありません。
繰り返しますが、そう思うということは「ネットワーク」や「TCP/IP」の学びが足りません。


-----
・TCP/IP は原則として、1:1の通信であり、複数の IP アドレスを指定するという場面はありません。
・異なるネットワークの「ローカルアドレス」を通信先と指定しても、通信としては成り立ちません。
・プライベート IP アドレス、あるいはローカルアドレスと称される、192.168.x.y や 10.x.y.z などは、基本的に同じネットワーク内でしか通信が成り立ちません。ネットワーク境界を越える(ルーターを超える)なら、それらのアドレスは使えませんので、ルーター側の設定(ポートを開け、かつそのポートに対する通信をどうするかの設定)が必要です。
・ここら辺の事情を理解すれば、クライアントからサーバーへの接続はグローバル IP アドレスかそれに類するものが必要なのは明らかです。
・そのグローバル IP アドレスかそれに類するものに届いた接続要求を、いかにサーバーに転送するかがルーター周りの設定(やネットワーク構築)の肝です。

※組織内ネットワークなど、特定の条件を満たす場合はグローバル IP アドレスである必要性はありませんが、インターネットを介するならグローバル IP アドレスは必須です。


これらの話を「質問」で解消しないようにしてください。学んでください。
学びを避けたいなら、詳しい人・業者に依頼するか、既存のサービスを利用してください。

質問ベースでやっていると、解決が非常に遅くなり、かつ中途半端な理解で危険な進め方になります。
私は、それを「「強く恐れています」」。

無理解・理解不足による脆弱な状態で解決されたくないため、これ以降、知識不足による問題と判断したら、端的にそれだけ冷たく書くか、無応答かになるかと思います。ご了承ください。
引用返信 編集キー/
■102806 / inTopicNo.9)  Re[8]: グローバルIPアドレスで通信する方法
□投稿者/ わんわん (1回)-(2024/01/05(Fri) 13:34:12)
まーくんさん

Azuleanさんが言われるように、ネットワークの前提知識が足りていないと思われますし、
少なくとも、まーくんさんがやりたい事がやれないのは、C#やVB.NETの知識不足ではないでしょうから、
ここの掲示板では適切ではないと思われますね。

ネットワーク掲示板でうまい事質問をだしていけば、回答を得られるかもしれませんが、
正直、そんなに難しいレベルの話ではなく、ちょっとネットワークを齧れば、一般ユーザーでもわかるレベルの内容がわかっていないと思われますので、ネットワークプログラミングをしたいのであれば、Azuleanさんが言われるように少し自分で調べてみてはいかがでしょうか

引用返信 編集キー/
■102825 / inTopicNo.10)  Re[9]: グローバルIPアドレスで通信する方法
□投稿者/ ぶなっぷ (1回)-(2024/01/09(Tue) 16:27:31)
これが分かりやすいかな。

https://baremetal.jp/blog/2023/09/08/1298/
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ