Ⅰ. 概要
デスクトップPCを買い外出先でゲームやら機械学習やらをやろうと目論んでいたが、設定に苦戦していた。リモートデスクトップ接続がようやくできるようになったので、その仕組みや設定方法を書き残しておく。
Ⅱ. 前提条件
下記2つの条件は後述のⅢ、Ⅳのどちらでも必要になってくる。
各自で確認してみてほしい。
1. Windows Pro であること
windows Home版ではどうあがいても今回の設定はできない。Google Chromeだとできるっぽいので興味ある方は各自ググってみよう。
windowsがProかHomeであるかは「設定」→「システム」→「バージョン情報」から確認できる

2. リモートデスクトップ許可をしていること
こちらはセキュリティの都合か購入時には許可がされていない。確認してみてオフになっていたらオンに切り替えよう。
これも「設定」→「システム」→「リモートデスクトップ」を辿ってオン/オフを設定できる


Ⅲ. ルータからポートフォワーディング(非推奨)
これから説明するのは非推奨な接続である。
インターネットから無限にピンボンダッシュできちゃうからね。
後述のVPNを利用した接続をした方がいい。絶対。
あくまで仕組みだけ理解しよう
0-1. そもそもどうやって内→外へ通信しているか
普段qiitaなどのサイトへアクセスする際は下記のようなTCP/IP通信を行っている

①PC→ルータ
ipconfigなどで出てくるIPアドレスはルータの回線環境内で識別されるのに使うローカルIPアドレスであって、インターネットを介した通信に使うことはできない。なのでルータを経由する形でインターネットに出る。その際にNAT(Network Address Translation)という変換処理でローカルIPアドレスと、ルータの持っているグローバルIPアドレスと適当なポート番号を紐づけてもらう(図の「:ppp」の部分)。これで通信に成功してサイトの表示に必要な画像データなどが送られてくるとき、送り先を特定できるようになる
②ルータ→送信先URL

送信元と送信先のグローバルIPアドレスがあって初めて通信ができるようになるが、この時点ではまだ送信先のグローバルIPアドレスが分かっていない。「https://qiita.com/」というURLはDNSサーバへ問い合わせをして初めてをグローバルIPアドレスに変換される
0-2. IPアドレスを指定するだけじゃリモートデスクトップ接続できない?
では、逆に外→内の通信をするためにはホスト側のIPアドレスを指定すればいいじゃん、と私は安易に考えた。

①ローカルIPアドレスを直接指定

