magmalinux-proftpd-ProFTPDYapılandırması

3  ProFTPD Yapılandırması

ProFTPD yapılandırma dosyaları /etc/proftpd/ dizini altında bulunur. Standart yüklemede, bu dizin içerisinde ana yapılandırma dosyası proftpd.conf ve modül yapılandırma dosyası modules.conf olmak üzere iki dosya vardır.

Bu iki yapılandırma dosyasını incelemeden önce ProFTPD yapılandırma dosyaları söz dizimini inceleyeceğiz.

3.1  Yapılandırma Dosyaları Söz dizimi

ProFTPD yapılandırma dosyaları, Apache’nin yapılandırma dosyalarına oldukça benzer. Yapılandırma dosyaları çoğunlukla yönergelerden oluşur. Söz dizimi Yonerge parametre şeklindedir. Örneğin:

ServerName  "Magma FTP Server"

Yönergelerin yanında bazı durumlar için (dizinler, sanal konaklar gibi) birden fazla yönergeyi içerinde barındıran etiketler vardır. Örneğin bir dizin ile ilgili ayarlar <Directory "dizin_yolu"> </Directory> etiketleri arasında bulunur (bu etiketler sadece belirtildiği yeri etkileyecek bir context oluşturur. Bu yüzden ProFTPD belgelendirmelerinde bunlar için context sözcüğü kullanılır. Tüm etiketlerin dışındaki alan, server context’idir).

3.2  Anonim (Anonymous) Bağlantılar

Sadece sunucu sisteminde bulunan kullanıcıların (/etc/passwd dosyasında) yanında, anonim kullanıcıların da FTP sunucusuna bağlanmasına izin vermek istediğiniz durumlar oluşabilir. Örneğin Debian GNU/Linux dağıtımının FTP yansısı olduğunuzu düşünelim. Bu durumda her kullanıcının sizin FTP sunucunuza erişebilmesi gereklidir. Böyle durumlarda FTP sunucusunun anonim kullanıcıları nasıl karşılayacağı, anonim kullanıcılara ne gibi izinler vereceği önemli bir konu olmaya başlar.

Anonim kullanıcıların erişimine izin vermek için proftpd.conf dosyasını açıyoruz <Anonymous  ftp> </Anonymous> etiketlerinin arasındaki bütün satırların başındaki # işaretini siliyoruz (<Anonymous  ftp> </Anonymous> satırlarının başındaki # işaretleri de dahil olmak üzere). Sonuç olarak bu kısım aşağıdakine benzer bir yapıda olmalı (Dosyadaki bizi ilgilendirmeyen kısımlar ve yorum satırları buraya yazılmadı):

<Anonymous ~ftp>
   User                         ftp
   Group                        nogroup
   UserAlias                    anonymous ftp
   DirFakeUser  on ftp
   DirFakeGroup on ftp

   RequireValidShell            off

   MaxClients                   10

   DisplayLogin                 welcome.msg
   DisplayFirstChdir            .message

   <Directory *>
     <Limit WRITE>
       DenyAll
     </Limit>
   </Directory>
</Anonymous>

<Anonymous ftp> </Anonymous> etiketi, ProFTPD anonim kullanıcılarının bağlantı ayarlarının bekirtildiği yerdir. <Anonymous ftp> etiketindeki ftp kısmı, sistem kullanıcısı olan ftp isimli kullanıcının ev dizinine işaret eder (Eğer isterseniz ftp yerine açıkça /home/ftp şeklinde bir yol da belirtebilirsiniz). Bu dizin, anonim giriş yapıldığında anonim kullanıcının başlangıç dizini olur.

<Anonymous ftp> </Anonymous> etiketi içerisindeki yönergeleri sırayla inceleyelim:

User yönergesi, anonim kullanıcının sistemdeki kullanıcı hesabını belirtir. Yani anonim kullanıcı giriş yaptığında, bu yönergede belirtilen kullanıcı olarak sisteme giriş yapmış olur. Aynı şekilde Group yönergesi anonim kullanıcının grubunu belirler.

