SSHツールを使ってリモート・ネットワーク・サービスにアクセスする

 プライベートなネットワークにあるサービス ─ Wiki、メールサーバ、Webサイト、またはその他のインストール済みのアプリケーションなど ─ を利用する人は多いだろう。しかし、使い慣れたネットワーク環境を離れざるを得ない状況もある。最小限の公開と少数の簡単なツールを使うことで、自宅と同じ快適性をインターネット接続がある場所ならどこでも手に入れることができる。

 最初に、外出中にプライベート・ネットワークを見付ける手段が必要だ。ネットワークに静的なIPアドレスがあり、ドメイン名が登録されている場合、これを指定すればアクセスできる。DHCPによって割り当てられるアドレスを使ってインターネットにアクセスする場合は、ちょっとした作業が求められる。

 最も簡単な方法は、Whatsmyipのようなサービスを利用して、直接アクセスできるネットワークのIPアドレスを調べることだ。プライベート・ネットワーク内でこのWebサイトを開くと、そのネットワークで使用されるIPアドレスがページに表示される。このアドレスは、ネットワーク内のコンピュータに割り当てたアドレスとは関係のない、ゲートウェイマシンまたはルータの外部ネットワーク・アドレスである。

 この方法の問題点は、インターネット・サービス・プロバイダが定期的にこのIPアドレスを変更する場合があることだ。頻繁ではないだろうが、ネットワークにアクセスできることをうのみにしていると、早晩当てが外れることはまず間違いない。

 これを回避するには、新しいIPアドレスが割り当てられたことを検出して外部DNSサービスに通知する動的なDNSクライアントを使う。DNSサービスは、特定のDNS名に割り当てられたIPアドレスを更新するので、この名前を使って目的のネットワークにアクセスできる。IPアドレスは変更されることがあるが、DNS名は変更されない。

 多くのルータはこのような各種のサービスをサポートするが、オープンソースの代替ルータファームウェアTomatoなどにも同様の機能がある。そうしたサービスの1つは、たとえばDynDNSだ。ルータでサポートされるこの種のサービスを使用して、アカウントにサインアップする。多くの場合、フリーのアカウントにサインアップして、用意された複数の既存のドメイン名の1つでホスト名を選択できる。あるいは、DNS名をもっと柔軟に選択できるアカウントを有償で利用することもできる。このアカウント情報をルータに設定すれば、選択したホスト名とドメイン名を使ってネットワークにアクセスできる。

 ネットワークを見付けることができさえすれば、そこに用意されたサービスにアクセスできる。このアクセスの基盤となるのが、OpenSSHプロジェクトが開発したsshコマンドである。sshコマンドは、Secure Shellサーバを実行するシステムへ高いセキュリティで保護された状態でアクセスすることを可能にする。最も一般的な使い方は、リモートからコマンドラインシェルにログインすることだが、もっと複雑なタスクを実行する機能もある。ネットワーク内でシステムへのSSHアクセスを設定する(翻訳記事)ことは、たいていのLinuxディストリビューションでかなり簡単に行える。

 ルーターを通じてネットワークにアクセスするには、ポート・フォワーディングを使用する。この機能により、ルータはインターネット側からのネットワーク接続を特定のポートで受け付け、そのポートに関連付けられたすべての通信をネットワークのローカル側のコンピュータに中継する。最も簡単なやり方は、ルータの外部ポート22をネットワーク上のコンピュータ(SSHサーバが稼働するマシン)の1台のポート22に接続することだ。

 ポート・フォワーディングと動的DNSサービスを適切に設定しておけば、インターネットを利用できる行きつけのコーヒー・ショップからsshを使って目的のホストとドメインに接続できる。

 ログアウトし、次に「ssh -D 1080」を使って接続する。このコマンドを使うと、SSHサーバを実行するコンピュータとクライアントとの間でSOCKSプロキシがポート1080に設定される。クライアントを適切に設定すれば、このプロキシを使ってプライベート・ネットワークの他のコンピュータにアクセスできる。たとえば、クライアントは ─ 仮にwww.linux.comに接続するとして ─ これに直接接続するのではなくSOCKSプロキシに接続し、このプロキシがクライアントに代わってwww.linux.comに接続するというしくみだ。クライアントとリモート・サーバ間のトラフィックは、プロキシ接続の”トンネル”を通過する。つまり、リモート・サーバから”見える”システム(内部サーバを含む)は、プロキシを使うクライアントからも見える。また、コンピュータ間のトラフィックは、暗号化されたSSH接続を通過する。

 ほとんどのネットワーク・システムではすべてのクライアント接続にSOCKSプロキシを使うよう設定することが可能だが、使用しているローカル・ネットワーク上のシステムに接続しようとした場合に問題が生じる。リモート・システムからはこのようなシステムが”見えない”のだ。よって、使用する必要があるクライアントとアプリケーションのみにSOCKSプロキシを設定する方が良い。

