Vine Linuxでの設置方法です。FTPには標準ディストリビューションのProFTPを使うことにします。パッケージから探してインストールしましょう。
次に難解な設定です。構築するディレクトリ構成は、少し特殊にしてみようと思います。rootの下にあるpubディレクトリは、全FTPアカウントで共通、同一ディレクトリを表示させる。そこを読み取り専用で公開し、更新モジュール等を管理側から提供できるようにする。FTPユーザ側から見ると下記のようになります。
root (0777)
|
|-pub (0744)
ここでつまづいたのが、この共有ディレクトリpubの作り方。Windows環境でFTPを運用していたときは、WarFTPの機能でバーチャルマッピングで自由に構成可能でした。しかし、ProFTPにはそんな便利な機能ありません。探しに探して行き着いたのはmount。Linuxのファイルシステムを利用しろと言うことです。詳細は/usr/share/doc/proftpd-x.x.x/howto/Chroot.htmlの文末に載っています。ProFTPの機能だけを検索していたばかりに、このシンプルな解答に気づかず苦労しました。灯台下暗し…皆さんも探し回る前にまずはマニュアルを熟読してください。
mount情報は再起動すると初期化されてしまいます。そこで、これをPC起動時に自動的に反映させるようにします。起動時に必ず読み込まれるスクリプト/etc/rc.localに以下の要領で追記。
$ mount --bind olddir newdir <-olddirが共有元
これでnewdirにアクセスするとolddirが操作できるようになります。ちなみに、300個ほどマウントしても大丈夫らしいです(詳細)
次はWAN側からの接続を受け入れるようにしましょう。ProFTPは標準ではPORTコマンドを受付けません。固定ポートが空いてしまうのでセキュリティ的な問題からでしょうか。私も通常ポートの21番は避けたいので、全く別のポートをPASVモードで使用するようにしました。
また、動作方法は、inetd経由でセッション毎に起動するように変更。個人利用ということもあり、メモリ節約のためにデーモン起動での常駐は外しました。少々動作が重くなりますが、セッション毎に設定ファイルを読直すので、DDNSでのIP変化にも対応できるというメリットがあります。
まずはFTP通信ポートの設定、21番以外にしたい場合、inetd設定のためにポート定義名を/etc/servicesに追加します。
ftpEX xxx/tcp <-xxxはポート番号、定義名はftpEX
ftpEX xxx/udp
この定義名(ftpEX)を使って/etc/inetd.confに起動条件を追記してください。tcpwrapperを使って後々通信制御をしたいのでtcpd経由で起動させるようにします。
ftpEX stream tcp nowait root /usr/bin/tcpd in.proftpd
以上でinetdで動作させる下準備は整いました。
お次は一番悩むftpdの詳細設定です。/etc/proftpd.confのコメントやマニュアルを参考にして設定しました。また、パソコンおやじさんのProFTPD設定も参考にしています。
Port xxx <-/etc/servicesと同じ番号にする
MasqueradeAddress xxx <-ルータのWAN側アドレス又はドメイン名(DDNS等)
PassivePorts xxx yyy <-最小ポート番号 最大ポート番号
ServerType inetd <-inetd起動<
DefaultRoot ~/ftp <-各アカウント以下のftpディレクトリをルートとするように設定
LogFormat allinfo "%t : %u (%a [%h]) : [%s], %T, %m (%f)"
LogFormat write "%t : %u : %F (%a)"
LogFormat read "%t : %u : %F (%a)"
LogFormat auth "%t : %u (%a [%h])"
ExtendedLog /var/log/proftpd/all.log ALL allinfo
ExtendedLog /var/log/proftpd/write.log WRITE write
ExtendedLog /var/log/proftpd/read.log READ read<
ExtendedLog /var/log/proftpd/auth.log AUTH auth
UseReverseDNS off
IdentLookups off
# Allow clients to resume downloads (default on)
AllowRetrieveRestart on
# Allow clients to resume uploads (default off)
AllowStoreRestart on
# The maximum number of clients allowed to connect per host.(default none: no limit)
MaxClientsPerHost 3
MaxClients 30
# Sets the idle connection timeout (default: 600)
TimeoutIdle 300
<Directory ~/pub>
<Limit READ DIRS RETR>
AllowAll
</Limit>
<Limit WRITE STOR DELE MKD RMD RNFR RNTO SITE_CHMOD>
DenyAll
</Limit>
</Directory>
デーモン常駐はさせないのでサービスはオフに変更です。
最後に、inetdを-HUPオプションで再起動させて設定完了。
$ chkconfig proftpd off
$ chkconfig --list proftpd
$ killall -HUP inetd