バーチャルFTPサーバの構築(Proftpd:CentOS編)


当然ですがCentOSでも、SuSE や RedHat と同様に ProFTPD で バーチャルホスト対応ができます。バーチャルホストに対応する方法は2つあり、一つはXinetdを使う方法であり、もう一つはVirutualHost ディレクティブを使用する方法です。
なお、FTPの場合はHTTPと異なりプロトル上ホスト名の伝達手段がないため、IPベースのバーチャルホストしか対応できないので注意願います。

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

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

  1. 「システム設定」 -> 「ネットワーク」で設定画面を開く。
  2. 「デバイス」で「eth0」を選択し、「新規」を押す。
  3. 「デバイスタイプ」の選択で「イーサネット接続」を選択して、「進む」を押す。
  4. イーサネットカードとして、eth0のデバイスが表示されているはずなので選択し、「進む」を押す。
  5. ネットワークの設定画面が出るので、「固定のIPアドレス設定」を選択し、アドレス:192.168.1.101、サブネット:255.255.255.0、デフォルトゲートウェイ:192.168.1.1を入力して、「進む」 -> 「適用」でeth0:1が作成される。(アドレス等は自分の環境に合わせること)
  6. 「ファイル」 -> 「保存」したら、etho:1を選択して「起動」する。

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

バーチャルホストを動作させるのに、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)

CentOS 環境下で、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へ