GNU/Linux >> Znalost Linux >  >> Linux

Aktivní FTP vs. pasivní FTP

Úvod

Jednou z nejčastějších otázek při řešení firewallů a dalších problémů s internetovým připojením je rozdíl mezi aktivním a pasivním FTP (File Transfer Protocol) a jak nejlépe podporovat jeden nebo oba z nich. Doufejme, že následující text pomůže objasnit některé nejasnosti ohledně podpory FTP v prostředí chráněném firewallem.

Tento příspěvek obsahuje příklady aktivních i pasivních relací FTP příkazového řádku. Tyto příklady relace by měly pomoci věci trochu objasnit. Poskytují také pěkný obrázek o tom, co se děje v zákulisí během relace FTP. Nyní k informacím…

Základy

FTP je výhradně služba založená na TCP. FTP neobsahuje žádnou komponentu UDP. FTP je neobvyklá služba v tom, že využívá dva porty, „datový“ port a „příkazový“ port (známý také jako řídicí port). Tradičně se jedná o port 21 pro příkazový port a port 20 pro datový port. Zmatek však začíná, když zjistíme, že v závislosti na režimu není datový port vždy na portu 20.

Aktivní FTP

V aktivním režimu FTP se klient připojí z náhodného neprivilegovaného portu (N> 1024) k příkazovému portu FTP serveru, portu 21. Poté klient začne naslouchat portu N+1 a odešle FTP příkaz PORT N+1 na FTP server. Server se poté připojí zpět ke klientovu specifikovanému datovému portu ze svého místního datového portu, což je port 20.

Z hlediska firewallu na straně serveru je pro podporu aktivního režimu FTP potřeba otevřít následující komunikační kanály:

  • Port 21 FTP serveru odkudkoli (klient zahájí připojení)
  • Port 21 FTP serveru na porty> 1024 (Server odpovídá na řídicí port klienta)
  • Port 20 FTP serveru na porty> 1024 (Server zahájí datové připojení k datovému portu klienta)
  • Port 20 FTP serveru z portů> 1024 (klient odesílá potvrzení ACK na datový port serveru)

Po vytažení se spojení zobrazí následovně:

  • Z klientského portu 1026 (Cmd) na serverový port 21 (Cmd)
  • Z portu serveru 21 (Cmd) na klientský port 1026 (Cmd)
  • Z portu serveru 20 (data) do portu klienta 1027 (data)
  • Z klientského portu 1027 (data) do portu serveru 20 (data)

V kroku 1 se příkazový port klienta spojí s příkazovým portem serveru a odešle příkaz PORT 1027. Server poté odešle potvrzení zpět na příkazový port klienta v kroku 2. V kroku 3 server zahájí připojení na svém místním datovém portu k datový port, který klient zadal dříve. Nakonec klient odešle ACK zpět, jak je znázorněno v kroku 4.

Hlavní problém s aktivním režimem FTP ve skutečnosti leží na straně klienta. FTP klient nenavazuje skutečné připojení k datovému portu serveru – jednoduše serveru sdělí, na jakém portu naslouchá, a server se připojí zpět k určenému portu na klientovi. Z firewallu na straně klienta se zdá, že jde o vnější systém iniciující připojení k internímu klientovi – něco, co je obvykle blokováno.

Příklad aktivního FTP

Níže je uveden skutečný příklad aktivní relace FTP. Jediné, co bylo změněno, jsou názvy serverů, IP adresy a uživatelská jména. V tomto příkladu je FTP relace zahájena z user01 (192.0.0.1), solárního boxu se standardním FTP klientem příkazového řádku, do dest_serv (192.0.0.2), solaris boxu se systémem Solaris[TM] 9 ftpd. Příznak ladění (-d) se používá s klientem FTP k zobrazení toho, co se děje v zákulisí. Vše v kurzívě je výstup ladění, který ukazuje skutečné FTP příkazy odesílané na server a odpovědi generované z těchto příkazů.

V tomto dialogu je třeba zvážit několik zajímavých věcí. Všimněte si, že když je zadán příkaz PORT, určuje port na klientském (192.0.0.1) systému, nikoli na serveru. Opačné chování uvidíme, když použijeme pasivní FTP. Když už jsme u toho, ještě krátká poznámka o formátu příkazu PORT. Jak můžete vidět v příkladu níže, je formátován jako řada šesti čísel oddělených čárkami. První čtyři oktety jsou IP adresa, zatímco druhé dva oktety obsahují port, který bude použit pro datové připojení. Chcete-li zjistit skutečný port, vynásobte pátý oktet číslem 256 a poté přidejte šestý oktet k součtu. V níže uvedeném příkladu je tedy číslo portu ( (256*188) + 231) nebo 48359. Tuto informaci by měla potvrdit rychlá kontrola pomocí netstat.

