SSブログ

P2PにはUPnPを使うといいらしい? [プログラミング]

昔のpeer-to-peerのアプリケーションは、ルーターに穴を開けてあげないといけないことがありました。最近のP2Pアプリはそういうことをせずに使えています。なんでだろうなぁと思っていたらUPnPを使ってルーターに自動的に穴を開けているみたいなんですね。UPnPは危ないみたいなことを書かれていたりするわけですが、それはP2Pでできることの危険性に等しい感じかもしれません。

まぁルーターもUPnPの機能を備えているわけだし、それを使えばルーティングが可能であれば、利用するのは技術的には当然に使うわけで。でも、ルーターの設定を見ると有効になっていなかったりする。でもTorrentクライアントは普通に使えているんですが、それはUPnPを使っていないってことなんでしょうかね。

そもそも、Webを見るときIPマスカレードで80番とか443番ポート以外のポートを割り振って、クライアントを分けていると思ったんですが、だいたい合っているよね? その時ブラウザはどこまで想定してやっているんだろう? ルーターの80番ポートに純粋にアクセスして、別の変換されたポートで受け取るという意味なんだろうか? ルーターはIPアドレスとポートを変換してくれているのはわかるんだけど、それに合わせてブラウザってかなり面倒な作業をしていないのだろうか。それと、違うブラウザや別のウインドウやタブの違いってのはどうやって切り分けているんだろう。

たぶん、そもそもTCP/IPって何よ?という所あたりで詰まっている気がする。そういうところ、実際の技術に落とし込んでまで理解できていないんだよな。

https://www.pc-master.jp/internet/tcp-ip-protocol.html

あ〜接続先のポート番号はウェルノウンポートで決まっているけど、接続元ポート番号はダイナミックポートを適宜割り当てているのね。80番ポートにアクセスに行ってもブラウザに返すポートはそもそも80番とは違うと。それならウィンドウごとに割り振ることになっても簡単だね。というか、デフォルトの動きで同じコンピュータ上のポートのバッティングは避けられる。

その上で複数端末対策でIPマスカレードとかをして、IPアドレスとポート番号の組み合わせを、ルーター側で受けるポート番号に変換して持っておく、ってことか。そうなら納得だ。なんか初歩の初歩でわかってるつもりで全然わかっていなかったな。情報としては知っていても知識として落とし込めていなかったというか。今回はIPプロトコルがきちんとわかっていなかったわけだけど、TCPにしてもUDPとの対比ぐらいの知識しかないな。




その上でいきなりの外からのアクセスはできないようになっている。

https://www.itbook.info/study/nat5.html

NAPTのアドレス変換が障害となってアクセスできないわけだが、Webサーバを晒す時にはルーターのポートフォワーディングをしていたので経験的にわかっている。

https://www.itbook.info/study/nat6.html

なのでP2Pアプリでポートフォワーディングをしない場合は、外部サーバから最初にP2Pクライアントの情報が与えられないといけないようだ。Torrentではピアのコンピュータをトラッカーに教えてもらうようになっているっぽい。なのでポートフォワーディングをしてないのに、外部からのアクセスが通ってしまうのは、P2Pと名前を打っておきながらサーバが必要ということなのでした。

https://ja.wikipedia.org/wiki/BitTorrent

WebRTCもSTUN/TURNサーバが必要だったので、結局P2Pは外部サーバを立てないとダメなわけです。外部からのNAPT対策は内側からルータの穴を開けて導くか、先のように特殊なサーバを外部に置いておいてそれを利用するわけです。具体的には

・ルーターをポートフォワードして外部に晒す
・ルーターにUPnPを使って穴を開ける
・なんらかの外部サーバを使ってP2Pアクセスさせるきっかけを作る

外部サーバを使わないとなると、結局ルーターの設定が必要となります。ともあれ、ポートフォワーディングを使うとなると具体的なポート番号だとかのすり合わせが必要となってきますから、手動でやるのはちと面倒な気はします。少なくともルータって何?とかルーターのIPアドレス知らないとかいう人にはかなりハードルが高い。とはいえ、ルーターにUPnPを有効にさせる方が楽であることに違いはありません。

ただ意図的にポートフォワーディングをするより、UPnPを有効にする方が危険性は高くなっているんでしょう。使った後にはUPnPを無効にする作業をした方がいいんでしょうが、そこのところがポートに穴を開ける作業と同じようにオフにできたらいいなと思ったり。UPnPは勝手にオンにされちゃうのは問題だけど、オフにできる機能なら別にあっても構わない気はする、あるかどうかは知らんけど。




特に外部にサーバを持つつもりがなければ、ポートを開けてIPとポートを教えてあげるわけだ。とりあえず今考えているお手軽P2Pソフトが、

・UPnPで穴をあける。
・メールで接続して欲しい人にメールを送る

で実現させるようにしたいと思った。でも、これってP2Pじゃなくてクライアントサーバと大して違いはないんじゃない? そもそもピアツーピアの定義って何って話ですよ。全く外部サーバを使わないやり方というのはちと辛いし、それじゃなかったらどっちかにスタティックなサーバを立てるのとどう違うのかというのは、お互いに同じことができるようになればP2Pなのかな?

とりあえず、UPnPを使ってWebサーバを晒したいと思う。Webサーバを晒せれば、そこからGUIを通じてHTML5の方法でなんとかなりそうな気がする。というか、今更独自プロトコルでなんとかしたいという気持ちになれない。そもそもネイティブアプリを作りたくないので、Webサーバという選択になるのだから必然的なのだが。

コメント(0) 
共通テーマ:パソコン・インターネット

Twitterまとめ投稿 2019/07/06 [Twitter]


コメント(0)