The support for IPv6 in ProFTPD is fairly new, and still under development.
As such, it's very possible that there are bugs related to IPv6 functionality.
In particular, here are some things that may be affected:

  ServerType (IPv4/IPv6 inetd, xinetd)
  AllowForeignAddress
  PassivePorts
  MasqueradeAddress (IPv6)
  UseReverseDNS
  SocketBindTight

Please report any IPv6-related problems with the above to the bug tracking
system as soon as possible, so that we may fix it:

  http://bugs.proftpd.org

To enable IPv6 functionality, you need to explicitly configure proftpd using
the proper configure option:

  ./configure --enable-ipv6 ...

The functionality of the following configuration directives has been 
changed slightly with the addition of IPv6 support:

  Bind
  DefaultAddress
  MasqueradeAddress
  <VirtualHost>

These directives can take both IP address and DNS names as parameters.
If given IP addresses, either IPv4 or IPv6, they work as one expects.  The
case that is now different is when a DNS name is given as a parameter.

It's possible for a DNS name to have multiple IP addresses, both A and AAAA
records.  Thus Bind, DefaultAddress, and <VirtualHost> will resolve a DNS
name to its address(es); if multiple addresses are found, Bind directives will
be implicitly added.  For example:

  <VirtualHost localhost>
    ...
  </VirtualHost>

on an IPv6-enabled host, would be treated as:

  <VirtualHost ::1>
    Bind 127.0.0.1
    ...
  </VirtualHost>

Recall that the Bind directive works by "binding" the server configuration
to a different IP address, such that proftpd, when it searches its list of
server configurations by IP address, the bound configuration is matched
with the different IP address.

NOTE: the MasqueradeAddress does _not_ resolve a DNS name to all possible
addresses.  ProFTPD can only masquerade as one address, and so, if given a
DNS name, MasqueradeAddress will masquerade using the first IP address returned
by the DNS lookup.

Known issues:

  + system/platform dependencies (Linux version, BSD/KAME, etc)

    o example: on Darwin (MacOSX), one must two define two different
      vhosts, 0.0.0.0 and ::, in order to accept both IPv4 and IPv6
      connections.  However, on Solaris, binding to an IPv6 address will
      accept both IPv4 and IPv6 connections to that address.  Note that
      this is only a problem if SocketBindTight is _not_ on, i.e. if
      wildcard sockets are used.

    o On BSD systems, the net.inet6.ip6.v6only sysctl affects how wildcard
      sockets are bound with respect to IPv6.

    o On Linux systems, the net.ipv6.bindv6only sysctl affects how wildcard
      sockets are bound with respect to IPv6.

    o Apache2 mentions the same problem here:
       http://httpd.apache.org/docs-2.0/bind.html#ipv6

    o Broken HP-UX 11i getaddrinfo() implementation.  To fix this, a
      patch from HP-UX is needed.  The release notes for IPv6 on HP-UX 11i
      can be found here:
        http://docs.hp.com/hpux/onlinedocs/T1306-90004/T1306-90004.html
