FTPサーバの構築<War FTP Daemon(WarFTPD): WinNT系編>
FTPサーバテストの評価用に、以前Windowsサーバ時代に使っていたTiny FTP Daemonを使用しましたが、他のデーモンでは全く問題がないのですが、いまいちテストと相性が悪く動作が不安定なので、他のWindowsで動作するデーモンを探したところ、War
FTP Daemon(WarFTPD)を見つけました。試用してみた感じでは、スループットも測定したわけではありませんがかなりよさそうです。おやじが使用したのは、1.81-03-betaですが、安定化版としては
1.67b05があり、こちらはインターネットを検索すれば、日本語化パッチも出ています。1.81-02-betaと1.65b05では、GUIも機能も大幅に変わっています。変更点については
こちらにありますが、1.7以降では、Win9x/Meでもサービス起動できるようです。(
9x系についてはこちらで) また、1.81からはNAT対応がされており、環境条件があえば、WindowsでNATルータ越えのPASVサービスができるようになっています。(詳細は後述)
なお、おまけですが、1.81-04-beta用の日本語化パッチを作成してみました。おやじの苦手な英語なので的を外しているかもしれませんが、かなりの範囲を日本語化してあります。良かったら使ってみてください。(表現がおかしいところや、意味が間違っているところがありましたら、おやじまでご連絡ください。)
こちらの方法では、CRONをインストールする等、設定が面倒と思われる方やうまく動作できない方のために、インストール(設定)を簡単にしたものを
こちらに用意しました。
WarFTPdは、ファイルアクセスまわりと、デーモンへのアクセスコントロールのデフォルト設定がおかしいので、うまく動かせない方が多いようなので、こちらに
基本的な使用方法をまとめてみました。
WarFTPd が、1.82rc7 から動的 IP サービス環境で NAT ルータ越えの PASV サービスができるようになったため、基本的にはこちらを参考にしてください。
[ダウンロード]
WarFTPdの日本語化パッチやおやじが作成したスクリプト等を、
ダウンロードのページからダウンロードしてください。
[更新履歴]
日本語化パッチをWarFTPd 1.82.00RC1対応に変更しました。WarFTPd 1.82.00RC1は、アップデートもしくは単体でインストールできます。
□ver 1.2 (2002.12.10)
-
WarFTPdの日本語化パッチを差分パッチに変更し容量を圧縮。内容に変更はないため、既に適用済みの方は不要。
-
ip_checka/b.cgiで、ログファイルがおかしくなる不具合を修正。
-
ip_checka/b.cgiで、ログの最大数を設定できるように変更。
-
ip_checkb.cgiで、複数の外部スクリプトを利用できるように変更し、信頼性を向上。
-
自分で外部スクリプトを設置するときに使用するスクリプト(chkip.cgi)を追加。
□ver 1.3 (2002.12.16)
- ip_check.cgi全てで、クラスBのプライベートアドレスの判定に誤りがあり修正。
□ver 1.4 (2003.01.23)
- 日本語化パッチをWarFTPd 1.81.3.0対応に変更。
□ver 1.5 (2003.03.01)
- 日本語化パッチをWarFTPd 1.81.4.0対応に変更。
SQLとODBC関係のファイルをコピーするとアプリケーションエラーが出るので、コピーしないこと。
□ver 2.0 (2003.03.28)
- 日本語化パッチをWarFTPd 1.82.00RC1対応に変更。
■動作環境
WarFTPdそのものは、9x系、NT系のOSに対応しています。本ページはNT系OS用ですので、注意願います。
- OS: WindowsNT、2000、XP
- CGI(Perl5)が利用可能なこと。
[お断り]
ここでは、おやじが使用しているWindows2000
Professionalベースで記述していますので、各人の環境に必ずしも合致しないと思います。適宜、ご自身の環境に合わせて適用可否をご判断ください。
■WarFTPdのインストール
WarFTPdは、
こちらから入手できますが、1.81-04-betaは1.71b02に対するパッチという形態で提供されており、両方をダウンロードしてください。英語はどうもと言われる方は、おやじの日本語化パッチ(IPアドレス変化検出用CGI、デフォルトnat.conf、crontabを含む)をダウンロードしてください。ファイルは以下のとおりです。
- 1.71b02 : Ward171b02-experimental-I386.exe
- 1.81b04 : warftpd-1.81-04-unstable-beta-i386-upgrade.zip
- 日本語化パッチ: warftpd1_81_04j.lzh (warftpd1.81.04j.exe)
インストールは、上記の順に、ベースとなる1.71b02をインストールし、1.81b04のパッチをあて、最後に日本語化パッチをあてます。1.81b03からは、そのまま1.81b04のパッチをあて、最後に日本語化パッチをあてれば大丈夫です。
- ダウンロードしたWard171b02-experimental-I386.exeを実行し、1.71b02をインストールする。ファイルは自己解凍形式の圧縮ファイルになっており、実行すると解凍されると共にインストーラが起動するので、指示に従いインストールする。
途中で、いろいろ聞かれるが、基本的にはデフォルトのままで問題はない。設定項目は、以下のとおりであり、基本部以外はインストール後でも変更は可能である。
- インストール方法
デフォルトの「Normal install(for most
users)」のままとすること。
- スタートメニューへの追加
デフォルトのまま追加する。
- ログオン時に表示するサーバ名
後でも変更可能なので、そのままでも良い。
- 管理者のEメールアドレス
管理者のEメールアドレスを指定する。
- 1.81b04へのアップグレード
引き続き、ダウンロードしたwarftpd-1.81-04-unstable-beta-i386-upgrade.zipを解凍し、1.81b04へアップグレードする。解凍してできた全てのファイル(厳密には、*.txt、nat.conf.sampleは不要。SQLとODBC関係をコピーするとアプリケーションエラーが出るので、コピーしないこと。)を1.71b02をインストールしたディレクトリ配下(ex. C:\Program Files\War-ftpd)に上書きコピーする。1.71b02を残しておきたければ、あらかじめインストールしたディレクトリ配下にある上書きされるファイルをいずれかにコピーするか、リネームしておくと良い。
- 日本語化
おやじのパッチのVer1.2以降の場合は、下記手順で日本語化パッチ(warftpd1.81.04j.exe)をあててください。
- War Daemon managerの画面が開いていたら、閉じる。
- WarFTPdをインストールしたディレクトリ配下(ex. C:\Program Files\War-ftpd。WDM.exeと同じフォルダ)にwarftpd1.81.04j.exeをコピーし実行する。
以上で、インストールは完了である。ここで、サービスを再起動すると、1.81b04の日本語版が起動し、インストール時の条件で使用可能状態になっている。
以降、各種設定を行うが、WarFTPdはデーモンを直接操作するのではなく、War Daemon Managerを介して行う。War Daemon Managerはタスクトレイのアイコンを右クリックし、「Start Manager」で起動する。ログインプロパティはユーザIDがSysadminになっているので、とりあえずインストール時に入力したパスワードを入力しWar Daemon Managerに入る。
今回は、情報提供を優先しており、設定はいじっていればある程度判るので、設定に関しては省略しています。追っかけ準備したいと思っていますが、おやじ自身がLinuxユーザのため、ご利用になった方がアップしていただくとありがたいのですが。リンクさせていただきます。
■NATルータへの対応
WarFTPdでは、WarFTPdがインストールされているディレクトリ内に、アドレス運用条件を記述した「nat.conf」を置くことにより、いろいろな制御ができます。但し、このnat.confをWarFTPdが読み込み動作に反映するのは、自身が動作しているマシンのIPアドレスが変化した時とサービス起動された時のみです。従って、前者はNATルータ配下に置かれた自宅サーバでは通常考えられないので、後者を利用することにより、動的IPサービスでもNATルータ配下でのPASVでのFTPサーバ公開ができるようにしてみました。
nat.confで制御できるのは、アクセスしてきたリモート端末のアドレス(Remote
IP range)に応じて、以下の項目が制御できる。
- Activeモード(PORTモード)時のデータコネクション用ポート(Port:デフォルト20番)
- PASVモード時にクライアントに通知する待ち受けアドレス(Host Address)
- そのときに利用する待ち受けポートの範囲(Port-range)
サンプルファイル(nat.conf.sample)が、ダウンロードしたwarftpd-1.81-04-unstable-beta-i386-upgrade.zipの中にありますが、コメントが多すぎるのでおやじのnat.confを用意しました。これを、WarFTPdがインストールされているディレクトリ配下(ex.
C:\Program Files\War-ftpd)にコピーしてください。これをベース(コメントを減らしただけである)に設定内容を示しますが、設定内容は、Remote
IP range毎に1行書く形式になっています。
- 1行目(変更不要)
1行目は、localhostに関するもので、Portはデフォルトの20番でなんら問題がないためデフォルトを示す「0」のままとする。Host
Addressもデフォルトのままとする。Port-rangeもデフォルトとなっており、この場合、1024〜65535の範囲で空いているポートが利用される。
- 2行目(家庭内のアドレス体系に合わせ、Remote IP
rangeのみを変更)
2行目は、家庭内のLANに関するもので現在のアドレス体系に合わせRemote IP
rangeでアドレスとネットマスクを変更する必要がある。デフォルトは「192.168.0.0/255.255.255.0」になっている。Portはデフォルトの20番でなんら問題がないためデフォルトを示す「0」のままとする。Host
Address、Port-rangeもデフォルトのままとする。
- 3行目(ルータの設定に合わせ、Port-rangeのみを変更)
3行目は、上記2行で指定した範囲外のアドレス(通常はWANからくるグローバルアドレスに対するもので、Remote
IP rangeは「0/0」のまま変更してはならない。Portはデフォルトの20番でなんら問題がないためデフォルトを示す「0」のままとする。Host
Addressは、固定IPサービスならWAN側アドレスが変化しないので、そのアドレスを記述すればよい。
動的IPの場合は、おやじのCGIで書き換えるのでそのままでよい。(値は、何でも良いが、xx.xx.xx.xxの形態は崩さないこと。ファイルが壊れる。)Port-rangeは、ここで指定したポートに向かって、WAN側から通信が始まる、即ちWWWサーバにアクセスしてくるのと同じ動作のため、ルータでのスタティックNATとフィルタリングの設定が必要となる。このポートはパケット・バイ・パケットで使いまわしされるので、同時接続セッション数+αだけあれば十分なので、セキュリティのことも考え不必要に拡大しないこと。おやじのnat.confでは、4000-4029の30セッション分を確保してある。
■動的IPサービスでの対応
動的IPサービスを利用していると、ある日突然、WAN側のアドレスが変わってしまう。WarFTPdは、nat.confでNATルータ対応ができますが、WAN側アドレス変化に追従できないので、IPアドレスの変化検出とnat.confの書き換え用のCGIを用意しました。このCGIはシステムがインストールしてあるドライブに置いてください。ここでは、Cドライブのルートに置くことで記述しています。(後述のcrontabの記述に関係)
とりあえず、動かすことを優先していますので、洗練されていませんが、最低限のことだけはやっているつもりです。今後、皆さんの意見をいただき改善したいと思います。
このCGI(ip_checkx.cgi)は、cronから5分毎に起動され以下の処理を行うようにしました。(Cronについては、後述します。)
自分のサイトのWAN側のIPアドレス(グローバルIPアドレス)の取得方法の違いで、2つのタイプ(Aタイプ:ip_checka.cgi/Bタイプ:ipcheckb.cgi)を用意した。リスクと検出時間を勘案の上、どちらを使われるかは各人で判断してください。
- Aタイプ
自分のホスト名からIPアドレスに変換するもので、DDNSのアドレス変更が完了するまで変更できないが、変化検出に関連する要因はDDNSのみとなる。
- Bタイプ
外部スクリプト(dyndns.org等)を利用し、スクリプトが出力するアクセスしてきたアドレスをゲットすることにより、自分のサイトのアドレス変化を検出する方式である。外部スクリプトとは、契約プロバイダの自分のHPに自分で置いても良い。この方式は、IPアドレスが変化したとき、DDNSに反映される前でも、スクリプトにアクセスできればその時点から変更が反映できるため、Aタイプに比べ早く追従できる。但し、DNSの障害とスクリプトがあるサイトの障害がない状態でなければ機能しない。
取得したアドレスがグローバルアドレスなら、前回のアドレスから変化しているか検査し、変化していればWarFTPdがインストールされているディレクトリ内に置かれた「nat.conf」内のWAN側に提示するPASV用アドレス領域(3行目のHost
Address)を書き換える。
変更内容を反映させるたため、WarFTPdのサービスをリスタートする。少し乱暴であるが、これ以外に手がないのと、アドレスが変わるということは通信中のセッションも切れてしまうので、これによる弊害はないと考える。
[CGI設定項目]
設定は、いずれも先頭のパラメータのところだけです。CGIに詳しい方は、いくらでも改善してください。Ver1.2でBタイプの設定が変わっています。
- Aタイプ
・$host = "exampleftp.zive.net"; #
ホストアドレス(FQDN) ご自身のホスト名を記述してください。
・$log_dir = "/program files/war-ftpd/"; #
ログディレクトリ(なるべく変更しないこと。ファイル名はwarftpd.log)
・$debug = 0; #
デバッグ用詳細ログ(0/1=No/Yes) 1(yes):エラー発生時にログをとる。
・$logcnt = 50; #
最大ログ数
- Bタイプ
・@surl = ( #
スクリプトのあるURLをhttp://を除いてスクリプトまでを指定
"dyndns.org/cgi-bin/check_ip.cgi", #
複数ホストを指定可能(自分のアドレスが取得できるまで順次検索)
"hogehoge.com/chkip.cgi", #
hogehoge.com/chkip.cgiは自分でスクリプト置くときの例。
"", #
設置しない場合は削除のこと。
"",
""
);
・$log_dir =
"/program files/war-ftpd/"; #
ログディレクトリ(なるべく変更しないこと。ファイル名はwarftpd.log)
・$debug = 0; #
デバッグ用詳細ログ(0/1=No/Yes) 1(yes):エラー発生時にログをとる。
・$logcnt = 50; #
最大ログ数
■Cronのインストールと設定(周期的なIPアドレス監視)
上記IP監視用CGIを周期的(5分毎)に起動できるようにします。Windows用Cronは、
こちらからダウンロードできます。ダウンロードするのは、NTサービス用です。インストール方法は以下のとおりです。
- ダウンロードしたcrons.zipを適当なところで解凍する。
- 解凍すると、ntsetup.exeができるので実行する。インストールパスを聞いてくるので、そのまま実行すればntsetup.exeのあったところにcrons.exeがインストールされる。おやじは、system32フォルダにインストールした。
- コントロールパネルの管理ツール内のサービスを確認すると、CRONサービスがインストールされているはず。
続いて、Cron用の設定ファイルを作成します。適当なエディタで下記内容のcrontabというファイルを作成し、system32に置きます。おやじパッチの中にあるcrontabを使っていただければいいと思います。
[設定内容] 0,5,10,15,20,25,30,35,40,45,50,55
* * * * perl
C:\ip_checka.cgi
CGIへのパス
設置できたら、コントロールパネルの管理ツール内のサービスを起動し、「Cron
service」を開始に設定すれば、5分毎に起動され、初回時にnat.conf内のアドレスが更新されるはずです。
全ての設定が完了したら、まず、ローカルで十分試験をしてください。問題がなく動作していることが確認できたら、おやじの
FTPサーバテストでテストして、外部からも使用できるか確認してください。
デフォルトのままでは、WarFTPd起動時に以下のようなエラーがでます。
[war_error_logger] Exception from line 117 in file "C:\devel\current\war182_stable\jgaadb\src\DbConnection.cpp":
Database error in module "DbConnection::Connect()" SQLDriverConnect(SQL_HANDLE_DBC)
failed. SQL state = "IM002" Native Error = "0" : "[Microsoft][ODBC
Driver Manager] データ ソース名および指定された既定のドライバが見つかりません。" |
これは、WarFTPdがデータベースにログ(セッションとファイル・イベント)を書くことができるようになっており、データベースが無いのにこの機能がデフォルトでonになっているので発生するエラーです。
エラーが出ないようにする対策方法は2つあり、一つはデータベースを使用しないようにする方法(方法1)であり、もう一つはデータベースを用意する方法(方法2)です。特段理由がなければ、簡単なので方法1で機能停止すればよいと思います。
◆[方法1]:データベースを使用しないようにする方法
- 「サーバ」->「アドバンスサーバプロパティ」を開く。
- 「odbc_SOURCE」にデフォルトで設定されている「<default>」を消してブランクにし、「設定」を押下して反映させる。
- WarFTPDを再起動させ、エラーが出ないことを確認する。
◆[方法2]:データベースを用意する方法
- コンソールパネルから「管理ツール」->「データソース(ODBC)」を開く。
- 「システムDSN」を選択する。
- 「追加」でデータソースドライバとして「Microsoft Access driver(*.mdb)」を選択して「完了」を押下する。
- 「データソース名」に「WARSVR」、説明に「WarFTPD(適当に)」と入力する。
- 続けて、「データベース」で「選択」を押して、WarFTPDのインストールフォルダ内にあるの「warsvr.mdb」を選択して「OK」を押して、セットアップ画面で再度「OK」を押す。
- アドミニストレータ画面で「OK」を押してデータベースを作成する。
- 最後に、 WarFTPDを再起動させ、エラーが出ないことを確認する。 以降、「warsvr.mdb」にログが収集される。
Top Pageへ