ソフトウェアとハードウェアの境界

ホビー開発に関する誰得情報満載☆

リモートデスクトップ(RDP)、VNCで外部から安全に接続 sshポートフォワーディング

男のロマン 外出先から自PCの操作

PCをある程度操作できるようになり、あー便利な道具だなぁ、と思い出す頃に誰しも考えるのがPCのリモート操作ではないだろうか。
最初は漠然と誰かのPCを操作したり、外部から自分の端末を操作することを考えるだろう。
全く知らない誰かの端末を操作することは法的にも技術的にも困難なのだが、外部から自宅のPCや、全く異なる場所に配置されたサーバなどを操作することで、不可能であった仕事を可能にしたり、移動にかかるコストを完全に無くすことができる。
そして何より「オレITやってるー、うわぁいw」と自己陶酔したい。 そう、そこには男のロマンがある。 ネットワークを介して自宅のPCを操作して、仕事中にあれをしたりこれをしたりグフグフするわけである。
しかし、その男のロマンのためにセキリュティを犠牲にすることは以ての外である!!

…いやすまない、少し熱くなりすぎたようだ。
仕事中に遊ぶなど品行方正な我が社では許されることではないのだが、やってしまったものは仕方がない。 ボク以外のそういったユーモアのある諸君のためにも、安全に快適にリモート操作ができるように、その方法を提示しておきたい。

SSHポートフォワーディングの概要と目的

下記リンクページから抜粋させていただく。

sshポート転送(フォワーディング)とは他マシンにあるIPポートを、自マシンのポートとして扱うための技のひとつ

上記リンクもすごくわかりやすいのだが、あえて初学者向けに図に描いてみると下記のようになる。

SSHポートフォワーディングのイメージ

f:id:tokixy56:20160312173631p:plain
よく聞いて欲しい、この図はボクがワードを使って2時間くらいかけて描いた。
すごいと褒めてくれ。

つまり、sshポートフォワーディングとは、ローカルのポートを別のポートに転送すること。 図にあるように、サーバ側のLAN内の別のサーバのポートに転送することも可能なのだ。

目的は、インターネットを介した安全な通信

SSHサーバを立てる際、公開鍵方式で通信するのが一般的であり、またそうすべきである。 SSHの設定や運用については他にたくさん資料があるのでそちらを検索して調べてみよう。
SSH通信では、通信の際にやりとりするデータが暗号化されているので、途中でデータを改ざんされたり、不正に見られることはほぼ無い。
SSHポートフォワーディングでは、その通信方法、通信経路を利用して他のプロトコルを安全に使用することができる。 RDPやVNCは、デフォルトでは暗号化などのセキュリティ対策が多分全く施されていないので、インターネットを介した利用は絶対に避けるべきである。

したがってほとんどのsshポートフォワーディングの目的は、単純なポート転送でなく、安全な通信、安全なRDPやVNC通信、その他の通信プロトコルを実現することである、と言ってもいいだろう。

外部から自宅のサーバへアクセスする方法について

自宅に回線を引く場合、プロバイダから提供されるルータを使用することになると思う。 多分、普通にLANをつないだりWifiアクセスポイントとして使っている場合、デフォルトゲートウェイは[192.168.0.1]に設定されているはずだ。 その場合は、ブラウザのアドレスバーに[192.168.0.1]と入力すれば、デフォルトゲートウェイであるルータにアクセスできる。 ルータのIPアドレスが上記と違うときは、自端末のネットワーク設定を確認してみよう。「デフォルトゲートウェイ」あるいは「ゲートウェイ」に設定されているIPアドレスがそれに当たる。
ブラウザからルータに接続する際、ユーザ名とパスワードの入力を求められると思うが、機器によってデフォルトのユーザ名とパスワードが異なるため、説明書を読むか、プロバイダに問い合わせして確認しよう。

プロバイダによってルータは様々だと思うが、ボクの家のルータはポート転送機能が付いている。

ルータのポート転送のイメージ

f:id:tokixy56:20160313210102p:plain
よく聞いて欲しい、この図はボクの適当な手描きの絵を、知人がイラストレータで一生懸命描いた
すごい綺麗に描けてるし、その完成度にビックリ。サーバの図とか見て。やばい。
どんだけー。

プロバイダから提供される各ルータには、そのプロバイダからグローバルIPアドレスが割り振られる。 このグローバルIPアドレスは、上記で説明したように、LAN内の端末のブラウザから確認したりすることができる。 外部からそのグローバルIPアドレスのポート22番にアクセスすると、普通はルータのファイアウォールに接続を拒否される。
そこでルータに実装されたポート転送機能を使用してLAN内の特定のポートを、例えば192.168.0.100の22番とか、192.168.0.111の3000番という風に、任意に設定したポートに転送する。
この機能を利用することによって、外部から自宅へアクセスできるのだが、例えば単純にRDP用3389番ポートを、普通にローカルのリモート接続可能なWindowsへ転送することは、あまりに危険であることは想像に難くないだろう。
そこで、sshポートフォワーディングを利用するわけだ。
したがって、上記の図のように、63000を3389へ転送する設定などはしないようにしよう。

更に突っ込んだ注意点

