Copyright (c) 1999,2000 WU-FTPD Development Group.
All rights reserved.
Portions Copyright (c) 1980, 1985, 1988, 1989, 1990, 1991, 1993, 1994
The Regents of the University of California.
Portions Copyright (c) 1993, 1994 Washington University in Saint Louis.
Portions Copyright (c) 1996, 1998 Berkeley Software Design, Inc.
Portions Copyright (c) 1989 Massachusetts Institute of Technology.
Portions Copyright (c) 1998 Sendmail, Inc.
Portions Copyright (c) 1983, 1995, 1996, 1997 Eric P. Allman.
Portions Copyright (c) 1997 Stan Barber.
Portions Copyright (c) 1997 Kent Landfield.
Portions Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997
Free Software Foundation, Inc.
Use and distribution of this software and its source code are governed
by the terms and conditions of the WU-FTPD Software License ("LICENSE").
If you did not receive a copy of the license, it may be obtained online
at
http://www.wu-ftpd.org/license.html.
Testing your FTP server using TELNET
Often testing an FTP server with a real client can hide problems with the
server. I find it usefull to eliminate the quirks of the client software from
consideration by using Telnet instead. The operations discussed in this
document are generally usable with all FTP servers.
Although you'll see the internals of an FTP session here, it is not my
intention to teach the entire protocol. Refer to RFC 959 for a complete
discussion.
Using the system logs
---------------------
Many times, direct, by-hand testing is not needed. If you enable logging
on the command line with the -l option, you can add the following line to
your ftpaccess to see most of the conversation in your system logs. This
can often show you where the problem is occuring. If not, it will at least
allow you to follow the same command sequence as the actual client, in case
the problem depends upon the specific commands issued.
log commands real,guest,anonymous
Be warned, though, for a busy site logging all commands can make your
system logs amazingly large.
PASV downloads via telnet
-------------------------
When using PASV mode, data connections originate with the client. This
makes testing quite a bit easier since you only need a telnet client and a
calculator. (If you don't have a calculator handy, use your organic backup
system; it's slower and more error-prone, but almost everyone has one.)
Two or more telnet sessions are needed to completely test an FTP session.
I usually use multiple windows since they're easier to read, but for this
example, I'll use a single session.
First, open a telnet session to the FTP server and log in. I'll make
believe I'm Netscape Navigator while I'm at it.
$telnet ftp ftp
Trying 205.133.13.13...
Connected to ftp.vr.net.
Escape character is '^]'.
220 ftp.vr.net FTP server ready.
USER anonymous
331 Guest login ok, send your complete e-mail address as password.
PASS mozilla@
230 Guest login ok, access restrictions apply.
SYST
215 UNIX Type: L8
TYPE I
200 Type set to I.
PASV
227 Entering Passive Mode (205,133,13,13,21,169)
NLST
^]
telnet>
[1]+ Stopped telnet ftp ftp
In this example, I'm using NLST. You can use RETR to fetch a specific
file. If you're just testing the ability to do PASV connections, NLST is
fine. Break out of the current telnet session and start another. You'll
need to read and interpret the 227 response. The first four numbers are
the IP address you must connect to (usually the same as the FTP server's IP
address). The next two are the port number. You will need to do a little
math here. In this case, calculate ((21 * 256) + 169) to get the port
number, 5545. Open a session to that port. Since there is already a
transfer pending the output will display and the connection close
automatically.
$telnet ftp 5545
Trying 205.133.13.13...
Connected to ftp.vr.net.
Escape character is '^]'.
etc
pub
bin
incoming
.notar
private
dev
Connection closed by foreign host.
Back to the originial telnet session. Because this is being done on one
window, you won't see one detail: the 150 message appeared when the data
connection was openned and the 226 appreared when it completed. For long
transfers, or when things go awry, this timing is appearent (sometimes
important); which is the reason I usually use two windows for this testing.
$fg
telnet ftp ftp
150 Opening BINARY mode data connection for file list.
226 Transfer complete.
PASV
227 Entering Passive Mode (205,133,13,13,58,225)
LIST
^]
telnet>
[1]+ Stopped telnet ftp ftp
Since I used NLST earlier, and since most of the questions occur because of
'dir' and 'ls' issues (NLST and LIST), I'll do a LIST so you can see the
difference. Back to the calculator for ((58 * 256) + 225).
$telnet ftp 15073
Trying 205.133.13.13...
Connected to ftp.vr.net.
Escape character is '^]'.
total 8
dr-xr-xr-x 8 root root 1024 Feb 12 03:07 .
dr-xr-xr-x 8 root root 1024 Feb 12 03:07 ..
---------- 1 root root 0 Jun 9 1998 .notar
d--x--x--x 3 root root 1024 Sep 14 16:40 bin
d--x--x--x 2 root root 1024 Dec 24 16:31 dev
d--x--x--x 2 root root 1024 Dec 27 19:34 etc
drwxrws-wx 2 vrnet vrnet 1024 Oct 8 00:43 incoming
drwxrws--t 7 vrnet vrnet 1024 Feb 2 20:44 private
drwxrwsr-t 4 vrnet vrnet 1024 Aug 15 1998 pub
Connection closed by foreign host.
Finally, back to the control session to close the FTP session.
$fg
telnet ftp ftp
150 Opening BINARY mode data connection for /bin/ls.
226 Transfer complete.
QUIT
221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 1146 bytes in 2 transfers.
221-Thank you for using the FTP service on ftp.vr.net.
221 Goodbye.
Connection closed by foreign host.
$
PASV uploads via telnet
-----------------------
Testing uploads (STOR command) using PASV mode via telnet is much like
testing downloads. The only difference is that whatever you type into the
data connection telnet session is stored in the uploaded file.
PORT transfers via telnet and netcat
------------------------------------
PORT mode transfers require that you have a 'listener' running, waiting for
the FTP server. The netcat utility is such a program. For downloads, set
it to listen on a port and copy what it received to your screen or a file.
For uploads, give it a file to transmit. You will need to know the IP
number and port number where netcat is waiting and you will need to supply
a PORT command instead of a PASV command so the server has this
information. An example of a port command (for the PASV port used above),
and the server's response, would be:
PORT 205,133,13,13,58,225
200 PORT command successful.
If netcat were listening on TCP port 15073 and we issued the PORT command
instead of a PASV command, the results would be similar to the PASV
transfer. I'll be honest, though, I don't even have netcat installed, so I
cannot show examples. I've never needed to test PORT mode communications;
every problem I've ever needed to test was visible using PASV mode.