PortForwarder

22番ホームへ、いらっしゃい。 のつづきです。

ポートフォワーディング(SSHポート転送)を利用すれば、ブロードバンドルータやファイアウォールを安全に飛び越えて、外から家庭内LAN内のいろんなサービス(リモートデスクトップとかプロキシとかメディアサーバー?とか)に接続できたりして、とても便利な機能なのですが、いかんせん、Windowsでそれらを使用するにはハードルが高すぎますね。

TeraTermを毎日使うような、いわゆるサーバー管理屋さん(クライアントにWindowsなんて使ってないと思うけど・・・)ならともかく、僕みたいに、ちょこっと使えればいいんだよ! という人向きではないです。

ともかく、FTPでファイル転送するたびにTeraTermを起ち上げるなんてメンドーだ。

というわけで、Windowsに常駐してくれるタイプの、その名もズバリのプログラムを公開されている方がいました。検索すれば出てくる。Windowsではあまり需要がないのか?数が少ない。いろいろ探してみたけど、「PortForwarder」しか見つけられなかった。

「PortForwarder 2.9.0 release October 20, 2007」
http://toh.fuji-climb.org/pf/JP/

フリーで、ソースも公開されているし、機能もシンプルです。切断ボタンがあれば・・・とも思ったんですが・・・必要十分です。

設定はファイルに記述するタイプで、

Host HOGEHOGE.JP
    HostName xxx.xxx.xxx.xxx
    User yyyyy
    LocalForward 9999 127.0.0.1:21
    LocalForward 50000 127.0.0.1:50000
    LocalForward 50001 127.0.0.1:50001
    LocalForward 50002 127.0.0.1:50002
    LocalForward 50003 127.0.0.1:50003
    LocalForward 50004 127.0.0.1:50004
    LocalForward 50005 127.0.0.1:50005
    Compression yes

 

と、こんな感じの記述です。カンタンです(^^)

公開鍵認証をさせるには秘密鍵をid_dsa というようなファイル名にして、実行ファイルと同じディレクトリに置いとく必要があります。秘密鍵自体をコピーして分散させるのがいやで・・・WindowsVistaから「ホンモノ」の(笑)シンボリックリンクが作れるようになったので、秘密鍵へシンボリックリンクをはることで回避。