UserAlias yönergesi, anonim kullanıcı için takma adlar belirler. FTP sunucusunu anonim kullanıcı olarak giriş yapılacağı zaman, kullanıcı adı olarak bu isimlerden herhangi biri kullanılabilir.

MaxClients yönergesi, aynı anda FTP sunucusunu kullanabilecek maksimum anonim kullanıcıyı belirler.

DisplayLogin yönergesi, anonim kullanıcı giriş yaptığında, gösterilecek mesajın bulunduğu dosyanın ismini belirtir. Mutlak veya göreceli bir yol belirtilebilir. Göreceli yol belirtildiğinde, başlangıç yolu olarak <Anonymous ∼ftp> etiketinde belirttiğiniz yol kullanılır.

DisplayFirstChdir yönergesi eskimiş ve kullanımı azalmış (deprecated) bir yönergedir. Yerine DisplayChdir kullanılmaktadır. DisplayChdir yönergesi bir dizine girildiğinde gösterilecek mesajın bulunduğu dosyanın ismini belirtir.

<Anonymous> etiketi içerisinde, <Directory>; ve bu <Directory> etiketi içerisinde bir <Limit> etiketi görülmektedir. Bir etiket içerisindeki ayarların sadece o etiketin context’ini etkilediğini hatırlayın (Örneğin <Anonymous> etiketi içerisindeki ayarlar sadece anonim kullanıcıları, <Directory> etiketi içerisindeki ayarlar sadece belirtilen dizini, <Limit> etiketi içerisindeki ayarlar sadece belirtilen limiti etkiler). Şimdi yukarıdaki etiketlerin içiçe yuvalandığı yapıyı açıklayalım:

Anonim kullanıcılara (<Anonymous ftp>); bütün dizinler içerisindeki (<Directory *>); yazma limiti (<Limit WRITE>) yasak olarak ayarlanmıştır (DenyAll).

3.3  Kullanıcıları Kendi Ev Dizinlerine Hapsetmek

FTP kullanıcılarınızın, başka kullanıcıların dosyalarını görmesini engellemek, onları kendi ev dizinleri içine hapsetmek oldukça çok kullanılan bir özelliktir. Çünkü bir kullanıcı sadece kendi ev dizini ile ilgilenmeli ve sadece onunla ilgili işlem yapmalıdır.

FTP kullanıcıları ev dizinlerine hapsetmek için proftpd.conf dosyasını açıyoruz ve aşağıdaki satır yoksa ekliyoruz:

DefaultRoot ~

3.4  Sanal Kullanıcılar

Eğer SSL/TLS kullanmadan FTP sunucusuna bağlanıyorsanız, kullanıcı paroları ağ üzerinde çıplak bir şekilde taşındığı için, ağı dinleyen biri tarafından ele geçirilip, daha sonradan telnet ya da ssh ile sunucunuza bağlanmak üzere kullanılabilir. Bu yüzden /etc/passwd dosyasında belirtilmiş sistem kullanıcıları yerine, sadece FTP servisi için sanal kullanıcılar oluşturmalısınız. Bu sanal kullanıcıların bilgileri /etc/passwd benzeri bir başka dosyada tutulabileceği gibi, LDAP dizinlerinde ya da SQL tablolarında da tutulabilir.

Biz bu belge de ProFTPD sunucusu üzerinde sanal kullanıcı bilgilerini saklamak için metin dosyalarını kullanacağız (Kullanıcı bilgilerinin yanında grup bilgilerimiz için de ayrı bir metin dosyası yaratacağız). Kullanıcı bilgilerinin bulunacağı dosya ve grup bilgilerinin bulunacağı dosya, sırasıyla, /etc/passwd ve /etc/group dosyaları ile aynı biçimde olmalıdır. Eğer bu dosyaların biçimleri hakkında bir fikriniz yoksa ya da elle yaratmaya korkuyorsanız, dert etmeyin. Dosyaları oluşturma işini ProFTPD yazılımı ile birlikte gelen ftpasswd aracına bırakacağız.

