ラベル RDP の投稿を表示しています。 すべての投稿を表示
ラベル RDP の投稿を表示しています。 すべての投稿を表示

2016年6月6日月曜日

sshトンネルを使ったリモートデスクトップその2

前回は、軽くポートフォワーディングについて記載した。
んで、自宅内のWindowsマシンに、外出先からリモートデスクトップ(RDP)接続出来るようにしたい。

ただ、「外部からsshでログインその1」でルータに設定を施したように、Windowsマシンへも転送するようにすれば、別にsshを通す必要は無い。

これなら、RDPのポート番号さえ分かっていれば、簡単に実現できる。

ただこの場合、幾つか問題点がある。

  1. WindowsPCが増えるたびに、ルータのポート転送を追加する必要がある
  2. 当然、WindowsPCが減ったら、ルータのポート転送を削除する必要がある
  3. ポートスキャンをかけると、RDPサービスだということがバレる
  4. アクセス制御が、RDPの仕組み(ユーザ認証)しか無い
  5. 生RDP通信であり、暗号強度が不安(どのような暗号アルゴリズムなのか不明)
  6. ルータにたくさんの穴開けをしないといけなくなる(台数分)
1,2,6は、「そもそもそんなにWindowsマシン作らないよ」ということになると思うが、今後Ubuntu Linuxマシンや、Windowsマシン上に仮想マシンを作って、WindowsOSをどんどん作っていったら…?なんてことを考えると、意外と管理に手間がかかる。
(ま、WindowsOSのライセンスが高いので、そんなに作ることは無いと思うが)

3,4,5は、RDPセキュリティに関連するそのことだが、正直RDPの暗号強度が高いとは思えない。
また、「外部からsshログインその1」「その2」で書いたように、外部からのアクセスはユーザID/パスワードの組み合わせ以外の仕組みも使いたい。

そういった点を考慮しつつ、それでもRDPで接続出来るようにならないか?
というところで出てくるのが、先に紹介した「sshポートフォワーディング(ローカルポートフォワーディング)」だ。
ローカルポートフォワーディングを使って、以下のような接続状況を作ればいい。


と言っても、これだけではイマイチ良く分からない。
なので、実際に動かしながらやってみよう。

条件としては、外(The Internet側)から、家の中のUbuntu Linuxへsshログイン出来ること。
Ubuntu Linuxと同じネットワーク内(家のネットワーク)に、RDP接続を許可したWindowsマシンがいること。(そもそも、WindowsのHome EditionではRDP接続出来ないため、Professionalとかそういうエディションを使うこと)
作業用PC(クライアント)は、Windows+teratermでサンプルを書く。
  1. teratermでsshログインする前の設定
    ログインする前に、teratermの設定でSSHポート転送を有効にしておこう

    設定内容は以下の通りだ。
    • ローカルのポート
      13389
    • リッスン
      127.0.0.1
    • リモート側ホスト
      接続先Windows機のIPアドレス
    • ポート
      3389
  2. sshログイン
    上記の設定を施したら、「OK」ボタンで設定を確定し、今まで通りにUbuntu Linux機へsshログインしよう。
  3. RDPクライアントでログイン
    端末側でRDP接続を起動して、以下のようにログイン情報を入力する。

    • コンピュータ
      127.0.0.1:13389 (sshポートフォワードの設定で入れた「リッスン」と「ローカルのポート」を「:」で繋いだもの)
    • ユーザ
      接続先Windows機のユーザアカウント名
    これで接続すると、通常のRDP接続と同様、パスワードを聞いてくるダイアログが出てくる。(証明書関連の警告も出てくると思うが、そちらは普段通りにOKしてくれればいい)
    また、ここで入力するパスワードは、操作用PC(クライアント)のパスワードではなく、接続先の(自宅内の)Windowsマシンのパスワードだ。

    この時のダイアログをよく見てみて欲しい。
    「これらの資格情報は、127.0.0.1(RDP接続先のIPとして指定したIP)への接続に使用されます。」となっているはずだ。
    このアドレスは、自分自身を示すアドレスのため、「遠隔のWindows機ではなく、自分自身へ接続しようとしている」ことになる。
    これが、ローカルポートフォワーディングの基本的な考え方だ。
    つまり「ローカル(自分自身)への接続を、他のマシンへ転送する」ということだ。
  4. リモートデスクトップ接続に成功する
    成功すれば、リモートデスクトップの画面が出てくるはずだ。

    これで普通に操作が可能だ。
    ウィンドウタイトル部分をよく見てみると、接続先が「127.0.0.1:13389」になっていると思う。これは、RDPクライアントとしては「127.0.0.1:13389」へ接続していると思い込んでいる、ということだ。実際には、sshがパケット転送をしてくれて、自宅内のWindows機へ接続している形になっている。
