Итак, есть роутер на FreeBSD, у которого два интерфейса (локальный и интернет) и есть FTP-сервер на FreeBSD только с локальным интерфейсом.
Нужно пробросить FTP-сессии из инета в локальную сеть причем так, чтобы у клиентов работал и active mode и passive mode.
В качестве FTP-сервера используется proftpd.
В качестве файервола на роутере используется Packet Filter (PF).
В /etc/pf.conf в секции NAT пишем:
binat on $ext_if from 192.168.0.253 to any -> 199.99.88.88
, где
$ext_if - внешний интерфейс
192.168.0.253 - IP-адрес FTP-сервера в локальной сети
199.99.88.88 - IP-адрес роутера в интернете
rdr pass on $ext_if proto tcp from any to any port ftp -> 192.168.0.253
, где
$ext_if - внешний интерфейс
192.168.0.253 - IP-адрес FTP-сервера в локальной сети
Подразумевается, что остальные разрешающие правила в pf.conf уже написаны.
Переходим к настройке FTP-сервера, а именно proftpd, а именно proftpd.conf
MasqueradeAddress 199.99.88.88
Всё.
Работают и активный и пассивный режимы подключения.
Литература: