バーチャルFTPサーバの構築


WWWサーバのバーチャルホスト対応に合わせて、FTPサーバもバーチャルホスト対応しました。もちろん、外部から使用するとなるとセキュリティの問題がありますので、SSL/TLS化にも対応させました。
なお、FTPの場合はHTTPと異なりプロトル上ホスト名の伝達手段がないため、IPベースのバーチャルホストしか対応できません。

家庭内から自宅サーバへのアクセスで問題が発生したので、ネットワーク構成を全面的に変更しました。
ProFTPD1.2.10rc1から「NLST」のオプション指定が未サポートになり、FFFTPなどではデフォルトのままではファイル一覧が取得できないので注意が必要です。これはRFC959に基づく変更であり、クライアントの設定を変更して「LIST」コマンドでファイル一覧を取得するようにすれば大丈夫です。
なお、このままではドットファイルが見えなくなるので、見せる必要があるなら、「ListOptions」ディレクティブを 「ListOptions "-a"」のように、proftpd.conf に追記してください。

■ネットワーク構成

ネットワーク構成は下記のとおりで、サーバのNICにIPアドレスを2個付与するとともに、ルータのポリシールーティングを使うことで対応しました。ネットワーク関係の詳細はこちらを参照してください。
ここでは、example.zive.net用のプライベートアドレスを192.168.1.100、ftp.example.com用を192.168.1.101として説明します。example.zive.netは、サイトデータの管理用とanonymousでのデータ配信用、ftp.example.comは、完全独立のサイトとして動作させます。


■ProFTPDの設定

ProFTPDの設定は、/usr/local/etc/proftpd.confを編集します。基本的には、基本的な設定SSL/TLS化の設定を参考にして、VirtualHostディレクティブ内にホスト固有の設定をしていくだけです。コンテキストに注意が必要です。設定は、一通り記載しています。VirutualHostディレクティブ自体が新規追加ですが、分かりにくいので各ディレクティブ単位でバーチャルホスト関係でポイントとなるところを赤字で示してあります。

# This is a basic ProFTPD configuration file 

ServerName                   "ProFTPD"
Servertype                   inetd
DefaultServer                on
Port                         21
UseReverseDNS                off
MaxInstances                 30
User                         nobody
Group                        nobody
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])"
<Global>
  Umask                      022
  AuthPAMAuthoritative       On
  AuthPAMConfig              ftp
  TimesGMT                   off
  IdentLookups               off
</Global>

# First virtual server
<VirtualHost 192.168.1.100>
  ServerName                 "example.zive.net FTP Server"
  MasqueradeAddress          
exampleftp.zive.net
  PassivePorts               5000 5029
  DefaultRoot                
~/public_html users,!wheel
  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
  <Directory />
    AllowOverwrite           on
  </Directory>
  <Limit LOGIN>
   
DenyGroup                !users
  </Limit>
  <IfModule mod_tls.c>
    TLSEngine                on
    TLSLog                   /var/log/proftpd/
tls.log
    TLSCipherSuite           ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
    TLSRequired              off
    TLSRSACertificateFile    /usr/local/certs/
server0.crt
    TLSRSACertificateKeyFile /usr/local/certs/
server0.key
    TLSVerifyClient          off
  </IfModule>

  # A basic anonymous configuration, no upload directories.
  <Anonymous ~ftp>
    User                     ftp
    Group                    ftp
    UserAlias                anonymous ftp
    MaxClients               20
    DisplayLogin             welcome.msg
    DisplayFirstChdir        .message
    <Limit LOGIN>
      AllowAll
    </Limit>
    <Directory *>
      <Limit WRITE>
        Order                allow, deny
        Allow                from 127.0.0.1, 192.168.0.0/23
        Deny                 from all
      </Limit>
    </Directory>
  </Anonymous>
</VirtualHost>

# Another virtual server
<VirtualHost 192.168.1.101>
  ServerName                 "ftp.example.com FTP server"
  MasqueradeAddress          
111.222.111.222
  PassivePorts               5000 5029
  DefaultRoot               
/var/www
  <Directory /var/www>
    AllowOverwrite           on
  </Directory>
  <Limit LOGIN>
   
DenyGroup                !example
  </Limit>
  <IfModule mod_tls.c>
    TLSEngine                on
    TLSLog                   /var/log/proftpd/
example-tls.log
    TLSCipherSuite           ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
    TLSRequired              off
    TLSRSACertificateFile    /usr/local/certs/
server1.crt
    TLSRSACertificateKeyFile /usr/local/certs/
server1.key
    TLSVerifyClient          off
  </IfModule>
  ExtendedLog                /var/log/proftpd/
example-all.log   ALL allinfo
  ExtendedLog                /var/log/proftpd/
example-write.log WRITE write
  ExtendedLog                /var/log/proftpd/
example-read.log  READ read
  ExtendedLog                /var/log/proftpd/
example-auth.log  AUTH auth
</VirtualHost>


前述のとおり、基本的には、基本的な設定SSL/TLS化の設定を参考にして、VirtualHostディレクティブ内にホスト固有の設定をしていくだけなので、ここでは、バーチャルホスト対応のポイントだけしまします


Top Pageへ