結果はこの通り。当たり前だが通信できない。
前述した通りそもそもローカルIPアドレスはルータ内で管理するものでありインターネット上では見えない。
リモートデスクトップに関係ない内→外通信の仕組みを記載したのはこの私の理解してなさを実感してもらうためであり、私の屍を超えてもらうためでもある。
※ただし、ローカルIPアドレスはルータ内であれば見えており同一回線であればこの方法やデスクトップ名を指定することでもリモートデスクトップ通信は可能である。足元が寒くてコタツでぬくぬくしたいときはこれを使ってみるのもいいかもしれない。
②ルータのグローバルIPアドレスを指定
ではルータのグローバルIPアドレスを指定すればいいのでは?と私は考えた。
答えはNoである。
前述のNATは内→外通信するときにしか使えない。ローカルIPアドレスとポート番号の紐づけを動的に行ってくれないからである。最終的な通信先であるホストPCがどこにあるかわからず、通信が失敗してしまう
0-3. ポートフォワーディングで解決
これを解決するにはポートフォワーディングという技術を使う。NATで動的に行っていたローカルIPアドレスとポート番号の紐づけを静的に行ってしまえばいいわけである。
0-4. 固定IPアドレス
ただし、このポートフォワーディングにはもう1つ解決しなければならない問題がある。ローカルIPアドレスはデフォルトだと固定化されていない点だ。
ルータはローカルIPアドレスを各端末へ動的に振り分けているのだが、ルータが再起動したときに同じアドレスを振り分けてくれるとは限らない。せっかくポートフォワーディング設定をしたとしても意図しない端末に通信が行ってしまう可能性があるのだ。
それを防止するために「この端末にはこのローカルIPアドレスを振り分ける」といったIPアドレスの固定化設定もセットで必要になってくる。具体的には端末の物理アドレスと振り分けたいローカルIPアドレスを紐づけるような設定を個別に行う。
1. 固定IPアドレス割り当て
あくまで我が家のルータの場合なので詳しい設定は各自でぐぐってほしい。
①ホストPCの物理アドレスを確認
まずは「ipconfig /all」で物理アドレスを確認する
PS C:\Users\【ユーザ名】> ipconfig /all
Wireless LAN adapter Wi-Fi:
接続固有の DNS サフィックス . . . . .: XXX
説明. . . . . . . . . . . . . . . . .: XXX
物理アドレス. . . . . . . . . . . . .: 【物理アドレス】
DHCP 有効 . . . . . . . . . . . . . .: XXX
自動構成有効. . . . . . . . . . . . .:XXX
IPv6 アドレス . . . . . . . . . . . .: XXX
一時 IPv6 アドレス. . . . . . . . . .: XXX
一時 IPv6 アドレス. . . . . . . . . .: XXX
リンクローカル IPv6 アドレス. . . . .: XXX
IPv4 アドレス . . . . . . . . . . . .: 【ローカルIPアドレス】
サブネット マスク . . . . . . . . . .: XXX
リース取得. . . . . . . . . . . . . .: XXX
リースの有効期限. . . . . . . . . . .: XXX
デフォルト ゲートウェイ . . . . . . .: XXX
DHCP サーバー . . . . . . . . . . . .: XXX
DHCPv6 IAID . . . . . . . . . . . . .: XXX
DHCPv6 クライアント DUID. . . . . . .: XXX
DNS サーバー. . . . . . . . . . . . .: XXX
NetBIOS over TCP/IP . . . . . . . . .: 有効
接続固有の DNS サフィックス検索の一覧:XXX
上記の「Wireless LAN adapter Wi-Fi」という項目にある「物理アドレス」をメモしておくこと。それと③の確認のために現在の「IPv4 アドレス」もメモしておくこと。
※失敗例①
他の項目にも「物理アドレス」は存在するが上記の部分のみを参照にすること。下記のような部分を間違ってメモすると当然固定IPアドレスの割り当てに失敗する(3敗)
・イーサネット アダプター イーサネット:
・Wireless LAN adapter ローカル エリア接続* 1:
・イーサネット アダプター Bluetooth ネットワーク接続:
②物理アドレスと固定IPアドレスを紐づけて割り当てる
ルータの設定画面に頑張ってアクセスしてみてほしい。
おそらく「ルーター機能の設定」→「IPアドレスの設定」と進んでいくと固定割り当ての欄があるので、割当IPアドレスの範囲からはみ出ないような固定IPアドレスとさきほどの物理アドレスを記載し、ルータを再起動する
③固定IPアドレスが割り当てられているか確認
ルータの再起動ができたら、入力した固定IPアドレスが割り当てられているか同じように「ipconfig /all」で確認する
PS C:\Users\【ユーザ名】> ipconfig /all
Wireless LAN adapter Wi-Fi:
接続固有の DNS サフィックス . . . . .: XXX
説明. . . . . . . . . . . . . . . . .: XXX
物理アドレス. . . . . . . . . . . . .: 【物理アドレス】
DHCP 有効 . . . . . . . . . . . . . .: XXX
自動構成有効. . . . . . . . . . . . .:XXX
IPv6 アドレス . . . . . . . . . . . .: XXX
一時 IPv6 アドレス. . . . . . . . . .: XXX
一時 IPv6 アドレス. . . . . . . . . .: XXX
リンクローカル IPv6 アドレス. . . . .: XXX
IPv4 アドレス . . . . . . . . . . . .: 【固定ローカルIPアドレス】
サブネット マスク . . . . . . . . . .: XXX
リース取得. . . . . . . . . . . . . .: XXX
リースの有効期限. . . . . . . . . . .: XXX
デフォルト ゲートウェイ . . . . . . .: XXX
DHCP サーバー . . . . . . . . . . . .: XXX
DHCPv6 IAID . . . . . . . . . . . . .: XXX
DHCPv6 クライアント DUID. . . . . . .: XXX
DNS サーバー. . . . . . . . . . . . .: XXX
NetBIOS over TCP/IP . . . . . . . . .: 有効
接続固有の DNS サフィックス検索の一覧:XXX
「IPv4 アドレス」が入力したものと同じであれば成功。
2. ポートフォワーディング設定
①固定IPアドレスとポートを指定して設定
今度は固定IPアドレスとポートを紐づけてポートフォワーディングが行われるようにする。「ポートフォワーディング」、あるいは「ポート転送設定」のような項目があると思うのでそこに下記の要素を記載していく。終わったら保存して先ほどと同じようにルータを再起動。
・有効/無効:有効!(1敗)
・プロトコル:TCP
・WAN側ポート番号:任意(RDP接続の際に指定するポート番号)
・LAN側ポート番号:3389
・転送先IPアドレス:さきほどの固定IPアドレス
3. リモートデスクトップ接続
いよいよRDP接続できるか試してみる。
①グローバルIPアドレス確認
ルータの設定画面で「WAN側IPアドレス」で確認できるほか、下記のサイトでも使用しているグローバルIPアドレスを確認できる
https://www.cman.jp/network/support/go_access.cgi
②pingが通るか確認
まずはRDPの前にpingでホストPCと通信できるか確認する
PS C:\Users\【外出先PCのユーザ名】> ping 【グローバルIPアドレス】
【グローバルIPアドレス】 に ping を送信しています 32 バイトのデータ:
【グローバルIPアドレス】 からの応答: バイト数 =32 時間 =67ms TTL=49
【グローバルIPアドレス】 からの応答: バイト数 =32 時間 =88ms TTL=49
【グローバルIPアドレス】 からの応答: バイト数 =32 時間 =52ms TTL=49
【グローバルIPアドレス】 からの応答: バイト数 =32 時間 =69ms TTL=49
【グローバルIPアドレス】 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 52ms、最大 = 88ms、平均 = 69ms
pingの通信に成功すると上記のようなメッセージが返ってくる
PS C:\Users\【外出先PCのユーザ名】> ping 【適当なグローバルIPアドレス】
【適当なグローバルIPアドレス に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
【適当なグローバルIPアドレス の ping 統計:
パケット数: 送信 = 4、受信 = 0、損失 = 4 (100% の損失)、
逆に失敗すると上記のような結果となるので、設定を見直してみよう。
②ポート確認
今やっているⅢ.の方法だとホストPCのポートも開いている必要がある。下記のようなコマンドでTCPの3389ポートが「LISTENING」であれば問題ない。
PS C:\Users\【ホストPCユーザ】> netstat -an | findstr 3389
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING
どうやって開けたかまではわからないが、リモートデスクトップ許可をしたときにwindows君がいい感じにやってくれたのだろう、たぶん。
先ほどのルータのLAN側ポート番号を「3389」固定にしたのはこのデフォルトで開けるポート番号が決まっていたからである。
③リモートデスクトップ本番
外出先PCからリモートデスクトップ接続を試みる。