$ ftp -d dest_serv
Connected to dest_serv.
220 dest_serv FTP server ready.
Name (dest_serv:boqueron): root
---> USER root
331 Password required for root.
Password:
---> PASS XXXX
230 User root logged in.
---> SYST
215 UNIX Type: L8 Version: SUNOS
Remote system type is UNIX.
---> TYPE I
200 Type set to I.
Using binary mode to transfer files.
ftp> ls
---> PORT 192,0,0,1,188,231
200 PORT command successful.
---> TYPE A
200 Type set to A.
---> NLST
150 Opening ASCII mode data connection for file list.
TT_DB
bin
(...)
var
vol
xfn
226 Transfer complete.
191 bytes received in 0.03 seconds (6.16 Kbytes/s)
---> TYPE I
200 Type set to I.
ftp> quit
---> QUIT
221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 599 bytes in 1 transfers.
221-Thank you for using the FTP service on dest_serv.
221 Goodbye.
# netstat -a | grep 48359
dest_serv.ftp-data       user01.48359 33580      0 49640      0 TIME_WAIT

Pasivní FTP

Aby se vyřešil problém se serverem iniciujícím připojení ke klientovi, byla vyvinuta jiná metoda pro připojení FTP. Toto bylo známé jako pasivní režim nebo PASV podle příkazu, který klient použil k tomu, aby serveru oznámil, že je v pasivním režimu.

V pasivním režimu FTP klient inicializuje obě připojení k serveru, čímž se řeší problém firewallů filtrujících příchozí spojení datového portu ke klientovi ze serveru. Při otevírání FTP připojení otevře klient lokálně dva náhodné neprivilegované porty (N> 1024 a N+1). První port kontaktuje server na portu 21, ale místo toho, aby vydal příkaz PORT a umožnil serveru připojit se zpět k jeho datovému portu, klient vydá příkaz PASV. Výsledkem je, že server poté otevře náhodný neprivilegovaný port (P> 1024) a odešle příkaz PORT P zpět klientovi. Klient poté zahájí spojení z portu N+1 na port P na serveru za účelem přenosu dat.

Z hlediska firewallu na straně serveru je pro podporu pasivního režimu FTP potřeba otevřít následující komunikační kanály:

  • Port 21 FTP serveru odkudkoli (klient zahájí připojení)
  • Port 21 FTP serveru na porty> 1024 (Server odpovídá na řídicí port klienta)
  • Porty FTP serveru> 1024 odkudkoli (klient zahájí datové připojení k náhodnému portu určenému serverem)
  • Porty FTP serveru> 1024 na vzdálené porty> 1024 (Server odesílá potvrzení ACK (a data) na datový port klienta)

Při nakreslení vypadá připojení FTP v pasivním režimu takto:

  • Z klientského portu 1026 (Cmd) na serverový port 21 (Cmd)
  • Z portu serveru 21 (Cmd) na klientský port 1026 (Cmd)
  • Z klientského portu 1027 (data) na serverový port 2024
  • Z portu serveru 2024 (Cmd) na klientský port 1027 (data)

V kroku 1 klient kontaktuje server na příkazovém portu a vydá příkaz PASV. Server poté v kroku 2 odpoví PORT 2024 a sdělí klientovi, na kterém portu naslouchá pro datové připojení. V kroku 3 pak klient zahájí datové spojení ze svého datového portu na zadaný datový port serveru. Nakonec server odešle zpět potvrzení ACK v kroku 4 na datový port klienta.

Zatímco pasivní režim FTP řeší mnoho problémů na straně klienta, otevírá celou řadu problémů na straně serveru. Největším problémem je potřeba povolit jakékoli vzdálené připojení k vysoko číslovaným portům na serveru. Naštěstí mnoho FTP démonů, včetně démona solaris in.ftpd, umožňuje správci specifikovat rozsah portů, které bude FTP server používat. Další informace naleznete v příloze 1.