FirefoxProxy_thumb.png
Firefoxのプロキシ設定

 LinuxでFirefox 3を使う場合、[ツール] → [オプション] → [詳細] → [ネットワーク] → [接続設定]を選択すると、[インターネット接続]ダイアログボックスが表示される。

 [手動でプロキシを設定する]をオンにする。[SOCKSホスト]に「localhost」と入力し、[ポート]に「1080」と入力する。これで、「ssh -D」コマンドで作成したSOCKSプロキシがFirefoxで使用される。

 Firefoxを使ってリモートからプライベート・ネットワークをブラウズする前に、もう1つやることがある。Firefoxのロケーションバーに「about:config」と入力する。表示される画面で、[フィルタ]ボックスに「network.proxy.socks_remote_dns」と入力すると、この設定項目の値が表示される。値がfalseになっている場合は、ダブルクリックしてtrueにする。これにより、このリモート・サーバをFirefoxで開く場合に、このDNS要求が強制的に使用される。このサーバはローカル・ネットワーク上のコンピュータを(それ自身のDNS設定を基に)認識できるため、Firefoxもこれらのコンピュータにアクセスできる。

 以上の設定で、Firefoxはリモート・ネットワークにあるサイトをブラウズできる。ただし、”socks_remote_dns”設定を使用する場合、ローカル・ネットワークでしか使用できないサイトをブラウズできないことを忘れてはならない。リモートDNSサーバはこのようなサイトを認識しないからだ。

 同じような方法でThunderbirdを設定すれば、内部IMAPサーバも見えるようになる。

 ネットワークの外部からネットワーク・サービスにアクセスできるだけでなく、ネットワークとは無関係のGUIアプリケーションを実行することもできる。たとえば、パッケージ・マネージャのSynapticを使って、リモート・システムにインストールされているパッケージを確認したりできる。

 この動作には、X Window Systemのネットワーキング機能が利用される。アプリケーションがX Window System、あるいはX Window Systemを使うGTK(GNOME)やQt(KDE)などのGUIフレームワークを使ってウィンドウを描画すると、実際にはウィンドウ描画の要求がXサーバに送信される。このサーバはアプリケーションと同じコンピュータにあるのが一般的だが、これは必須ではない。描画の要求を、ネットワークの別のコンピュータで稼働するXサーバに送信することも可能だ。こうすると、アプリケーションは別のコンピュータにGUIを表示できる。アプリケーションでは、GUIを表示するコンピュータを環境変数DISPLAYから知ることができる。

 この方法の弱点は、X Display Protocolがセキュリティを考慮して設計されていないことだ。アプリケーションをネットワーク経由で操作している様子を、第三者が”観察”できてしまう。また、当然ながら、アプリケーションを実行しているコンピュータにはXサーバが稼働するコンピュータが”見える”必要があるが、ファイアウォールやその他の障害物が途中にあるため、常に可能とは限らない。

 ここでもSSHが解決策となる。リモート・コンピュータに接続するときにssh-Xオプションを使うと、プロキシXサーバがリモート・コンピュータに作成され、DISPLAY変数が適切に設定される。実行されるXアプリケーションは、このプロキシに要求を送信する。プロキシは、高いセキュリティを備えたSSH接続を使って要求を”本物の”Xサーバに転送する。

 リモート・サーバでSSHの設定を調整して、X11フォワーディングを有効にする必要もある。ほとんどのLinuxディストリビューションでは、この設定を/etc/ssh/sshd_configファイルの編集と、変数X11Forwardingを”yes”に設定することで行う。この変更を有効にするには、sshdを再起動する(Ubuntuの場合は「/etc/init.d/sshd restart」を実行する)。また、Xauthが/usr/bin/xauthにインストールされていることも確認する。Xauthは、プロキシ・サーバへの接続を認証するためにSSHで使用される。

 これで、リモート・ネットワークにあるネットワーク・サービスとGUIアプリケーションの両方にアクセスできる。また、ファイルにもリモートからアクセスできる。SSHベースのscpコマンドは、リモート・システムとの間でファイルをコピーするコマンドだ。ただし、1つか2つのファイルならまだしも、それ以上の数のファイルをコピーしようとすると、この方法はかなり面倒くさく、使いにくい。

 代わりに、SSH Filesystem(SSHFS)を使ってファイルをリモート・システムにマウントできる。SSHFSは、Filesystem in Userspace(FUSE)プロジェクトをベースとし、カーネルを変更せずにファイルシステムの実装を可能とする。リモート・ファイルには、高いセキュリティで保護されたSSH接続を使って簡単にアクセスできる。SSHFSを使うには、ローカル(クライアント)システムにSSHFSをインストールする必要がある。Ubuntuでは、「sudo apt-get install sshfs」を実行するとインストールが行われる。その後で、マウント・ポイントを設定する。ファイルシステムをマウントすると、このローカル・システム上のディレクトリにリモート・ファイルが姿を現す。たとえば、REMOTEMOUNTというディレクトリを作成し、これにリモート・システムのホーム・ディレクトリをマウントするには、コマンド「sshfs dyndns.example.com: REMOTEMOUNT」を実行する。

 sshfsを実行するためにsudoを使う必要はない。sshfsコマンドの実行が完了したら、REMOTEMOUNTディレクトリでlsを実行するとリモート・ホーム・ディレクトリの内容が表示される。リモートのファイルは他のファイルと同じように操作できるが、ファイルの内容がSSH接続を通してやり取りされるため遅延が発生することを念頭に置く必要がある。

 アクセス権の問題が発生した場合は、ローカルで使用するアカウントが”fuse”グループのメンバかどうかを確認する。多くのディストリビューションでは、「usermod -G fuse username」を実行するとこの設定を行える。

 リモート・ネットワークから切断する、つまりシステムをアンマウントするには、コマンド「fusermount -u REMOTEMOUNT」を実行する。

 OpenSSHプロジェクトが提供するツールを使うことで、プライベート・ネットワークをリモートから操作する際に事実上あらゆる機能に高いレベルでアクセスできる。こういったツールを使うと、ネットワークのセキュリティを維持したまま、その能力をインターネットのどこからでも活用できる。

Linux.com 原文(2008年11月11日)