Sanal kullanıcılarımızın ev dizinlerinin bulunacağı dizini yaratalım. Biz bunun için /var/ftp/vusers dizinini seçtik:

# mkdir -p /var/ftp/vusers

Yaratacağımız kullanıcının ev dizinini oluşturalım (bu örnekte kullanıcı adı olarak mehmet seçtik):

# mkdir /var/ftp/vusers/mehmet

Yarattığımız bu dizini, biraz sonra yaratacağımız 3000 numaralı ID’ye sahip mehmet kullanıcısı ve 3000 numaralı users grubuna devrettik:

# chown 3000:3000 /var/ftp/vusers/mehmet

Şimdi ilk kullanıcımızı oluşturalım:

# ftpasswd --passwd --name mehmet --home /var/ftp/vusers/mehmet \
    --shell /bin/sh --uid 3000 --gid 3000

Komutu çalıştırdığınızda mehmet kullanıcısı için bir parola girmeniz istenecek. Bu komut, eğer bulunduğumuz dizinde ftpd.passwd dosyası yoksa yaratır, var ise verdiğimiz parametrelere göre bu dosyayı günceller. --passwd parametresi yaratılacak (ya da güncellenecek) dosyanın kullanıcı dosyası olduğunu, --name parametresi kullanıcının ismini, --home parametresi kullanıcının ev dizinini (kullanıcı giriş yaptığında başlayacağı dizin), --shell kullanıcının kabuğunu (komut satırı), --uid kullanıcı ID’sini, --gid ise kullanıcının grup ID’sini belirtir. Belirttiğimiz kullanıcı ID’si keyfidir. Genel davranış ls gibi uygulamaların şaşırmaması için sistem kullanıcılarının ID’leri dışında değerler seçmektir. Belirttiğimiz grup ID’si ilerde yaratacağımız gruba referans etmektedir.

Gruplarımızın bulunacağı dosyayı oluşturalım, users adında bir grup ekleyelim ve mehmet kullanıcısını bu grubun üyesi yapalım:

# ftpasswd --group --name users --gid 3000 --member mehmet

Bu komut eğer bulunduğumuz dizinde ftpd.group dosyası yoksa yaratır, var ise verdiğimiz parametrelere göre bu dosyayı günceller. --group parametresi yaratılacak (ya da güncellenecek) dosyanın grup dosyası olduğunu, --name parametresi grubun ismini, --gid parametresi ise grubun ID’sini belirler (Burada 3000 seçmemiz tamamıyla keyfidir. Genellikle /etc/group dosyasındaki grupların ID’lerinden farklı bir ID seçmeniz tavsiye edilir. Çünkü ls gibi uygulamalar /etc/passwd dosyasındaki ID’lere bakarak kullanıcı bilgilerini gösterdikleri için, bu tür uygulamaların çıktıları beklediğiniz gibi olmayabilir). Bu komutu çalıştırdıktan sonra, bulunduğunuz dizinde yaratılmış olan ftpd.group dosyasını bir metin editörü ile inceleyebilirsiniz.

Son olarak ProFTPD’ye kullanıcı bilgileri ve grup bilgileri için hangi dosyaları kullanacağını söyleyelim. proftpd.conf dosyasını açıyoruz ve aşağıdaki satırları ekliyoruz (Siz ftpd.passwd ve ftpd.group dosyalarını bir başka dizinde tutuyorsanız aşağıdaki yönergeleri kendinize göre değiştirin):

AuthUserFile /etc/proftpd/ftpd.passwd
AuthGroupFile /etc/proftpd/ftpd.group

Şimdi bir başka senaryoya bakalım. Diyelim ki bir kullanıcının, HTTP üzerinden yayınlanan bir web sitesi var. Ve bu kullanıcı web sitesi dosyalarını FTP yolu ile transfer etmek istiyor. Şimdi bu senaryoyu gerçekleştirelim.

