Пасивни портове за pure-ftpd зад защитна стена
Ако сте конфигурирали защитна стена на вашия Linux сървър и искате да използвате пасивни FTP връзки, трябва да определите обхвата на пасивния порт и в FTP сървъра, и в защитната стена, за да се уверите, че връзките не се блокират. Следният пример е за pure-ftpd на Debian или Ubuntu.
Защо изобщо е нужен диапазон
При пасивен режим клиентът отваря втора връзка към сървъра — за самите данни — на порт, който сървърът обявява в момента на прехвърлянето. Без зададен диапазон този порт е случаен от целия висок обхват, а през защитна стена с политика DROP това значи: списъкът с файлове се вижда, но самото сваляне увисва. Класическият симптом — свързването минава, LIST виси.
pure-ftpd
sudo su
echo "40110 40210" > /etc/pure-ftpd/conf/PassivePortRange
/etc/init.d/pure-ftpd-mysql restart
Правило в iptables
iptables -I INPUT -p tcp -m multiport --dports 21,40110:40210 -m state --state NEW -j ACCEPT
Проверка с sudo iptables -nL:

⚠️ Правило, добавено така, не оцелява рестарт. За постоянно се ползва iptables-persistent или се записва в конфигурацията на защитната стена.
Същото с ufw
На машина с ufw (както са нашите сървъри) не се пипат голи iptables правила — те се губят при следващото презареждане на ufw:
sudo ufw allow 21/tcp
sudo ufw allow 40110:40210/tcp
sudo ufw status numbered
proftpd
Във файла /etc/proftpd/proftpd.conf се добавя редът:
PassivePorts 40110 40210
След което услугата се рестартира:
sudo systemctl restart proftpd.service
Ако сървърът е зад NAT
Още едно място, където това се чупи: когато FTP сървърът е зад рутер, той обявява на клиента своя вътрешен адрес и връзката за данни тръгва наникъде. Затова се задава публичният адрес изрично:
# pure-ftpd
echo "93.155.130.10" > /etc/pure-ftpd/conf/ForcePassiveIP
# proftpd
MasqueradeAddress 93.155.130.10
Разбира се, диапазонът трябва да е пренасочен и на самия рутер.
Проверка
ftp -p сървър
# или, за да се види точно какво се договаря:
lftp -d -u потребител сървър
В отговора на командата PASV се вижда обявеният адрес и порт — там веднага личи и NAT проблемът, и порт извън разрешения диапазон.
Едно уточнение за днес
Голият FTP пренася и паролата, и данните в чист вид. Ако услугата е достъпна от интернет, диапазонът пасивни портове решава техническия проблем, но не и същинския. По-добрият избор е FTPS (същият pure-ftpd с TLS) или SFTP през самия SSH — при SFTP цялата тази конфигурация с пасивни портове изобщо не е нужна, защото всичко минава по един порт.