・・・ファイルパスを指定できるようにできたらな・・・とか、切断ボタンがあれば・・・とか、機能そのものじゃなく、GUI的な部分で若干不満がありますが・・・、これもソースが公開されているので、「使いやすいように自分でなんとかしてね」ということなんでしょうね(^^;;;

また暇ができたらGUI部分を改造しようかな、と思います。いや、便利です。コレ。

Windows本体でこういった基本的な機能はサポートしてくれりゃいいのにね・・・。

22番ホームへ、いらっしゃい。

変なタイトルですみません・・・。(ちと間違いがあったので大幅に修正しました。9/2)
「ポートフォワーディング」を検索すると概念的な説明とか詳しい設定方法がいっぱいあるのでそちらを参照するほうが良いです。あくまで自分用の備忘録です。あしからず。

Webサイト構築などでサーバーの設定を自分でいじれるようになると、いろいろ触りたくなるものです。通常ホームページのデータはFTPでアップロードしてたわけですが、セキュリティーだの個人情報だの、騒がれると、このFTP経由でのアップロード手段も問題となります。FTPの何が駄目なのか、「生のデータを垂れ流す」この一点につきると思います。パスワードでさえプレーンテキストで送っちゃうんですから・・・。

というわけで、SFTPだの、SSLを利用したFTPSだのといったものが出てくるわけですが、使い慣れたFTPクライアントを変えたくない・・・というのは誰しも思うのではないでしょうか。

そこで、これらセキュリティーの問題を克服しつつ、使い慣れたFTPクライアントを使い続けたい・・・この二つの要望を叶えてくれるのが、TCP 22番ポートを利用した、ポートフォワーディングというわけです。

つい最近知りました(笑)

もともとは、DreamWeaverCS4で、秘密鍵を利用したsFTPができないことが、不満で、いろいろ検索して調べた結果、このポートフォワーディングという仕組みを知ったというわけです。なお、DreamWeaverCS4はSFTPのパスワード認証ログインのみ対応しているようです。CS5は持ってないので分かりません。

で・・・ポートフォワーディングを利用する準備です。TeraTerm(ver4.65)を使用します。

  1. サーバー側のsshd の設定を確認。
    /etc/ssh/sshd_config ファイルで、AllowTcpForwarding yes に。
  2. FTPサーバー(vsftpd) の設定ファイル(/etc/vsftpd/vsftpd.conf)に次を追記。
    pasv_promiscuous=YES
    (注)YES に設定した場合、 PASV セキュリティーチェックを無効にし、 制御用の接続と異なる IP アドレスからのデータ接続を許可する。 何をしているかを理解している場合にのみ有効にすること。 唯一の道理にかなった利用法は、安全なトンネルの中で使うか、 そうでなければ、おそらくは FXP(訳注: リモートホスト間転送) を容易にするためのものである。

    pasv_min_port=50000
    pasv_max_port=50002
    も追加します。PASVモードでデータ受信のためにランダムなポートで接続しますので、これらポートもポートフォワーディングしないといけません。ポート番号の最小値・最大値を指定してそれらのポートすべてについてポートフォワーディングする必要があります。 ※これら上記の値(50000とか)は適当につけてます。

  3. TeraTermの「設定」メニューの【ssh転送】を設定。 
      SSHポート転送2 
    「ローカルのポート」は、FTPクライアントと同じマシン(つまりlocalhost)の適当なポート。21番じゃなくてもいい。なんでも好きなの。 「リモート側ホスト」には、sshdが動作しているサーバーから見たFTPホスト。たいていsshdとvsftpdは同じマシンで動作していることが多いし、実際僕の場合もそうなので、今回はサーバーから見たFTPホストということで127.0.0.1を入力。
    また、これと同様に上記で
    pasv_min_port=50000
    pasv_max_port=50002
    と設定しているので、50000~50002までのポートも同様に転送設定を行います。
    SSHポート転送3 

    最終的には、下記のような感じになります。
    SSHポート転送 

    これらの設定で、クライアント側のマシンで21番と,50000~50002番ポートがLISTEN状態になっているはずです。コマンドプロンプトを立ち上げ、netstat –a –p TCP と入力することで確認できます。

  4. 準備完了で、次はFTPクライアントの設定変更です。
  5. FTPクライアントの設定。
    普通はFTPサーバーの接続先は、Webサーバーのアドレスを指定していると思いますが、これをlocalhost、つまり自分のマシンのループバックアドレス(127.0.0.1)を指定します。使用するポートは、上記で指定した「ローカルポート」を使うように設定します。上記の例ですと21番を指定しているので、FTPクライアントのポート番号を変更する必要はないですが。
    あと、PASVモードを有効にする必要です。
  6. これで設定終了。
    つまり、FTPクライアントは、自分のマシンの21番ポートにアクセスすると、ポートフォワーディングによって、その接続(コネクション)がリモートホスト側に転送されるってわけで。自分のマシンからリモートホストまでは当然、ssh接続なのですべてのデータが暗号化されている・・・ってわけで、これで安心・・・というわけです。。。
  7. ちなみに・・・
    FTPサーバーの設定で、ローカルアドレス(127.0.0.1)からのみ接続可のように設定しておけば、ポートフォワーディングしていない、普通の?FTP接続は拒否できると思います。たとえば、僕は /etc/xinetd.d/vsftpd に、only_from = 127.0.0.1 とかしています・・・。

FTP接続するたびに、TeraTermを立ち上げなければなりませんが、まぁ、最小化していれば問題ないしね。。。

 

で、このポートフォワーディングを利用することで、なにかとアクセス制限が多くなるファイアーウォールを超えて自由に通信が可能になります。家のブロードバンドルータの22番ポートさえ開けておけば、適切にアドレス変換などの設定を行うことで、インターネット上の経路を流れるデータを暗号化しつつ、どんなポートでも転送してくれるので非常に便利です。

あ、sshdデーモンの設定を変えれば別に22番ポートじゃなくてもいいかなと。 実際、秘密にするときは、22番ポートなんて使わないでしょうし。。。

いやぁ、Linuxのサーバー一個家に入れとくだけで、たいていのことなら全部解決してしまいますねぇ~。便利ですねぇ。

VirtualHostの設定

今のブログ(WordPress)のテーマが飽きてきたので、変えてみました。ちょっと見づらいけど・・・。

Apache2.2でバーチャルホストの設定を行っていて、あまりにも無知なおいらに愕然としたので、備忘録として残しておこう・・・というエントリです。

なお、このエントリいう、バーチャルホストは、ネームベースのバーチャルホストです。さらに、LAN内のテスト目的に設置するWebサーバーの事です。あしからず。

通常、バーチャルホストの設定は、以下のような感じかと思います。

 
NameVirtualHost *:80 
<virtualhost *:80>
  ServerName first.localdomain
  DocumentRoot /var/www/vhosts/first
</virtualhost>

<virtualhost *:80>
  ServerName second.localdomain
  DocumentRoot /var/www/vhosts/second
</virtualhost>

のような感じかなと。

そうすることで、http://first.localdomain/ とか、http://second.localdomain/ とかでアクセスできるようになりますよね。

ここで、httpsでもアクセスできるようしたい場合・・・HTTPSリクエストを処理できるように設定をした上で、さきほどの設定にNameVirtualHost *:443 を追加して、<VirtualHost *:80> を、<VirtualHost *:80 *:443>と書けば済む話だったんですね・・・。

 
NameVirtualHost *:80
NameVirtualHost *:443

&lt;virtualhost *:80 *:443&gt;
  ServerName first.localdomain
  DocumentRoot /var/www/vhosts/first
&lt;/virtualhost&gt;

&lt;virtualhost *:80 *:443&gt;
  ServerName second.localdomain
  DocumentRoot /var/www/vhosts/second
&lt;/virtualhost&gt;

ドキュメントをよく読めばすぐ解決するものを・・・しかも、:80を省略したら、httpdの起動時にエラーになるし・・・。気付くの遅くてApacheの設定にまる一日かかっちゃったよ。。。(ーー;;;

やっぱり、ドキュメントはちゃんと読まないとダメですね・・・。
で・・・バーチャルホストの設定をいろいろやってたら・・・

自分だけが知っている秘密のホスト名をつけたバーチャルホストを定義すれば、公開しているWebサーバーと同じサーバー上に秘密の?Webサーバーを同時に立てられるな・・・と気がつきました。気付くの遅すぎ(笑)

隠したければ、BASIC認証なりDigest認証なりでパスワードでロックすれば済む話ですが、存在自体をなるべく隠したいといった場合は使えるかもしれませんね。。。もちろん、クライアント側には、hostsファイルなどでIPアドレスと名前を登録しなければいけませんが・・・。仲間内だけでWebサーバーを公開したいといった場合は便利かも・・・。

WordPress with Windows Live Writter

Microsoft の skydrive を使ってまして、画像なんかをここにまとめようと、カンタンにアップロードできる、Windows Live フォトギャラリーを入れました。

それは、それで便利になりましたが、そのついでに、ブログ記事を編集・投稿できる Windows Live Writer というツールも一緒にインストールしたんですが・・・コレめっちゃ便利です。。。気付くの遅すぎ・・・。

WordPress.com への投稿もでき、WYSIWYGが・・・(^^

キャプチャ

ダミーテキスト

Webページのレイアウトを考えるとき、FireWorksでページのレイアウトデザインを作成して、それを元にパーツ画像・ボタン類などを作成、あとはDreamWeaverなり、テキストエディタなりでHTMLとCSSを組んでいく・・・という流れがごくごく一般的だと思います。
 

デザインだけで内容が全く決まっていない、というとき、テキスト部分には、たとえば、「ダミーテキスト」などの仮のテキストの羅列を入れることが多いのですが、やはり同じ内容のテキストの羅列だと、完成したときのイメージが湧かない、と言われたこともありました。
 

FireWorksで、ダミーテキスト生成して挿入する下のようなコマンドを作成して、%APPDATA%\Adobe\FireWorks CS4\Commands へ放り込んで使っています。やっていることは至極単純で、テキストファイルの各行を配列に読み込んで、乱数で得られた数字を使って数回、配列から読み出しているだけ。
 

問題は、それに使用するテキストファイルの内容。ある程度日本語として文法が正しく、かつ、それ文章自体は意味をなさない・・・という、とにかく訳のわからないテキストが理想です(笑)
ネットから勝手に取って使用すると「著作権が・・・」とかあると思うので、パブリックドメインのテキストがないか調べて、僕は3つのテキストを選択しました。パブリックドメインなので、どう使おうと自由、という非常にありがたいものです。。。
 

僕が選んだのは、聖書の英語訳と日本語訳。それと、平家物語の原文。もちろん全文読み込んだりすると処理に非常に時間がかかるので適当に抜き出し、加工を加えました。

ダミーテキストのソースファイル

でも、これだけだと不満があって、英文と日本文が適度に混じったテキストがないか探索中です。手っ取り早く、技術文書などの専門書から取るのがいいのですが・・・なかなかパブリックドメインのものがねぇ~、ないんですよねぇ~。
 

ダミーテキストとしての僕の理想は、日本語と英語が適度に混ざって、かつ、カタカナもある程度混じって、なおかつ、意味が分からないテキスト(笑) そんなのないですかねぇ~・・・。
 

/************************************************************************
 ダミーテキスト挿入.jsf for FireWorks CS4
 %APPDATA%\Adobe\FireWorks CS4\Commands へ入れとく。
 
 ファイルが本当にテキストファイルかどうかのチェックはしていない。
*************************************************************************/
var num   = 5;
var times = 1;

insertDummyText = function(n,t)
{
  var file = fw.browseForFileURL("open","ダミーテキストファイルを開く");

  if(file == null)
	  throw new Error("ファイルが指定されていません");

	var fin = Files.open(file);
  var lines = [];
  var line_ = null;
  var out = [];

  while((line_ = fin.readline()) != null)
    {
      if(line_.match(/^\s*$/))
        continue;

      lines.push(line_);
    }

  fin.close();

  for(var i = 0;i < t;i++)
    {
      for(var j = 0;j < n;j++)
        {
          var index = parseInt(Math.random() * lines.length);
          out.push(lines[index]);
        }
      if(i < t - 1)
        out.push("\n\n");
    }

  var dom = fw.getDocumentDOM();

  dom.setTextAutoExpand(false);
  
  if(typeof fw.selection[0] == "undefined")
    dom.addNewText({top:5,right:dom.width/2,bottom:120,left: 5},true);

  var runs = fw.selection[0].textRuns;

  runs.textRuns = [{changedAttrs: {}, characters: out.join('')}];
  fw.selection[0].textRuns = runs;
}

try{insertDummyText(num,times);}catch(e){alert(e.message);}