Kullanıcının web sitesinin /srv/www/magmalinux.org/htdocs dizini altında olduğunu düşünelim. Bu amaçla oluşturacağımız FTP kullanıcısının ev dizinini /srv/www/magmalinux.org olarak belirleyeceğiz.

Dikkat! FTP yoluyla transfer ettiğimiz dosyaların izinleri, HTTP servisini çalıştıran kullanıcının erişimine uygun olması gerekir.

Apache HTTP servisi www-data kullanıcısı ve www-data grubu ile çalıştığı için, sanal kullanıcımızın ID’sini ve sanal kullanıcımızın grup ID’sini, sistemdeki www-data kullanıcısı ile aynı yapacağız. Kullanıcımızı yaratmadan önce /etc/passwd dosyasını açalım ve www-data kullanıcı ID’si ve grup ID’sini öğrenelim. /etc/passwd dosyasındaki bizi ilgilendiren satır şu şekilde olmalı:

www-data:x:33:33:www-data:/var/www:/bin/sh

Üçüncü sütundaki değer yaratacağımız sanal kullanıcının ID’si ve dördüncü sütun bu sanal kullanıcının grup ID’si olacak (Bizim sistemimizde iki değer de 33).

Şimdi ev dizini /srv/www/magmalinux.org olan enes isminde bir kullanıcı yaratalım:

# ftpasswd --passwd --name enes --home /srv/www/magmalinux.org \
    --shell /bin/sh --uid 33 --gid 33

www-data isminde bir sanal grup oluşturalım:

# ftpasswd --group --name www-data --gid 33 --member enes,mehmet

Sıra en heyecanlı test aşamasına geldi:

  • Herhangi bir FTP istemcisi ile sunucunuza bağlanın:

    $ ls
    anasayfa.html  belgeler  code  Desktop  dosya
    
    $ ftp ftp.magmalinux.org
    Connected to ftp.magmalinux.org.
    220 ProFTPD 1.3.0 Server
    Name: enes
    331 Password required for enes.
    Password:
    230 User enes logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    
    ftp> ls
    200 PORT command successful
    150 Opening ASCII mode data connection for file list
    drwxr-xr-x   2 enes     www-data     4096 Aug  6 08:12 htdocs
    226 Transfer complete.
    
    
  • htdocs dizinine geçin:

    ftp> cd htdocs
    250 CWD command successful
    
  • Dosyalarınızı FTP sunucusuna gönderin:

    ftp> put anasayfa.html
    local: anasayfa.html remote: anasayfa.html
    200 PORT command successful
    150 Opening BINARY mode data connection for anasayfa.html
    226 Transfer complete.
    37 bytes sent in 0.00 secs (708.5 kB/s)
    
    ftp> ls
    200 PORT command successful
    150 Opening ASCII mode data connection for file list
    -rw-r--r--   1 enes     www-data       37 Aug  6 08:23 anasayfa.html
    226 Transfer complete.
    
    ftp> 
    
  • Bir internet tarayıcısı ile web sayfanızı ziyaret edin.

3.5  Kota Yapılandırması

Bu bölümde FTP kullanıcılarımıza kota sınırlaması getirmek için ProFTPD mod_quotatab modülünü kullanacağız. ProFTPD kota desteğini dosya sisteminin sağladığı kota desteğinden farklı olarak, ProFTPD uygulaması düzeyinde gerçekleştirir. Yani FTP kullanıcılarınızın telnet ya da ssh hesabı da var ise, ProFTPD için yaptığınız kota ayarları, bu uygulamalar için geçerli olmayacaktır.

ProFTPD’de kota desteği için kullanılan iki dosya vardır. Bunlardan birincisi limit tablosu (dosyası) olup, kullanıcıların mutlak kapasite limitlerini belirler. İkincisi ise kullanıcıların mevcut durumda hesaplarının ne kadarının dolu olduğunu tutan çetele (tally) tablosudur. Bu tabloları oluşturmak için ProFTPD yazılımı ile birlikte dağıtılan ftpquota aracını kullanacağız.