さてこれでRDP接続が出来るのが確認できた。
そこで、一体どのようなフローで接続できたのかを確認しておきたい。

簡単な図に書いてみたが、先にポートフォワードを有効にしてsshログインを行うことで、作業用PCとUbuntu Linuxの間でポート転送の設定が行われる。
その上で、RDP通信を行うと、上記図のようにRDP通信がsshのコネクション内を通って行く形になる。
そして、そのRDP通信を受けたsshd(sshサーバ)が、指定されたIP:ポートへパケットを転送する、という形だ。
TCP通信のため、当然戻りパケットも発生するが、これは同じ経路を通って流れていく。
ちょうど、sshで作成したコネクションをトンネルにして、他の通信(この場合RDP通信)が流れていくため、「sshトンネル」等と呼ばれている。

この図で記載したが、赤い線で示した区間は、sshによる暗号化通信が行われている。そのため、単純にパケットを読み取られても、それがRDP通信であることは分からない。(ssh暗号を解読して、初めてRDPであることが判明する。)
そのため、非常に強固で安全性の高いRDP通信を行うことが出来る。(当然、sshの暗号アルゴリズムは強固なものを使う前提だ)

更に、ブロードバンドルータ側には、RDPのための設定は一切行っていない。ポート転送はsshのみだ。

最初にsshによる認証が必要になり、こちらは既に公開鍵認証方式のみ利用できる設定にしているため、外部からのパスワード推測系の攻撃を受けても、突破されることは無い。

とまぁこのように、セキュリティレベルをある程度維持したまま、宅内のWindows機へRDP接続が出来るようになった。
以後は必要に応じて、このパターンでRDP接続しよう。

となると、普段電源を落としている or スリープモードにしている or ハイバネーション(休止状態にしている)Windowsマシンを、遠隔で電源入れられるようにしたい。Wake On LANだ。
次はWake On LANに挑戦したい。

今回は以上。

2016年5月30日月曜日

sshトンネルを使ったリモートデスクトップその1

今度は、sshトンネルを使ったリモートデスクトップだ。

その前に、ssh(sshスイート)を何に使っていますか?ってところから整理しよう。
主に以下の3点じゃないだろうか?
  • LinuxやUnixへのリモートログイン
    (sloginコマンド)
  • 暗号化された通信を用いたファイル転送
    (scp/sftpコマンド)
  • 暗号化された通信を用いたリモートコマンド実行
    (sshコマンド)
sshってのは、上記以外にもう一つ、大きな機能がある。それがポートフォワーディングと呼ばれているものだ。

あれ?タイトルには「sshトンネル」って書いてあるよ?
そう。sshトンネルってのは別称で、正しくはsshポートフォワーディングだ。

そして、sshポートフォワーディングには、

  • ローカルポートフォワーディング
  • リモートポートフォワーディング

の2種類がある。
それぞれ、ざっくりと図解すると、以下のようになる。
ローカルポートフォワーディング

リモートポートフォワーディング

ローカルポートフォワーディングの方は、自分自身の端末(PC)へのアクセスを、遠隔のサーバに転送する仕組みだ。
リモートポートフォワーディングはその逆。

上記図では、自分とssh接続先だけの関係だが、ちょっと手を加えると以下の様なことも可能になる。
ローカルポートフォワーディング例

リモートポートフォワーディング例

この図の通り、2台の機器の間でssh通信を確立しておくことで、別の機器からの通信も出来るようになる。
(但し、通常はセキュリティを考慮して、別の機器からの通信は出来ないようにしますが…)

これには幾つか制約があって、何でもかんでも転送出来るわけではない。
ざっと…

  • 転送可能なのはTCPのみ
  • サーバ側ポートが変動したり、逆方向接続が発生するものはNG(ftpとか)

だ。
つまり、TCPで固定ポートを用いる通信であれば、転送させることが可能になる。

この機能を使えば、自宅内のWindowsPCに、屋外からリモートデスクトップ接続出来るようになる、というのが今回の趣旨。(やっと目的の話に…)

ちょっと長くなったので、ココで一旦分離。