デスクトップの左下に検索欄があるので「りも………」とか打つと呼び出せる


ポートフォワーディングで設定した任意のポート番号と、ルータのグローバルIPアドレスを上記のように入力する。
RDP通信ができる状態だとパスワードを入力するよう画面がでてくるので入力。
成功すればホストPCの画面が出てくる。
くれぐれも公共の場で見られても問題ないデスクトップ背景にしておこう。
PS C:\Users\【ユーザ名】> mstsc /v:localhost
PS C:\Users\【ユーザ名】> mstsc /v:【ルータのグローバルIPアドレス】:【WAN側ポート番号】
余談だが、PowerShellのコマンドでもRDP接続をすることができる。1行目はホストPCから同じホストPCへのループバック通信となる。

リモートデスクトップ接続が許可されていて、設定が間違っていない場合は上記のような画面となる。外出先PCから接続を試みる前に試してみるのもいいだろう。
Ⅳ. Tailscaleで簡単VPN接続
さて、リモートデスクトップの仕組みを長々と説明したが、上記Ⅲ.を活用するには大きすぎる欠点がある。「誰もが無限に接続を試みることができる」点だ。iphoneのように数回間違えると数分間ロックするような仕組みがなく、例えば下記のような簡単なプログラムを作成し、いつかは知らない誰かがRDP接続をしている可能性がある。
①pingが返ってくるグローバルIPアドレスを探索する
②返ってきたIPアドレスにポート番号を1からくっつけてRDP接続できないか試す
③パスワードを片っ端から順に入力する
これを防ぐためにはRDP接続を試みられる端末を絞る必要がある。つまりVPNである。
0.1 VPN接続とは
Virtual Private Networkの略であり、拠点間をいわば仮想の専用線で結び、安全なデータ通信環境を確立する技術のことである。
0.2 tailscaleとは?
とはいえ、仕事では使ったりしているもののあまりVPNには詳しくない。軽く調べてみても有料だったりしたので導入には躊躇いがあった。
しかし、下記の記事を発見。導入が簡単にでき、なおかつ無料ということで試してみた。
1. ホストPCにインストール
①まずは公式サイトにアクセス
https://tailscale.com/
②右上にある黒い「Get started it's free!」をクリック

③アカウント作成
認証をGoogleなどにするか聞かれるので任意の方法を選択。このアカウントが専用VPNと紐づくようになるのでくれぐれも情報漏洩しないように注意。
④tailscaleのアプリをインストール
アプリをホストPCに入れる。
この辺のキャプチャ撮るの忘れちゃった。ごめんね。
⑤PC認証
tailescaleアプリを起動(何も表示されないけど)し、先ほどの公式サイトの今度は「Start connecting devices」をクリック
https://tailscale.com/


上記画面に飛び、「Machine」欄にホストPCのPC名と「LAST SEEN」が「Connected」になっていれば成功。
「ADRESSES」の数字をメモしておく。
2. 外出先PCにインストール
接続する側のPCにも大体同じ設定を行う。
①同一アカウントにログイン
ホストPCで作っておいたアカウントに入る。
公式サイトにアクセスし、同様に「Get started it's free!」をクリックすればOK
https://tailscale.com/
②アプリをインストール
手順は同じ
③PC認証
同様にアプリを起動する。ブラウザ画面で「Machine」欄に外出先PCのPC名と「LAST SEEN」が「Connected」になっていれば成功。
3. リモートデスクトップ接続
これで準備は整ったので、接続できるか試してみる

先ほどメモっておいたホストPCのアドレスを入力する。ポートフォワーディング設定のようにポート番号を入力する必要はない。もちろんルータの設定も必要なければポートの穴あけも必要ない。超らくちん。
通信が通ればパスワードを入力するよう聞かれるので、入れて完了。
Ⅴ. 終わりに
tailscaleをこんな簡単にVPN接続が実現できるとは思わなかった。ポートフォワーディングやらルーティングやら考えていた時間を返せと言いたいが、ネットワークにちょっとだけ詳しくなっただけ良しとしよう。
これで旅先でもモンハンができるようになる………かもしれない。
それでは皆さんも、良きPCライフを。