İlk olarak limit tablosunu oluşturalım (Aşağıdaki komutu çalıştırmadan önce cd /etc/proftpd komutu ile dizin değiştirmeniz tavsiye edilir. Çünkü ftpquota komutu varsayılan olarak, kota dosyalarını çalıştırıldığı dizin içerisinde yaratır):

# ftpquota --create-table --type=limit

Bu komut bulunduğumuz dizin içerisinde bir ftpquota.limittab dosyası yaratacak. Şimdi de çetele tablosunu oluşturalım:

# ftpquota --create-table --type=tally

Bulunduğumuz dizin de bir de ftpquota.tallytab dosyası yaratılmış olmalıdır. Tablolarımızı yarattıktan sonra, ProFTPD’yi bu tablolardan haberdar edelim. Bunun için proftpd.conf dosyasını açıyoruz ve aşağıdaki satırları ekliyoruz  (Dikkat! Bu satırları eklemeden önce benzer satırların dosya içerisinde daha önceden var olup olmadığını kontrol edin. Eğer Debian üzerinde ProFTPD’nin 1.3.0-19etch1 sürümünü kullanıyorsanız, paketle birlikte gelen proftpd.conf içerisinde <IfModule mod_quota.c> satırını <IfModule mod_quotatab.c> olarak değiştirin):

<IfModule mod_quotatab.c>
QuotaEngine on
QuotaLog /var/log/proftpd/quota.log

        <IfModule mod_quotatab_file.c>
                QuotaLimitTable file:/etc/proftpd/ftpquota.limittab
                QuotaTallyTable file:/etc/proftpd/ftpquota.tallytab
        </IfModule>
</IfModule>

QuotaEngine yönergesi, değeri on ise kota desteğini açar, off ise kapatır. Kota desteğini kapatmak istediğiniz zaman, kota ile ilgili tüm yapılandırmaları yorum satırı haline getirmek yerine, bu yönergeye off değerini vermek çok daha kolaydır.

QuotaLog yönergesi, mod_quotatab modülünün kullanacağı log dosyasını belirler.

<IfModule mod_quotatab_file.c> etiketi mod_quotatab_file modülü yüklü ise uygulanacak yönergeleri belirler (Kota tablolarını dosyalarda tutmak yerine MySQL ya da LDAP dizinlerinde de tutabilirsiniz. Bu durumda mod_quotatab_file yerine, sırasıyla, mod_quotatab_sql ya da mod_quotatab_ldap modülünü kullanmalısınız).

QuotaLimitTable yönergesi, limit tablosunun yolunu belirler. ftpquota.limittab dosyası, ftpquota uygulamasını hangi dizinde çalıştırır iseniz o dizinde oluşturulur. Bu yüzden sizin ftpquota.limittab dosyanızın yolu farklı ise bu yönergeyi kendinize uygun bir biçimde değiştirin (ya da bu dosyayı /etc/proftpd dizinine taşıyın. Düzen açısından bu şekilde yapmanız tavsiye edilir).

QuotaTallyTable yönergesi, çetele tablosunun yolunu belirler. QuotaLimitTable yönergesinin açıklamasında da belirtildiği gibi, bu yönergeyi kendinize uygun bir biçimde değiştirmelisiniz (Tavsiye edilen davranış ftpquota.tallytab dosyasını /etc/proftpd dizinine taşımaktır).

Bu ayarlamaları yaptıktan sonra, ProFTPD servisini yeniden başlatalım:

# /etc/init.d/proftpd restart

Test için enes kullanıcısının gönderebileceği (upload) maksimum byte sayısını belirleyelim (aşağıdaki komutu ftpquota.limittab ve ftpquota.tallytab dosyasını yarattığınız dizinde çalıştırın):

# ftpquota --add-record --type=limit --name=enes \
    --quota-type=user --bytes-upload=10000000

Yukarıdaki komuttaki --bytes-upload parametresi, --name parametresi ile belirtilmiş kullanıcı için gönderebileceği maksimum byte limitini belirler (Örneğimizde 10000000 Byte, yani 10 MB).

Şimdi enes kullanıcısı ile 10MB’ı sınırını zorlayalım:

$ ftp ftp.magmalinux.org
Connected to ftp.magmalinux.org.
220 ProFTPD 1.3.0 Server
Name: enes
331 Password required for enes.
Password:
230 User enes logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put dosya.zip
200 PORT command successful
150 Opening BINARY mode data connection for dosya.zip
netout: Broken pipe
552-Transfer aborted. Disk quota exceeded
552-STOR: notice: quota reached: used 10016368.00 of 10000000.00 upload bytes
552 STOR: notice: quota reached: 'dosya.zip' removed

ftp>

FTP sunucusuna SITE QUOTA komutunu göndererek enes kullanıcısının kota durumunu görelim:

ftp> quote SITE QUOTA
200-The current quota for this session are [current/limit]:
200-Name: enes
200-Quota Type: User
200-Per Session: False
200-Limit Type: Hard
200-  Uploaded bytes:   359696.00/10000000.00
200-  Downloaded bytes: unlimited
200-  Transferred bytes:        unlimited
200-  Uploaded files:   unlimited
200-  Downloaded files: unlimited
200-  Transferred files:        unlimited
200 Please contact root@magmalinux.org if these entries are inaccurate

Daha sonradan enes kullanıcısı için bu 10MB ın yetersiz olduğuna karar verdiğimizi düşünelim. Bu değeri değiştirmek için yine ftpquota aracını kullanacağız. Fakat bu sefer --add-record yerine --update-record parametresini kullanacağız (Eğer enes için tanımlanmış kota kayıdını silmek istiyor isek --delete-record parametresini, tanımlanmış kota seçeneklerini görmek istiyorsak --show-records parametresini kullanmalıyız). Aşağıdaki komut ile enes kullanıcısının kotasını limitsiz yapalım (-1 değeri limitsiz anlamına gelir):

# ftpquota --update-record --type=limit --name=enes \
    --quota-type=user --bytes-upload=-1

Yaptığımız değişikliği aşağıdaki komut yardımı ile kontrol edelim:

# ftpquota --show-records --type=limit
-------------------------------------------
  Name: enes
  Quota Type: User
  Per Session: False
  Limit Type: Hard
    Uploaded bytes:     unlimited
    Downloaded bytes:   unlimited
    Transferred bytes:  unlimited
    Uploaded files:     unlimited
    Downloaded files:   unlimited
    Transferred files:  unlimited

Bir kullanıcı için nasıl kota tanımlandığından bahsettik. Peki ya aynı ayarları yüzlerce kullanıcı için yaptığınızı bir düşünün. Aynı adımları her kullanıcı için tekrarlamak yerine, gruplar için nasıl kota belirtebileceğimize bir bakalım. Örneğimiz için www-data grubunu seçtik. Bu gruba dahil kullanıcılara 50MB’lık kota verelim:

# ftpquota --add-record --type=limit --name=www-data \
    --quota-type=group --bytes-upload=50000000

Değişen parametrelere dikkat edin. Birincisi artık kullanıcı adı yerine grup adı alan --name parametresi, diğeri ise --quota-type parametresidir.

Grup için belirtilen kota ayarları, öncelik sıralamasında, kullanıcı için tanımlananlardan sonra gelir. Yani www-data grubunda bulunan enes kullanıcısı için kota limiti yok iken, www-data grubundaki diğer kullanıcıların 50MB kotası vardır (Çünkü enes, www-data grubunda bulunduğu halde, bu kullanıcı için özel bir kota tanımlaması yapılmıştır).

3.6  Sanal Konaklar (Virtual Hosts)

Aynı ProFTPD sunucusunu, birden fazla IP adresine ya da birden fazla porta aynı anda FTP hizmeti verebilecek şekilde yapılandırabilirsiniz. FTP hizmeti verilen bu her bir IP adresi veya port sanal konak olarak adlandırılır.