Druhý problém se týká podpory a řešení problémů klientů, kteří podporují (nebo ne) pasivní režim. Například obslužný program FTP příkazového řádku dodávaný s démonem Solaris ftp podporuje pasivní režim od Solaris 9 (počínaje sccs v1.20). Podívejte se na manuálové stránky (in.ftpd), volba -p.

S masivní popularitou World Wide Web mnoho lidí dává přednost použití svého webového prohlížeče jako FTP klienta. Většina prohlížečů podporuje pouze pasivní režim při přístupu k ftp:// URL. To může být dobré nebo špatné v závislosti na tom, co jsou servery a firewally nakonfigurovány pro podporu.

Příklad pasivního FTP

Níže je skutečný příklad pasivní relace FTP. Jediné, co bylo změněno, jsou názvy serverů, IP adresy a uživatelská jména. V tomto příkladu je relace FTP zahájena z user01 (192.0.0.1), solárního boxu se standardním FTP klientem příkazového řádku, do dest_serv (192.0.0.2), solárního boxu se systémem Solaris 9 ftpd. Příznak ladění (-d) se používá s klientem FTP k zobrazení toho, co se děje v zákulisí. Vše v kurzívě je výstup ladění, který ukazuje skutečné FTP příkazy odesílané na server a odpovědi generované z těchto příkazů. Normální výstup serveru je zobrazen černě a vstup uživatele je tučně .

Všimněte si rozdílu v příkazu PORT v tomto příkladu oproti příkladu aktivního FTP. Zde vidíme, že se port otevírá na serveru (192.0.0.2), nikoli na klientovi. Viz diskuzi o formátu příkazu PORT výše v části Příklad aktivního FTP.

$ ftp -d dest_serv
Connected to dest_serv.
220 dest_serv FTP server ready.
Name (dest_serv:boqueron): root
---> USER root
331 Password required for root.
Password:
---> PASS XXXX
230 User root logged in.
---> SYST
215 UNIX Type: L8 Version: SUNOS
Remote system type is UNIX.
---> TYPE I
200 Type set to I.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> ls
---> PASV
227 Entering Passive Mode (192,0,0,2,7,176)
---> TYPE A
200 Type set to A.
---> NLST
150 Opening ASCII mode data connection for file list.
TT_DB
bin
cdrom
(...)
vol
xfn
226 Transfer complete.
191 bytes received in 0.027 seconds (7.04 Kbytes/s)
---> TYPE I
200 Type set to I.
ftp> quit
---> QUIT
221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 599 bytes in 1 transfers.
221-Thank you for using the FTP service on dest_serv.
221 Goodbye.

Shrnutí

Následující tabulka by měla správcům pomoci zapamatovat si, jak jednotlivé režimy FTP fungují:

Active FTP : 
command : client >1024 -> server 21 
data :    client >1024 <- server 20 
Passive FTP : 
command : client >1024 -> server 21 
data :    client >1024 -> server >1024

Rychlé shrnutí výhod a nevýhod aktivního vs. pasivního FTP je také na místě:

Aktivní FTP je výhodné pro správce FTP serveru, ale je škodlivé pro správce na straně klienta. FTP server se pokouší vytvořit připojení k náhodným vysokým portům na klientovi, což by téměř jistě bylo blokováno firewallem na straně klienta. Pasivní FTP je prospěšné pro klienta, ale škodlivé pro správce FTP serveru. Klient vytvoří obě připojení k serveru, ale jedno z nich bude na náhodně vysoký port, který by byl téměř jistě blokován firewallem na straně serveru.

Naštěstí existuje určitý kompromis. Protože správci provozující FTP servery budou muset zpřístupnit své servery co největšímu počtu klientů, budou téměř jistě muset podporovat pasivní FTP. Vystavení vysokoúrovňových portů na serveru lze minimalizovat zadáním omezeného rozsahu portů, který má FTP server používat. Na straně serveru tedy může být firewallem vše kromě tohoto rozsahu portů. I když to neodstraňuje všechna rizika pro server, výrazně je snižuje. Další informace naleznete v příloze 1.


Linux
  1. Brána sériového portu Netbsd?

  2. Přehled FTP a SFTP

  3. nc:příkaz nenalezen

  1. Gitlab na portu 8080

  2. Pochopení mapování portů dockeru

  3. Jenkins aktivní (opuštěno)

  1. Zajistěte, aby ftp klient Linuxu ignoroval místní IP adresu v pasivním režimu

  2. HTTPS SSH tunel

  3. Zkontrolujte počet aktivních připojení na portu 80?