FTP.PROXY(1)

NAME
ftp.proxy - FTP proxy server

SYNOPSIS
ftp.proxy [options] [server]

DESCRIPTION
ftp.proxy is a proxy server for a subset of the file tranfer protocol described in RFC 959. It forwards traffic between a client and a server without looking too much if both hosts do real FTP. The FTP server can be either given on the command line or supplied by the client.

ftp.proxy must be started from a TCP superserver like inetd(1) or tcpproxy(1). It can't bind to a TCP/IP port on it's own.

  Protocol Support
ftp.proxy supports the following FTP commands:

    ABOR, ACCT, APPE, CDUP, CWD, DELE, LIST, MDTM,
    MKD, MODE, NLIST, NOOP, PASS, PASV, PORT, PWD,
    QUIT, RETR, REST, RNFR, RNTO, RMD, SITE, SIZE,
    SMNT, STAT, STOR, SYST, TYPE, USER, XCUP, XCWD,
    XMKD, XPWD, XRMD

Transfer of structured data is not supported.

  Command Parameters
By default ftp.proxy does not accept blanks in command parameters. This is to protect your UNIX server against users who work on computers where these things are usual.

To allow blanks the option -b must be given on the commans line. Notice that blanks at the beginning or end of the parameter are still not supported.

The `SITE' is in neither case affected by this limitation, ftp.proxy accepts always blanks in `SITE' parameters.

  Server Selection
If client-side server selection it turned on with the -e option the user must select the FTP server he wants to use with the `@' notation. Instead of specifying the real ftp server on the command line the user has to connect to the gateway machine where ftp.proxy is running and to enter the username in the form
    The password that is send to the proxy server is the password required
    for logging into remote-ftp-server with the account remote-user.

In situations where the FTP client doesn't support usernames containing
an `@' the percent sign `%' might be used for that.

  Access Control
If an access control program is given with the -a option on the command line the connection data is passed to the acp before the server is contacted. The acp should return 0 as exit code to grant access and another value to deny.

The access controller receives the following variables:

PROXY_INTERFACE, PROXY_PORT
    interface and port where the client is connected to the proxy.

PROXY_CLIENT, PROXY_CLIENTNAME
    IP number an name of the connected client.

PROXY_SERVER, PROXY_SERVERPORT, PROXY_SERVERNAME
    IP number, port and name of the FTP server the client wants to contact.

PROXY_SERVERLOGIN
    the supplied username for the FTP server.

PROXY_USERNAME, PROXY_PASSWD
    supplied username and password for usage of the proxy server.

The values for PROXY_USERNAME and PROXY_PASSWD are taken from the supplied remote username and password if they contain a colon `:'. In this case the local authentication data is taken from the left side of the colon and the remaining right side is passed on to the server.

Furthermore the acp's stdout is connected to the FTP client and it's stderr is read by ftp.proxy which writes the acp's stderr output to syslog.

  Command Control
If a command control program (ccp) is given with the -c option this program is called for the FTP commands

    APPE, CDUP, CWD, DELE, LIST, MDTM, MKD,
    NLST, RETR, RNFR, RNTO, RMD, SIZE, STAT,
    STOR, STOU, XCUP, XCWD, XMKD, XRMD

The ccp returns an exit code of 0 to grant and any other to deny access (the exit code to the `QUIT' command is ignored). For the ccp the same variables as for acp's are set with the addition of

PROXY_COMMAND, PROXY_PARAMETER
    FTP command and parameter (if set).

PROXY_SESSION
    a unique identifier for the proxy session.

PROXY_CCPCOLL,
    the client's number of collisions with the ccp's permission rules (number of `permission denied' responses).

The ccp's stdout and stderr are connected to ftp.proxy. A one line message written to stdout by the ccp goes to syslog, while a message one stderr is sent to the client. If this message does not contain a status ftp.proxy substitutes a `553' code. If the message is empty the client gets a simle `553 permission denied'. Notice that the stderr message is only used if the ccp returns an exit code other the zero.

On normal program termination (`QUIT' command or timeout) the ccp is called with the command `+EXIT' to do some final clean up. It is not reliable that the ccp receives the `+EXIT' event. There are lots of possiblities that the proxy terminates without generating it, e.g. client timeout, server error or signal reciption by the proxy.

  Monitor Mode
The -m option puts ftp.proxy into the monitor mode. ftp.proxy will then try to keep track of the client's current directory on the server side. With this information the file parameter for the commands

    APPE, CDUP, CWD, DELE, LIST, MDTM, MKD
    NLST, RETR, RNFR, RNTO, RMD, SIZE, STOR,
    XCUP, XCWD, XMKD, XRMD

is converted into an absolute path. This value is then used in syslog messages and given to a ccp in the PROXY_FTPPATH variable. Furthermore the variable PROXY_FTPHOME contains the user's initial directory which is assumed to be his home directory.

The `LIST' and `NLIST' command may have a parameter or not. If it is absent ftp.proxy sets the parameter to `*' but this affects only the PROXY_FTPPATH variable, not the command that is sent to the server.

For the `CDUP' command PROXY_FTPPATH contains the full path of the target directory.

Monitoring may not work with all server systems since the output of the `PWD' command which is used by ftp.proxy to get the current directory in not completely defined. If the directory can not be clearly determined ftp.proxy will terminate.

OPTIONS
The following options are available:

-a acp
    specify an access control program that grants or denies access via ftp.proxy.

-b  allows blanks in filenames.

-c ccp
    set a command control program that grants or denies the usage of FTP commands through ftp.proxy.

-d  enter debug mode, the communication between server and client is written to stderr.

-e  enable client-side server selection. With this option the server argument isn't accepted.

-l  sets logging of most of the FTP commands.

-m  sets the monitor mode.

-p port
    tell ftp.proxy to use port as source port for data transfers (using port number 20 is FTP standard). Keep in mind that port numbers below 1024 require root permissions.

-s list
    the FTP server selected by the client must match one of the pattern from the comma separated list. The wildcards `*' and `?' can be used.

-t timeout
    specify a different FTP timeout in seconds than the default of 900 (15 minutes).

-v prefix
    set prefix as variable prefix for the variable passwd to the access and command control program.

-z size
    sets the amount of data in bytes ftp.proxy tries to read with one system call from either the client or the server. The default is 1024 bytes, valid values range from 1 to 4096. Playing around with larger values than the default may increase the proxy's data troughput.

-V  show version number

SEE ALSO
inetd(1), tcpproxy(1).