File Transfer Protocol

O serviço de transferência de arquivos via FTP (File Transfer Protocol) é um dos serviços mais usados na Internet. Ele pode ser usado para transferência de arquivos privados de usuários, usando autenticação via nome/senha, e também para acesso a repositórios públicos, com acesso anônimo.

Servidores e clientes

Vários servidores de FTP estão disponíveis gratuitamente em ambiente UNIX, entre eles são muito usados o VSFTP, o WU-FTP, o ProFTPd e o PureFTP. Cada um deles possui seus próprios arquivos de configuração. A Wikipedia traz uma excelente relação de servidores FTP para várias plataformas.

Servidores de FTP podem ser acessados através de clientes em linha de comando, clientes gráficos específicos ou navegadores Web. A maioria dos sistemas operacionais dispõe de um cliente FTP em modo texto, acessível através do comando ftp, a ser digitado em um terminal.

Para acesso usando um navegador Web, a URL do serviço FTP tem a forma “ftp://user:password@host:port/path” (a parte “user:password@” pode ser omitida no caso de conexões anônimas). O servidor FTP da PUCPR mostra um exemplo de acesso ao serviço FTP através de navegador.

O serviço FTP

O serviço de FTP é provido por um daemon geralmente chamado ftpd, que pode ser lançado através do daemon inetd/xinetd ou então como um serviço autônomo. Ele faz uso das portas 20/TCP (fluxo de dados) e 21/TCP (controle da conexão), mas também pode usar outras portas acima de 1024. Os logs de uso do servidor FTP são normalmente armazenados em /var/log/xferlog.

Em relação à autenticação, o servidor de FTP pode oferecer dois tipos de acesso:

Um exemplo de FTP autenticado:

(client)$ ftp espec.ppgia.pucpr.br
Connected to espec.ppgia.pucpr.br.
220 (vsFTPd 1.0.0)
Name (espec:maziero): maziero
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x    2 500      500          4096 Jul 31 15:20 Desktop
drwxr-xr-x    2 500      500          4096 Jul 31 18:58 bin
-rw-r--r--    1 500      500           435 Jul 31 22:22 journal.txt
drwx------    2 500      500          4096 Jul 18 12:50 projs
drwx-----x    4 500      500          4096 Jul 31 19:03 public_html
226 Directory send OK.
ftp> quit

Um exemplo de FTP anônimo:

(client)$ ftp ftp.unicamp.br
Connected to zeus.unicamp.br.
220  FTPserver da Unicamp - Master - Default
Name (ftp.unicamp.br:maziero): anonymous
331 Anonymous login ok, send your complete email address as your password
Password:
230-
   Bem-vindo ao servidor FTP da Unicamp!
   Sugestoes e comentarios, por favor entre em contato  com <apoio@ccuec.unicamp.br>.
     
   Welcome to UNICAMP's FTP server!
   For comments on this site, please contact <apoio@ccuec.unicamp.br>.
 
 You are user (162)  of (300) simultaneous users allowed.
 
230 Anonymous access granted, restrictions apply
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
150 Opening ASCII mode data connection for file list
-rw-r--r--   1 FtpUser  FtpGroup      302 Jul 11  2005 msg.welcome
drwxrwsr-x  10 FtpUser  FtpGroup     1024 Jul 15 16:48 pub
drwxrwsr-x  10 FtpUser  FtpGroup      512 Apr 26  2007 pub2
drwxrwsr-x  11 FtpUser  FtpGroup      512 Feb 22 13:08 pub3
drwxrwsr-x   3 FtpUser  FtpGroup      512 Jul 16 11:16 pub4
drwxrwsr-x   4 FtpUser  FtpGroup      512 Jul 15 12:16 pub5
drwxrwsr-x  13 FtpUser  FtpGroup      512 Jul 15 12:51 pub6
226 Transfer complete
ftp> quit

Quanto ao formato dos dados transferidos, a transferência pode ocorrer de dois modos:

Os modos de operação binário ou ASCII podem ser selecionados na linha de comando do cliente FTP, através dos comandos bin e ascii, respectivamente.

Comandos FTP

Um cliente FTP em linha de comando oferece um conjunto de comandos para operações envolvendo arquivos, como download, upload, navegação em diretórios, etc. Os comandos básicos oferecidos pela maioria dos clientes FTP são apresentados a seguir:

