FTP, Rsync

Vladimír Lapáček, < xlapacek@fi.muni.cz>


Obsah


Úvod

FTP (File Transmission Protocol) je protokol typu klient/server určený pro přenos souborů mezi vzdáleným serverem a lokální stanicí. Je velmi jednoduchý a proto také velmi používaný. Tento protokol je definovaný v RFC 959. Má přiděleny 2 well-known porty: 20 (datový) a 21 (řídící). Nasledující schéma znázorňuje způsob komunikace mezi serverem a klientem:


                                            -------------
                                            |/---------\|
                                            ||   User  ||    --------
                                            ||Interface|<--->| User |
                                            |\----^----/|    --------
                  ----------                |     |     |
                  |/------\|  FTP Commands  |/----V----\|
                  ||Server|<---------------->|   User  ||
                  ||  PI  ||   FTP Replies  ||    PI   ||
                  |\--^---/|                |\----^----/|
                  |   |    |                |     |     |
      --------    |/--V---\|      Data      |/----V----\|    --------
      | File |<--->|Server|<---------------->|  User   |<--->| File |
      |System|    || DTP  ||   Connection   ||   DTP   ||    |System|
      --------    |\------/|                |\---------/|    --------
                  ----------                -------------
PI zde znamená protocol interpreter a DTPdata transfer process.

Server poslouchá na řídícím portu (obvykle 21), kde čeká na příchozí spojení od klienta (z nějakého vyššího portu). Pro komunikaci klienta se serverem se používají krátké příkazy maximálně čtyřpísmenné většinou doplněné parametrem. Server na ně odpovídá trojciferným číslem určujícím kód odpovědi doplněným dalším popisem. Přihlášení klienta zajišťují příkazy USER a PASS, kterými se klient identifikuje vůči serveru. Použité přihlašovací jméno určuje, ke kterým souborům získá klient práva. Zvláštní postavení má přihlašovací jméno anonymous, pro které FTP démon pracuje obvykle v chrootovaném prostředí a místo hesla požaduje emailovou adresu.Pro přenos dat se na serveru otevře datový port (řídící-1), stejně tak na klientském počítači. Samotný přenost dat je realizován TCP spojením nad datovými porty příjemce a odesílatele. Po zkončení přenosu jsou datové porty uzavřeny.
Další důležité příkazy jsou:

Funkčnost běžícího FTP serveru lze snadno ověřit npříklad telnetem na port 21. Server by měl vypsat úvodní pozdrav a čekat na další příkazy. Nalogujeme se příkazy USER login, PASS password a server by měl odpovědět kladným kódem a ohlásit User login logged in. Nyní můžeme použít například příkaz stat, který nám vypíše info o připojení a nastavení přenosu. Spojení se ukončuje příkazem QUIT.

FTP Klienti

Pro komunikaci se serverem potřebujeme klientský program. Z těch nejpoužívanějších:

FTP Servery

Naopak pro zřízení FTP serveru potřebujeme nějakého FTP démona.

ProFTPD

Základní vlastnosti:

Instalace

Instalace probíhá obvyklým
./configure
make
make install
Základní instalace však zahrnuje jen zlomek možností, které ProFTPD obshauje. Pokud potřebujeme některý z volitelných modulů pouřijeme
./configure --with-modules=mod_name1:mod_name2

Konfigurace

ProFTPD čte své nastavení standartně z /etc/proftpd.conf. Tento soubor je velmi podobný konfiguračnímu souboru www serveru Apache. Dělí do několika sekcí.

Sekce <Global> slouží k nastavení "defaultních hodnot". Toto nastavení lze později změnit v jednotlivých sekcích.

V sekci <Anonymous> se definuje základní konfigurace anonymního FTP serveru. Implicitně server pracuje v chrootovaném prostředí. Jako login použijeme "anonymous", jako heslo emailovou adresu.

V sekci <Directory> se definují přístupová práva pro uvedený adresář.

Sekce <Limit> se používá pro stanovení omezení, kdo a jaké příkazy se mohou používat.

Sekce <VirtualHost> slouží k vytvoření a knfiguraci virtuálního FTP serveru.