FTP iletişim kurallarında HTTP/1.1 de olduğu gibi, istemcinin ulaşmak istediği alan adını belirten Host başlığı olmadığından, FTP sunucusunun gelen isteğin hangi alan adına yapılmakta olduğunu bilme gibi bir şansı yoktur. Bu durumda sanal konak tanımlamanın iki yolu var. Birincisi her bir konak için farklı bir IP adresi kullanmak ya da aynı IP adresi üzerinde farklı portlar kullanmaktır.

Örnek olması açısından iki sanal konak tanımlayalım ve yukarıda bahsettiğimiz iki yöntemi de deneyelim. İlk olarak her bir konak için farklı bir IP adresi kullanalım. Sanal konak tanımlarımız için yine proftpd.conf dosyamızı kullanıyoruz (Düzen olması açısından eğer isterseniz sanal konak tanımlarını başka bir dosya içerisinde yapıp proftpd.conf dosyasına Include yönergesi ile dahil edebilirsiniz):

<VirtualHost 192.168.1.2>
   ServerName "Ikinci Magma FTP Sunucusu"
   DefaultRoot ~
</VirtualHost>

<VirtualHost 10.1.0.1>
   ServerName "Ucuncu Magma FTP Sunucusu"
   DefaultRoot ~
</VirtualHost>

Şimdi aynı IP adresini fakat farklı bir portları kullanan iki tane sanal konak tanımlayalım.

<VirtualHost 192.168.1.2>
   ServerName "Dorduncu Magma FTP Sunucusu"
   DefaultRoot ~
   Port 1027
</VirtualHost>

<VirtualHost 192.168.1.2>
   ServerName "Besinci Magma FTP Sunucusu"
   DefaultRoot ~
   Port 990
</VirtualHost>

Tanımladığımız bu sanal konakları sırayla test edelim:

$ ftp 192.168.1.2
Connected to 192.168.1.2.
220 ProFTPD 1.3.0 Server (Ikinci Magma FTP Sunucusu) [::ffff:192.168.1.2]
Name: dogan
331 Password required for dogan.
Password:
230 User dogan logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
$ ftp 10.1.0.1
Connected to 10.1.0.1.
220 ProFTPD 1.3.0 Server (Ucuncu Magma FTP Sunucusu) [::ffff:192.168.1.2]
Name: dogan
331 Password required for dogan.
Password:
230 User dogan logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
$ ftp 192.168.1.2 1027
Connected to 192.168.1.2.
220 ProFTPD 1.3.0 Server (Dorduncu Magma FTP Sunucusu) [::ffff:192.168.1.2]
Name: dogan
331 Password required for dogan.
Password:
230 User dogan logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

3.7  proftpd.conf

ProFTPD ana yapılandırma dosyası olup değişikliğin en yoğun yapılacağı dosyadır. Bir proftpd.conf dosyasındaki en çok ilgileneceğimiz yönergeleri ayrıntısıyla inceleyelim:

Include /etc/proftpd/modules.conf

UseIPv6    on

ServerName   "Debian"
ServerType   standalone
DeferWelcome   off

İlk satır modül ayarlarının bulunduğu modules.conf dosyasını bu dosya içerisine dahil eder.

UseIPv6 yönergesi IPv6’nın kullanıp kullanılmayacağını belirler. Eğer sadece IPv4 ile çalışıyorsanız, değerinin off olmasında bir sakınca yoktur.

ServerName yönergesi, FTP bağlantısı sırasında kullanıcıya gösterilecek sunucu ismini belirler.

ServerType yönergesinin değeri inetd ise FTP hizmeti inetd altında verilir. Değeri standalone ise sunucu ayrı bir süreç olarak çalışır.

DeferWelcome yönergesinin değeri on olduğunda, kullanıcı girişi doğrulanana kadar ServerName yönergesinde yazan sunucu ismi gösterilmez.

DefaultServer   on
ShowSymlinks   on

DefaultServer yönergesi, gelen istek herhangi bir sanal konak (virtual host) ile eşleşmez ise sunucunun cevap verip vermeyeceğini belirler. Değeri off ise, sunucu "no server available to service your request" cevabını gönderir. Değeri on ise, DefaultServer hangi sanal konakta on olarak belirtilmiş ise bu sanal konak varsayılan sunucu olur. Yani herhangi bir sanal konakla eşleşmeyen istekler için bu sanal konak geçerli olur.