もうひとつ大きな注意点として、sshポートフォワーディングをする際、クライアント端末にファイアウォール設定などが適切に設定されておらず、ローカルネットワーク内のどんな端末からも接続可能な場合だ。 例えばその設定で公共の場で使用し、そのクライアント端末から自宅へ接続しているとき、そのクライアント端末を踏み台にしてアクセスされることが考えられる。
ちゃんとファイアウォールの設定や使用する場所に配慮して利用するようにしよう。

SSHポートフォワーディングの構成と設定

クライアント-サーバ間の構成(例)

まず、sshポートフォワーディングをするためには、sshサーバが必要になる。
またsshサーバと別にリモートデスクトップができるWindowsや、その他のVNCサーバも必要だ。

今回は上記にある図を元に設定するとする。
また、sshクライアントのTeratermの設定と、sshサーバのポートフォワーディングに関する設定を主として説明し、その他のRDPサーバ、VNCサーバの設定の詳細は説明しない。
LinuxVNCデーモンであるtightvncなどの設定は、いずれ別記事でまとめたい。

クライアント端末(例)
項目
OS Windows 10
sshクライアント Teraterm
RDPクライアント 標準リモートデスクトップクライアント
vncクライアント RealVNC
ルータ(例)
項目
グローバルIPアドレス 123.234.111.100
ローカルIPアドレス 192.168.0.1
ポート転送 ポート22 → 192.168.0.100のポート22
sshサーバ(sshポートフォワーディングサーバ)(例)
項目
OS CentOS 7
IPアドレス 192.168.0.100
sshデーモン openssh[:22] (ココがルータのポート転送の転送先)
vncデーモン tightvnc or x11vnc[:5900]
Windowサーバ(例)
項目
OS Window 10
IPアドレス 192.168.0.10
RDPサービス リモートデスクトップ[:3389]
vncデーモン RealVNC[:5900]
Linuxサーバ(例)
項目
OS Ubuntu 14.04
IPアドレス 192.168.0.50
sshデーモン openssh[:2222]
vncデーモン tightvnc or x11vnc[:5900]

SSHサーバの設定

SSHサーバの設定は特に無い。 /etc/ssh/sshd_configをいじる必要もない。 普通にsshサーバとして稼働させておけば良いだけだ。
sshサーバの設定は、OSとマシンは違うのだが、ボクの過去記事を参考にしてもらいたい。
が、下記の記事は実際、余計な説明にかなり多くを割いているので、他の人が書いたページを参考にした方がいいと思う。 と、言いつつ一応リンクを貼っておく。
Raspberry Piでサーバ構築①(ssh編 公開鍵未設定)
Raspberry Piでサーバ構築②(Samba編)
Raspberry Piでサーバ構築③(ssh公開鍵編)
新しく発売されたRasbperry Pi 3を買って、sshポートフォワーディングサーバにしてもいいなと思った今日このごろ。

SSHクライアントの設定(Teratermの設定)

まず上記のSSHポートフォワーディングの構成と設定の設定値に合わせて、RDPを例にとって手順を簡単に説明すると、

  1. Teratermで事前にクライアント端末のlocalhost:3389を、サーバ側の192.168.0.10:3389へ転送するよう、ルールを設定しておく。
  2. Teratermで123.234.111.100:22のsshサーバに接続する。
  3. Teratermで接続したまま、RDPクライアントを起動する。
  4. 転送ルールにしたがって、RDPクライアントよりlocalhost:3389にアクセスする。

最重要なのは、1.Teratermで事前に転送ルールを設定の部分だ。

Teratermでポートフォワーディングの設定

ここがsshポートフォワーディングで一番肝心な部分となる。
この説明でもRDPを例にとって手順を説明する。

Teraterm [設定]メニュー

f:id:tokixy56:20160313193347p:plain
Teratermの[設定]から、[ssh転送]をクリック

sshポート転送画面

f:id:tokixy56:20160313193806p:plain
[追加]ボタンをクリック

sshポート転送設定画面

f:id:tokixy56:20160313193818p:plain
この画像の[ローカルのポート]がクライアントマシンのポート番号を指す。
そして、[リモート側ホスト]の方で、sshで接続しているサーバ側の、サーバを含むLAN内のいずれかのIPアドレスとポート番号を指定する。
設定が終わったら[OK]をクリック

設定を保存

f:id:tokixy56:20160313193347p:plain
上記の設定が終わったら、[設定]メニューから[設定の保存]をしておくと、次回から毎回設定する必要がなくなる。

リモートデスクトップで接続

f:id:tokixy56:20160313193827p:plain
Teratermで普通にサーバに接続した状態にしておく。
接続したままの状態で、この画像のようにリモートデスクトップlocalhostの3389へアクセスすれば、サーバ側のリモートデスクトップサーバにアクセスできるはず。
もちろん切断する場合は、RDPを切断してからsshを切断するようにしよう。

その他のVNCや他のsshサーバへの接続も、この設定と同様に設定していけばよい。 これにて、sshポートフォワーディングの設定方法の説明はサラッと終わらせてもらう。

余談 チャットツール

皆さんは、普段どういった方法で友人と連絡を取り合うのだろうか。
ボクは普段はもちろんLINEを使用しているのだが、どうしても好きになれない。
スタンプの機能も今ではほとんど使わなくなった。

あのさぁ、できればみんなSkypeGoogle hangouts使おうよー。
SkypeGoogle hangouts布教していこうよー。

というわけで、Skypeかhangouts、どちらがいいかコメントお待ちしている。