Příklad konfiguračního souboru:
 ServerName             "My ProFTPD server"

 ServerType             standalone

 Port                   21

 #standartni umaska, tak aby nove adresare nebyly zapisovatelne pro group a others
 Umask                  022

 TimeoutLogin           120
 TimeoutIdle            600
 TimeoutNoTransfer      900
 TimeoutStalled         3600

 #maximalni pocet potomku (funguje jen ve stadnalone modu) 
 MaxInstances       	30

 User                	nobody
 Group                  nogroup
 
 #koren ftp stromu
 DefaultRoot            korenovy_adresar/

 ScoreboardPath		/var/run/proftpd
 
 TransferLog            /var/spool/syslog/proftpd/xferlog.legacy

 LogFormat         	default "%h %l %u %t \"%r\" %s %b"
 LogFormat              auth    "%v [%P] %h %t \"%r\" %s"
 LogFormat              write   "%h %l %u %t \"%r\" %s %b"

 #ve sech adresarich je mozne prepisovat soubory
 <Directory /*>
   	AllowOverwrite       on
 </Directory>

 #neni-li receno jinak, je vsude zakazano zapisovani
 <Limit WRITE>
        dENYall
 </Limit>

 <Global>
        DisplayLogin            welcome.msg
        DisplayFirstChdir       readme
        
        ExtendedLog             /var/spool/syslog/proftpd/access.log WRITE,READ write,read
        
        ExtendedLog             /var/spool/syslog/proftpd/auth.log AUTH auth
        
        #ExtendedLog    	/var/spool/syslog/proftpd/paranoid.log ALL default
 </Global>

 #zakladni konfigurace anonymniho FTP serveru as jednim upload adresarem
 <Anonymous korenovy_adresar/pub>
  	<Limit LOGIN>
    		AllowAll
  	</Limit>

  	MaxClients	5 "Sorry, max %m users -- try again later"

	User     	ftp
  	Group          	ftp
  
  	UserAlias  	anonymous ftp

  	<Directory uploads/*>
    		<Limit READ>
      			DenyAll
    		</Limit>
    		<Limit STOR>
      			AllowAll
    		</Limit>
  	</Directory>
 
 </Anonymous>
 
#a priklad jednoho virtualniho FTP serveru
 <VirtualHost ftp.virtual.cz>
        ServerAdmin             ftp_admin@virtual.cz
        ServerName              "Jinde FTP server"
        MaxLoginAttempts        2
        RequireValidShell       no
        TransferLog             /var/spool/syslog/proftpd/xferlog.www
        MaxClients              50
        DefaultServer           on
        DefaultRoot             jiny_koren/

        TimeoutLogin                    240
        TimeoutIdle                     900
        TimeoutNoTransfer               1200
 	
     	<Limit ALL>
         	Order Allow,Deny
         	Allow .evil.net, .evil2.net
         	Allow .dangerous.net
         	Deny ALL
      	</Limit>

       	#private adresar jen pro hodne kamarady :-)
        <Directory jiny_koren/private>
                <Limit ALL>
                        AllowUser kamarad1
                        AllowUser kamarad2
                        DenyAll
                </Limit>
        </Directory>
</VirtualHost>

Rsync

Tento program slouží pro efektivní přenos souborů mezi dvěma počítači na síti. Chová se podobně jako rcp, ale poskytuje mnohem více možností a pro urychlení přenosu používá remote-update protokol. Pomocí tohoto protokolu rsync nepřenáší celé soubory, ale pouze odlišnosti v nich. Pro hledání těchto rozdílů je použito checksum-search algoritmu. Rsync umí přenášet nejen obyčejné soubory, ale také odkazy, soubory z adresáře /dev a zároveň zachovává jejich práva, vlastníka a skupinu. Pro přenos souborů můžeme použít na vzdáleném počítači rsync démona nebo remoteshell - ssh. Druhá varianta nám zajistí šifrované spojení. Pokud cílová cesta obsahuje jen jeden oddělovač : použije se ssh, pokud dva, použije se pro příjem dat rsync.

Příkazem rsync lze spustit jak démona (volba --daemon), tak klientský program. Opět můžeme zvolit mezi spuštěním ze super-serveru inetd nebo jako stand-alone démonem. V prvním případě je nutno přidat do souboru /etc/services přidat záznam

rsync	873/tcp

K běžícímu rsync serveru se lze připojit pomocí příkazu rsync (tentokrát bez volby --daemon). Obecný příkaz pro kopírování souborů ze vzdáleného počítače může vypadat následově

rsync [OPTIONS] [USER@]HOST::SRC [DEST]
Pro kopírování souborů se zachováním linků, práv a vlastníků lze použít příkaz:
rsync -avz foo:src/bar/ /tmp
Volba -v (--verbose) nám vypíše více informací, -z (--compress) zajistí, že bude použita komprese a -a (--archive) dovolí zachovat přístupová práva atd.

Konfigurace

Konfigurační soubor je standartně v /etc/rsyncd.conf a je podobný konfiguračnímu souboru samby.
Příklad konfigurace
motd file = /etc/motd
max connections = 25
syslog facility = local3

[ftp]
        comment = ftp area
        path = /home/ftp
        read only = yes
        list = yes
        uid = nobody
        gid = nobody
[tmp]
        comment = temporary file area
        path = /tmp
        read only = no
        list = yes
        hosts allow = 10.0.0.0/8 127.0.0.0/8 *.fi.muni.cz
        auth users = tridge, susan
        secrets file = /etc/rsyncd.secrets           

Více viz rsync.samba.org