Jak funguje FTP
Rád bych v tomto článku rozebral protokol FTP, jak funguje, historické pozadí. K jeho napsání mě vedlo několik téměř identických a opakujících se dotazů na toto téma v Poradně, a dále pak ještě více i několik špatných odpovědí. Je vidět, že tato problematika není obecně známa, a proto bych rád alespoň trochu osvětlil tato zákoutí. Článek si neklade za úkol nahradit RFC, ale srozumitelnou formou vysvětlit funkci a základní chyby, kterých se dopouštějí správci FTP serverů i uživatelé klientů.
1. Co je to FTP?
FTP je zkratka z File Transfer Protocol. Je to jeden z nejstarších protokolů z rodiny TCP/IP vůbec. Od prvopočátku byl určen na rychlé přenosy souborů. Jeho stáří je zároveň jeho výhodou, ale i slabinou (vysoká rychlost a textový komunikační protokol, prakticky nulové zabezpečení proti odposlechu hesla, vícespojové přenosy).
2. Jak to všechno funguje?
Původně byl FTP protokol navržen v „aktivní“ podobě jak jej známe dnes. S vývojem internetu (a nedostatkem IPv4 adresového prostoru a s tím spojeným nástupem překladu adres – NAT) bylo potřeba tento protokol modernizovat tak, aby splňoval požadavky „nového“ internetu. Byl tedy implementován tzv. „pasivní“ režim, který do značné míry zjednodušil práci lidem za NATem.
2.1 Malá odbočka směrem k základům TCP/IP
Nyní je vhodný čas k tomu osvětlit, jakým způsobem jsou navazována TCP spojení. Je to jen malá odbočka, která má za cíl jen velmi povrchně popsat problematiku spojení, o kterém bude zanedlouho řeč.
Spojení se vždy navazuje mezi klientem (program, který vystavuje požadavky) a serverem (server je program, který umí tyto požadavky splnit). Server tzv. naslouchá na určeném portu na veškeré požadavky, tj. program serveru je neustále spuštěn, ať již provádí nějakou činnost či nikoliv.
Port je definován ve vysílaných a přijímaných IP paketech. Má přiřazeno číslo (od 1 do 65535), které se objevuje v hlavičce paketů. Podle nich pak operační systém třídí přišedší pakety odpovídajícím programům.
Norma RFC definuje prvních 1024 portů jako tzv. přiřazených, tj. takových, kterým byla oficiálně přiřazena nějaká služba či protokol serveru. Aby se to nepletlo, tak tzv. vyšší porty jsou tzv. nepřiřazené a klienti jich využívají k vystavování spojení (někam totiž ty data od serveru musí přitéci a pro data směrem ke klientovi se role virtuálně obrací – klient se stává „serverem“ pro daná příchozí data spojení, které sám vystavil.
FTP má typicky přiřazeno číslo portu 21. To je ovšem pouze standardní úzus, správce serveru může číslo portu, na kterém server naslouchá, téměř libovolně měnit, ale platí, že v jednom okamžiku na jednom portu může naslouchat pouze jediná služba serveru.
2.2 Aktivní FTP spojení (staří mají přednost aneb jak se do lesa volá, tak se z něj ozývá)
Jak už bylo řečeno, aktivní spojení je prapůvodní verzí. Funguje tak, že klient vystaví spojení ze svého portu nad 1024/TCP na port 21/TCP FTP serveru (viz obrázek).
Zde probíhá tzv. řídicí spojení, pomocí něhož klient ovládá FTP server. Poté, co se klient autentizuje, může zadávat serveru příkazy, např. LIST
/NLIST
pro výpis aktuálního adresáře, CWD
(Change Working Directory) pro změnu adresáře, STOR
pro uložení souboru na server, RETR
pro stažení souboru. Tyto příkazy serveru se provádějí pomocí lokálních příkazů poplatných FTP klientovi (unixový/DOSový používá ls
, cd
, get
, put
, windowsový zase tlačítka GUI). Server tyto příkazy plní a jejich výstup (ať už výpis adresáře či samotná up/down-loadovaná data) vysílá ze svého portu 20/TCP na port nad 1024/TCP náhodně (klientem) vybraného portu klienta.
Jaké jsou výhody? Textové řídicí spojení je abstrahováno od spojení datového, tudíž se snižuje režie spojení (není třeba složitě odlišovat řízení a data) a hlavně je možno odesílat data úplně jinam, než je klient (představte si – pomocí „superpomalého“ v.90 modemu přenášíte data mezi dvěma servery propojenými páteřní gigabitovou optikou, a to skoro plnou rychlostí onoho gigabitu, ale pozor, tuhle funkci mají dnešní servery kvůli bezpečnosti standardně vypnutou!). Dále takto nakonfigurovaný server můžete velmi jednoduše umístit za NATem – jediné, co musíte zajistit, je portforwarding portu 21/TCP a korektní NAT.
Jaké jsou nevýhody? Největší nevýhoda je ta, že klient musí mít povoleno příchozí spojení z portu 20/TCP na předem neurčený cílový port. To předpokládá, že klienti za NATem budou mít speciálně přizpůsobený router (viz následující zábavná kapitola „Caveats aneb Hnusné triky“).
2.3 Pasivní spojení (aneb mládí vpřed, čili nahraďme jeden problém druhým)
U pasivního spojení se (s ohledem na klienty za NATem) obě spojení vystavují směrem k FTP serveru (viz. obrázek).
Přepnutí na tento režim se provede příkazem PASV
. Nastává ovšem jiný problém: jak odlišit jednotlivé datové porty jednotlivých klientů? Jistě byste nechtěli stahovat data, která chtěl stahovat jiný uživatel a obráceně – jistě byste nechtěli, aby vaše data stahoval někdo jiný jen proto, že otevřel spojení na datový port serveru dříve než jste to stihli vy. Proto FTP server otevírá pro každý požadavek na datové spojení dedikovaný dočasný server na náhodném portu z rozsahu portů nad 1024/TCP (tento rozsah jde u slušných serverů nastavit). Otázkou je, jak to dá vědět klientovi. Vývojáři se rozhodli, že co nejjednodušeji, tj. v řídicím spojení jako textovou odezvu na příkaz, např.:
PASV
227 Entering Passive Mode (123,213,231,123,234,100).
LIST
150 Opening ASCII mode data connection for file list
Stahuje se
Direktiva z příkladu serveru č. 227 (odpověď na PASV
) říká klientovi, že má vystavit následující nové FTP-DATA spojení na předem určený port. V závorce je uvedena adresa a port – první 4 oktety (oktet = číslo oddělené čárkou) odpovídají IP adrese FTP serveru, a poslední dva označují port. Port se spočte jako 5. oktet krát 256 + 6. oktet. V našem případě to je port 60004/TCP. Na tomto portu na nás budou čekat data s výpisem adresáře (viz příklad, ve kterém k nám takto doputují data ze serveru jako odpověď na příkaz LIST
).
Jaké jsou výhody? Klient nemusí mít forwardovaný žádný port, pokud je za NATem, a tedy na klienta nejsou činěny žádné nadstandardní požadavky ohledně spojení.
Jaké jsou nevýhody? Server nemůže být za NATem, resp. byste museli zajistit forwarding odpovídající sady vysokých portů a navíc zajistit na routeru „hnusný trik“ (viz následující kapitola).
3. Caveats aneb „Hnusné triky“
Když jsme mluvili o aktivním spojení u klientů za NATem, pomysleli jste na to, co se stane v případě, kdy za NATem je více počítačů a uživatelů, a každý by chtěl aby měl forwardovaný zdrojový port 20/TCP? (u forwardingu platí totéž co u serverů – přesměrování jen na jeden počítač v jednom okamžiku).
A vzpomínáte si ještě, kdeže je uvedena informace o tom, kam se má klient u pasivního spojení spojit pro svá data? Jistě – v textové odpovědi serveru! Jistě, ale slyšel už někdy někdo, že by standardní NAT modifikoval něco jiného, než hlavičky paketů? Správně! Server, pokud je za NATem, vám v pasivním režimu pošle v řídicím spojení svou vnitřní, z internetu nedosažitelnou, IP adresu.
Tyto problémy se řeší pomocí speciálních modulů pro NAT. Jeden z nich se stará o connection tracking (tj. je užitečný pro klienty za NATem a rozděluje jim zpět data podle toho, jak o ně požádali) a druhý je zase schopen probírat řídicí spojení a vyhledávat v něm adresy pro pasivní spojení a nahrazovat je adresou routeru. Je třeba také říci, že některé FTP servery dokáží nechat si ve své konfiguraci nastavit IP adresu, kterou budou posílat pasivním uživatelům. Dalším možným řešením je použití proxy serverů, jak typu SOCKS, tak (transparentních) http/ftp proxy typu Squid.
4. Závěr
Jak vidíte, problematika to je opravdu zábavná, ale leckdy bývá problém dostat se přes devatero firewallů ke svému zdroji dat na FTP. Tenhle velmi kraťoučký návůdek doporučuji rozšířit samostudiem RFC dokumentů týkajících se FTP, jejichž základní seznam naleznete o něco níže, protože nastíněná problematika je jen vrcholek ledovce a popisuje jen nejčastější případy.
Doufám, že vám tenhle návod k něčemu byl a že jste se moc nenudili…
Slovníček pojmů
- FTP - File Transfer Protocol
- protokol pro přenos souborů
- RFC – Request For Comments
- normy, kterými jsou stanoveny otevřené komunikační protokoly používané na internetu
- NAT – Network Address Translation
- překlad síťových IP adres, používá se při přechodu paketu mezi sítí s privátním rozsahem adres a sítí s veřejným rozsahem adres
Zdroje
http://www.ietf.org/rfc/rfc1122.txt?number=1122
http://www.ietf.org/rfc/rfc0959.txt?number=959
http://www.wu-ftpd.org/rfc/
Poděkování
Speciální poděkování Michichovi za kontrolu
Extra speciální poděkování Hostovi za jazykový purismus