自宅サーバのルーター設定はUPnPでポート開放。「家」アナロジーで解説!
こんにちは!
昔むかし、週末プログラミングをやっていてWindowsのシェアウェアで使った技術が、今でも当たり前に使われているのを見て、懐かしさを隠しきれない、しずかなかずしです。
UPnPという技術をご存知ですか??
Universal plug and playの略ですが、例によってネットワークの技術用語です。
ここのところ、ネットワークやルーターの技術のお話が多い、しずかなかずしブログ。
自宅サーバーを立てるための関連技術をわかりやすく説明しています。
UPnPも自宅サーバーを立てる際に利用できる技術です。PlayStationなどのゲーム機が特定のゲームで利用するというのがよくあるケースです。でも、自宅サーバーを実現する際にも使えるのです。
UPnPとは?
Universal plug and playとはどんな技術なのでしょう?
あなたがなにか新しい機器をホームネットワークにつないだとします。そして、その機器は、写真や動画などのコンテンツをいっぱい抱えた、メディアサーバーだったとしましょう。その新しい機器のなかの動画コンテンツ。
同じくホームネットワークにWiFiでつながるスマホで見てみましょう。
まずは、ホームネットワークの中で、新しく追加したメディアサーバーのIPアドレスがわからないと接続できません。
アドレスがわかったとしても、複数ある動画ファイルの中から、どんなプロトコルを使うと目的のコンテンツにたどり着けるのでしよう?
ホームサーバーのWeb画面をブラウザで開いて、探すのでしょうか?
サーバーの取り扱い説明書を読んで、どんな機能があるのか調べる必要があるかも知れませんね。
結構、面倒な作業になりそうです。
UPnPはそんな面倒な手間を一気に解決してくれるすばらしい仕組みなのです。
つまり、ホームネットワークにつながった機器を検出し、その機器がどんな機能を持っていて、どうやってコントロールすることができるのか。機器同士が自動で認識し合って勝手にやってくれるようにするための仕組み。これが、UPnPなのです。
UPnPの歴史は古く、2000年代前半に考え出されたものです。そのため、2020年の現代なら、RESTやJSONといったWebサービスでおなじみのインターフェイス技術が使われていません。その代わり、XMLやSOAPといった、古風で複雑な仕組みの上に構築されたインターフェイス規格になっています。
XMLやSOAP、JSONなど、専門用語を連発してしまいましたが、後日改めて記事にしてみたいと思います。
広告
IGD とは?
UPnPの中で定義されているIGDという仕組みがあります。IGDとは、Internet Gateway Deviceの略です。メディアサーバーの例を前述しましたが、ルーターがUPnPの機能を持つことがあります。
ホームネットワークにつながった機器が、ルーターを検出して、ルーターをコントロール(設定)することが可能になります。
先日、ポート開放の詳細な説明を投稿しました。この中で、TPlinkのルーターの設定画面を例にポート開放の設定はこんな風にします、という例を記載しています↓
しかし、このようなルーターの設定画面、別のメーカーの製品だとまた別の仕様の画面で、場合によっては設定項目の呼び名まで異なります。同じ目的の設定をするのに、全く違う画面が出てきてしまうのです。
この状況を打解するのがUPnPのIGDプロファイルなのです。
クライアントであるホームサーバーがルーターの外からのアクセスを受けたい。この目的に対して、UPnP経由でルーターのポートマッピングの設定(ポート開放)が可能になります。
「家」アナロジーでUPnP IGDを説明
先日、ホームネットワークの説明に登場したのは、インターネットにつながる機器を集合住宅に見立てて、IPアドレスやポートを説明する「家」アナロジー。
今回も、そのアナロジーでUPnPの仕組みを説明してみましょう。
ディベロッパーである住友不動産は、何棟か集合住宅を建設し、それを重厚な塀できっちりと囲い、入口は小さな門だけ。そして、門のところにだけ住所を持たせていたのでした。
インターネットの世界では、この門の住所がルーターのWAN側のIPアドレスになります。門の中の建物一個一個にも住所(IPアドレス)がつけられていますが、その住所は外の世界からは見えない、というのが、この世界の想定でした。
この場合、ディベロッパーの住友不動産は、インターネットの世界でいうと、ホームルーター(WiFiルーター)の設定をする、家の主と言うことになります。
さて、この塀の中の広大な敷地に、新しい建物ができました。建物の住人は、門番に、とある部屋番号宛に尋ね人が来たら、この新しい建物の302号室に通すようにお願いしたいとします。302号室の住人こそ、外部からの要求を処理してるれるHTTPサーバーさん、という設定です。
前回のポート開放のお話だと、このような、門番(ルーター)に対する「ことづけ」をするのは、ディベロッパー兼オーナーである住友不動産の仕事でした。
UPnPのシナリオでは、オーナーの手を煩わせることなく、新しい建物の住人自らが、門番に直接依頼できます。
(ディベロッパー兼オーナーの住友不動産は、インターネットの世界だと、WiFiルーターの設定を手動で行う、ホームネットワークの家の主と言うことになります)
それでは、どのように新しい建物の新しい住人は、門番に「ことづけ」をお願いするのでしょうか??
塀に囲まれた広大な敷地の中に新たに住み始めた住人にとってはわからないことばかり。周りにどんな建物があって、それぞれの建物にどんなことをしてくれる人たちが住んでいるのか、全くわかりません。
そこで、まずは大声で、叫んでみます。
「お〜ぃ!塀の中の建物の中で、どんな住人が住んでいるか応えてくれる人はいるか〜い?!」
これを聞いたA棟の一人が応えます。
「この建物の、105号室には、動画コンテンツをいっぱい抱えて、誰かに観に来て欲しいと口を開けて待ってるヤツがいるぞー!」
別の棟の一人も応じました。
「この建物の、205号室には、門番が受け取った郵便物を再配達してくれるヤツがいるぞー!」
こんな具合で、叫んだ呼びかけに対して、各建物の担当が返事をしてくれます。
このようなやり取りが、インターネットの世界、つまり、UPnPで言うところのデバイスの「ディスカバリー(Discovery)」と呼ばれる処理です。
UPnPでは、SSDP(simple service discovery protocol)という手順が定義されています。そして後者の、"門番が受け取った荷物を…"という応答が、IGDとしてのルーターの動作なのです。
SSDPでは、IPアドレス 239.255.255.250、 ポート番号 1900番にマルチキャストで、M-SEARCHというコマンドを送り、返ってきたレスポンスをクライアントが解釈します。
ディスカバリーの仕組みでIGDデバイスを見つけたあとは、クライアントの思うがまま。その応答に書かれているインターフェイス定義に従って、SOAP(HTTPを使用)というプロトコルにより、ポート開放の設定を行える、という訳です。
広告
miniupnpc でパソコンからルーターの設定をする
では、実際に自宅サーバーを設置した場合に、どのようにルーターの設定を自動で行うのか見ていきましょう。
使っているのはUbuntuの18.04.3 LTSバージョンです。
まずは、miniupnpというツールのクライアントプログラムをインストールします。こちらのサイトが参考になります↓
$ sudo apt install miniupnpc
そして、ホームネットワーク内部のIGD(ルータ)を探します。
$ sudo upnpc -l
こんな感じで表示されました。(ファイアウォールを一時的にdisableしています – $ sudo ufw disable)
kazushi:~/PycharmProjects/upnp_inv$ !2027
sudo upnpc -l
upnpc : miniupnpc library test client. (c) 2005-2014 Thomas Bernard
Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
for more information.
List of UPNP devices found on the network :
desc: http://192.168.1.18:80/description.xml
st: urn:schemas-upnp-org:device:basic:1
desc: http://192.168.1.18:80/description.xml
st: uuid:2f402f80-da50-11e1-9b23-0017884707de
desc: http://192.168.1.18:80/description.xml
st: upnp:rootdevice
desc: http://192.168.1.200:1900/gatedesc.xml
st: urn:schemas-upnp-org:device:InternetGatewayDevice:1
Found valid IGD : http://192.168.1.200:1900/upnp/control/WANIPConn1
Local LAN ip address : 192.168.1.3
Connection Type : IP_Routed
Status : Connected, uptime=1580999351s, LastConnectionError : ERROR_NONE
Time started : Thu Jan 1 09:00:18 1970
MaxBitRateDown : 512000 bps (512 Kbps) MaxBitRateUp 512000 bps (512 Kbps)
ExternalIPAddress = XXX.YYY.ZZZ.AAA
i protocol exPort->inAddr:inPort description remoteHost leaseTime
GetGenericPortMappingEntry() returned 713 (SpecifiedArrayIndexInvalid)
色々なUPnPデバイスが見つかってしまっていますが、 IGDは以下だと言っています。
http://192.168.1.200:1900/upnp/control/WANIPConn1
わが家のネットワークでは、 192.168.1.200は、TP-Linkの C50というルーターです。
ポートマッピングを行う為のコマンド、以下を実行してみます。このコマンドは、WAN側のポートの8080ポート番号に届いたパケットを、192.168.1.3のマシンの8080ポートに転送する為の設定をせよ、と、ルータ(門番)に依頼するコマンドです。
$ sudo upnpc -a 192.168.1.3 8080 8080 tcp
するとどうでしょう?
TP-Linkの設定画面をみると正しく設定が行われたようです。
不要になったら以下のコマンドで、削除しておきましょう。
$ sudo upnpc -d 8080 tcp
Auto Amazon Links: プロダクトが見つかりません。 http_request_failed: 有効な URL ではありません。 URL: https://ws-fe.amazon-adsystem.com/widgets/q?SearchIndex=All&multipageStart=0&multipageCount=20&Operation=GetResults&Keywords=B0734Y95C6|B07JHBBW9H|B01LZHDIZ1&InstanceId=0&TemplateId=MobileSearchResults&ServiceVersion=20070822&MarketPlace=JP Cache: AAL_0da064e42d39431eae54704b77dda834