ShowSymlinks yönergesi, gelen isteklere sembolik linklerin gösterilip gösterilmeyeceğini belirler.

DisplayLogin                    welcome.msg
DisplayFirstChdir               .message
ListOptions                 "-l"

DisplayLogin yönergesi, herhangi bir kullanıcı giriş yaptığında, gösterilecek mesajın bulunduğu dosyanın ismini belirtir. Mutlak ya da göreceli yol belirtilebilir. Göreceli yol belirtilirse, kullanıcı giriş yaptığında hangi dizinde bulunuyorsa bu belirtilen dosya o dizinde aranır. Ayrıca kullanıcı chroot yöntemi ile hapsedilmiş ise bu dosya kullanıcının hapsedildiği dizinin altında olmalıdır, aksi taktirde dosyaya ulaşılamayacaktır.

DisplayFirstChdir yönergesi eskimiş ve kullanımı azalmış (deprecated) bir yönergedir. Yerine DisplayChdir kullanılmaktadır. DisplayChdir yönergesi bir dizine girildiğinde gösterilecek mesajın bulunduğu dosyanın ismini belirtir.

ListOptions yönergesi, dizinin içeriği listelenmek istendiğinde, ls komutuna verilecek parametreleri belirler.

Port    21
# PassivePorts                    49152 65534

Port yönergesi, dinlenecek portu belirler. Sanal konaklar için ana sunucunun dinlediği porttan farklı portlar belirtilebilir. Port değerini 0 yapmak, ilgili sanal konağı kapatacaktır.

PassivePorts yönergesi, istemci PASV komutunu gönderdiğinde FTP sunucusunun pasif ftp bağlantısı için kullanacağı port aralığını belirler. FTP sunucusu PASV komutu geldiğinde, bu aralık içerisinde kullanımda olmayan bir portu rasgele seçer (Burda yetki gerektirmediğinden 1024 ten büyük port numaraları seçmeniz tercih edilir).

MaxInstances   30

MaxInstances yönergesi, DoS saldırılarından etkilenmemek için aynı anda bağlanabilecek maksimum kullanıcı sayısını belirler.

User    proftpd
Group    nogroup

User ve Group yönergeleri, ProFTPD sürecini çalıştıran kullanıcıyı ve grubu belirler.

Umask    022  022

Umask yönergesi, FTP sunucusuna bir dosya gönderildiğinde yaratılacak dosya ve dizin için kullanılacak umask'ı belirler (Birinci değer dosyalar için, ikinci değer dizinler içindir. umask, User file creation mode MASK, yaratılacak dosyalar için silinecek hakları belirler. Örneğin bir dosyanın hakları 777 ve umask 022 ise, 777 değeri 022 ile maskelenir ve bu dosyanın yeni hakları 755 olur. Ayrıntılı bilgi için http://en.wikipedia.org/wiki/Umask).

AllowOverwrite   on

AllowOverwrite yönergesi, FTP ile sunucuya transfer edilen dosya ile aynı isimde bir dosya var ise, üzerine yazılıp yazılmayacağını belirler (AllowOverride yönergesi ile karıştırmayınız).

# UseSendFile   off

UseSendFile yönergesi, sendfile sistem çağrısının kullanılıp kullanılmayacağını belirler. sendfile sistem çağrısı, veri okuma yazma işini, tek seferde, işletim sistemi çekirdeği düzeyinde hallettiği için read ve write sistem çağrılarının ayrı ayrı çağrılmasına göre oldukça hızlıdır.

TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log

TransferLog yönergesi, veri transferleri ile ilgili logların tutulduğu dosyanın yolunu belirtir. SystemLog yönergesi ise ProFTPD sürecinin genel loglarının tutulacağı dosyayı belirler. Belirtilmemiş ise /var/log/syslog kullanılır.