0887 371 498 support@itservice-bg.net
23.11.2017 · Самуил Арсов · Debian, Hosting, Linux commands, Ubuntu

Пасивни портове за 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 с политика DROP и разрешени портове за пасивен FTP

⚠️ Правило, добавено така, не оцелява рестарт. За постоянно се ползва 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 цялата тази конфигурация с пасивни портове изобщо не е нужна, защото всичко минава по един порт.