バーチャルFTPサーバの構築(SuSE編)


SuSE でも RedHat と同様に ProFTPD で VirutualHost ディレクティブを使用してバーチャルホスト対応しようとしましたが、バーチャルホストにアクセスすると、既に IP がProFTPD で使用されているというエラーが出てデフォルトサーバに繋がってしまいます。やむを得ないので、VirutualHost ディレクティブ の使用をあきらめて xinetd で振り分けすることにしました。もちろん、外部から使用するためセキュリティの問題がありますので、SSL/TLS化にも対応させました。

その後の調査でVirutualHost ディレクティブを使用してバーチャルホスト対応できることが判明しましたので、こちらにその方法を示します。

なお、FTPの場合はHTTPと異なりプロトル上ホスト名の伝達手段がないため、IPベースのバーチャルホストしか対応できないので注意願います。

■バーチャルホスト用 IPアドレスの付与方法

FTP では、前述のように IP ベースのバーチャルホストしか対応できません。従って、既存の IP アドレス以外に最低限もう一つ IP アドレスが必要になります。単純には、LAN カードを増設して付与すれば済みますが、トラヒックもたいした事はないですし、電気代も無駄なので Alias で既存のインタフェースにアドレスを追加する方法を採りました。実際の方法は、こちらを参照してください。

■バーチャルホストの設定(1)

SuSE 環境下でバーチャルホストを動作させるには、Xinetd をうまく使います。なお、この方法は、ProFTPD に限らず vsFTPD でも可能なはずですのでやってみてはどうでしょうか。

この方法は、まず ProFTPD 用にバーチャルホスト単位に conf ファイルを作成します。次に、xinetd 用の起動ファイルもバーチャルホスト単位に作成し、その起動ファイル毎にそれぞれのサーバ用にバインドする IP アドレスを指定すると同時に、使用する conf ファイルを指定するという方法です。これにより、クライアントがアクセスしてきた IP アドレスに応じて、ProFTPD が異なるサーバとして動作できます。

◆ProFTPDの設定

まずは バーチャルホスト対応の conf ファイルを作成します。基本的には、それぞれのホストをデフォルトサーバとして単一で動作させるイメージで作成するだけです。もちろんファイル名は異なります。
以下に、二つのホストの場合の設定イメージを示します。設定内容は、基本的な設定SSL/TLS化の設定を参考にしてできるはずです。DefaultServer は必ず on にしてください。そうしないと、Alias で付与したインタフェース(eth0:1)側は Xinetd がサーバを見つけられません。NIC が2枚あって物理的に存在する場合はこの限りではありません。

[サーバ1のファイル ( /etc/proftpd1.conf ) ] 

# This is a first server configuration file 

ServerName                
"ftp.aconus.com FTP Server"
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])"
Umask                      022
AuthPAMConfig              ftp
TimesGMT                   off
IdentLookups               off

MasqueradeAddress          
aconusftp.aconus.com
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.1.0/24
      Deny                 from all
    </Limit>
  </Directory>
</Anonymous>


[サーバ2のファイル ( /etc/proftpd2.conf ) ] 

# This is a second server configuration file 

ServerName                 "ftp.example.com FTP server"
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])"
Umask                      022
AuthPAMConfig              ftp
TimesGMT                   off
IdentLookups               off

MasqueradeAddress          111.222.111.222
PassivePorts               5000 5029
DefaultRoot               
/srv/ftp/exsample
<Directory /srv/ftp/exsample>
  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


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

◆Xinetdの設定

続いて、xinetd 用の起動ファイルをバーチャルホスト単位に作成します。/etc/xinetd.d 配下に proftpd という起動ファイルがインストールされているはずですので、それをベースにそれぞれのサーバ用の起動ファイルを作成します。(赤字:追加) proftpd ファイルの削除を忘れずに。

[サーバ1のファイル ( /etc/xinetd.d/proftpd1 ) ] 

# default: on
# description: The ProFTPD FTP server
service ftp
{
     flags           = REUSE
     socket_type     = stream
     wait            = no
     user            = root
     server          = /usr/sbin/proftpd
     server_args     = -c /etc/proftpd1.conf
     bind            = 192.168.1.100
     log_on_failure += USERID
     disable = no
}


[サーバ2のファイル ( /etc/xinetd.d/proftpd2 ) ] 

# default: on
# description: The ProFTPD FTP server
service ftp
{
     flags           = REUSE
     socket_type     = stream
     wait            = no
     user            = root
     server          = /usr/sbin/proftpd
     server_args     = -c /etc/proftpd2.conf
     bind            = 192.168.1.101
     log_on_failure += USERID
     disable = no
}


赤字のパラメータを追加しますが、その概要を以下に示します。
設定が完了したら、Xinetd を再起動すれば、192.168.1.100でアクセスすれば proftpd1.conf の内容で、192.168.1.101でアクセスすれば proftpd2.conf の内容で ProFTPD が動作してくれます。

■バーチャルホストの設定(2)

SuSE 環境下で、VirutualHost ディレクティブを使用してバーチャルホストを動作させる方法を示します。基本的には RedHat の場合と同様ですが、ディレクティブを1つ追加するだけでうまく動作してくれます。

◆ProFTPDの設定

まずは VirutualHost ディレクティブを使用したバーチャルホスト対応の conf ファイルをこちらを参考に作成します。追加するディレクティブは下記の緑字で示した「DefaultAddress」で、アドレスはダミーなので 「0.0.0.0」 で問題ありません。

# This is a basic ProFTPD configuration file 

ServerName                   "ProFTPD"
Servertype                   inetd
DefaultServer                on
DefaultAddress               0.0.0.0
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                 "ftp.aconus.com FTP Server"
  MasqueradeAddress          
aconusftp.aconus.com
  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>


◆Xinetdの設定

xinetd 用の起動ファイルは、デフォルトのままで問題ありません。

# default: on
# description: The ProFTPD FTP server
service ftp
{
     flags           = REUSE
     socket_type     = stream
     wait            = no
     user            = root
     server          = /usr/sbin/proftpd
     log_on_failure += USERID
     disable = no
}




Top Pageへ