Comando e exemplo Significado
ftp ftp.pucpr.br lança o cliente e abre uma conexão com o servidor indicado
open ftp.pucpr.br inicia uma conexão com o servidor indicado
bye
quit
encerra a conexão e o cliente FTP
close encerra a conexão (mas não o cliente)
ls
dir
lista o conteúdo do diretório remoto
cd dirA muda o diretório remoto para dirA
cd .. retorna ao diretório anterior
lcd dirB muda o diretório local (do cliente) para dirB
pwd informa o diretório remoto atual
get arquivo.txt obtém o arquivo remoto arquivo.txt
get arquivo.txt file.txt obtém o arquivo remoto arquivo.txt, salvando-o localmente como file.txt
mget *.c obtém todos os arquivos remotos *.c
put arquivo.txt transfere o arquivo local arquivo.txt para o servidor
mput *.jpg transfere para o servidor todos os arquivos locais *.jpg
delete arq.txt remove o arquivo remoto arq.txt
mkdir dirA cria um novo diretório
rmdir dirB remove o diretório indicado (se estiver vazio)
ascii ajusta modo de transferência para ASCII
bin ajusta modo de transferência para binário
prompt liga/desliga as confirmações individuais para mget e mput
passive liga/desliga o modo passivo (vide abaixo)
help mostra os comandos disponíveis

Modos ativo e passivo

O serviço FTP sempre inicia através de uma conexão à porta 21/TCP do servidor; essa conexão e responsável pelo controle das transferências de dados entre cliente e servidor, sendo por isso chamada de control port. A seguir, é necessário abrir uma segunda conexão entre ambos, sobre a qual ocorrerão as transferências de dados propriamente ditas; por isso, essa nova conexão é chamada data port.

Há duas formas de se estabelecer a conexão de dados. Na primeira forma, chamada FTP Ativo, o cliente cria uma porta TCP de número N>1023, e o servidor conecta a essa porta do cliente, a partir de sua porta 20/TCP. Essa forma de operação pode trazer problemas em algumas redes, pois o servidor precisa se conectar em uma porta do cliente, o que normalmente é bloqueado pelos firewalls do lado do cliente.

O quadro a seguir detalha a operação em modo ativo:

Passo Cliente Servidor
1 Pede conexão à porta 21/TCP do servidor
2 Aceita o pedido de conexão
3 Solicita autenticação de usuário
4 Autentica o usuário
5 Escolhe uma porta N>1023 e informa ao servidor
6 Recebe o número de porta N escolhido pelo cliente
7 Seleciona um conteúdo para download
8 Pede conexão à porta N/TCP do cliente,
a partir de sua porta 20/TCP
9 Aceita o pedido de conexão
10 Envia o conteúdo solicitado para a porta N/TCP
11 Recebe o conteúdo solicitado

Uma transferência em FTP ativo entre o cliente 192.168.0.174 e o servidor FTP 200.192.112.10 é mostrada da seguinte forma pelo comando netstat (aqui N vale 54398):

Proto Recv-Q Send-Q Endereço Local          Endereço Remoto         Estado
tcp        0      0 192.168.0.174:54398     200.192.112.10:20       ESTABELECIDA
tcp        0      0 192.168.0.174:38631     200.192.112.10:21       ESTABELECIDA

Na segunda forma, denominada FTP Passivo, o servidor cria uma porta TCP de número aleatório N>1023 e informa ao cliente, que se conecta a essa porta do servidor. Dessa forma, todas as conexões sempre partem do cliente, o que permite atravessar a maioria dos firewalls do lado do cliente. Todavia, o servidor passa a operar com portas aleatórias, o que complica a configuração de firewalls do lado do servidor.

O quadro a seguir detalha a operação em modo passivo:

Passo Cliente Servidor
1 Pede conexão à porta 21/TCP do servidor
2 Aceita o pedido de conexão
3 Solicita autenticação de usuário
4 Autentica o usuário
5 Seleciona o modo passivo
6 Escolhe uma porta N>1023 e informa ao cliente
7 Recebe o número de porta N escolhido pelo servidor
8 Seleciona um conteúdo para download
9 Pede conexão à porta N/TCP informada pelo servidor
10 Aceita o pedido de conexão
11 Solicita o conteúdo desejado à porta 21/TCP
12 Envia o conteúdo solicitado usando a porta N/TCP

Uma transferência em FTP passivo entre o cliente 192.168.0.174 e o servidor FTP 200.192.112.10 é mostrada da seguinte forma pelo comando netstat (aqui, N vale 44072):

Proto Recv-Q Send-Q Endereço Local          Endereço Remoto         Estado
tcp        0      0 192.168.0.174:38632     200.192.112.10:21       ESTABELECIDA
tcp        0      0 192.168.0.174:34197     200.192.112.10:44072    ESTABELECIDA

Resumindo, em modo ativo:

E em modo passivo: