Konfiguracja serwera FTP za NAT

Jeżeli korzystasz z VPS-a naszej firmy działającego za NAT-em, możesz bez problemu uruchomić na nim serwer FTP. Trzeba jedynie pamiętać, że taki VPS nie posiada własnego publicznego adresu IPv4, a dostęp z Internetu odbywa się przez przypisane Ci porty.

Najlżejszym i jednocześnie prostym rozwiązaniem będzie vsftpd.

W tym przykładzie przyjmujemy, że Twój dostawca VPS przydzielił Ci:

Port FTP: 10221

Zakres portów PASV:
21000-21020

Twój VPS ma prywatny adres IPv4, ale nie musisz wykonywać konfiguracji NAT samodzielnie — odpowiada za to operator usługi. Po swojej stronie konfigurujesz jedynie serwer FTP zgodnie z przydzielonymi portami.


1. Instalacja vsftpd

Najpierw zaktualizuj listę pakietów:

apt update

Następnie zainstaluj serwer FTP:

apt install -y vsftpd

Uruchom usługę i ustaw jej automatyczny start wraz z systemem:

systemctl enable --now vsftpd

Możesz sprawdzić jej stan:

systemctl status vsftpd

2. Przygotowanie konfiguracji

Przed zmianami warto wykonać kopię domyślnej konfiguracji:

cp /etc/vsftpd.conf /etc/vsftpd.conf.backup

Następnie otwórz plik:

nano /etc/vsftpd.conf

3. Podstawowa konfiguracja FTP

Wklej lub dostosuj konfigurację:

listen=YES
listen_ipv6=NO

anonymous_enable=NO
local_enable=YES
write_enable=YES

local_umask=022

dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES

chroot_local_user=YES
allow_writeable_chroot=YES

pasv_enable=YES

pasv_min_port=21000
pasv_max_port=21020

pam_service_name=vsftpd

secure_chroot_dir=/var/run/vsftpd/empty

Najważniejsza część dla VPS-a NAT to:

pasv_enable=YES
pasv_min_port=21000
pasv_max_port=21020

Zakres:

21000-21020

musi być zgodny z tym, który został przydzielony Twojemu VPS-owi przez dostawcę.

Jeżeli otrzymałeś inny zakres, wpisz właśnie jego.

Przykładowo:

23000-23019

oznacza:

pasv_min_port=23000
pasv_max_port=23019

4. Adres używany w trybie PASV

FTP w trybie pasywnym musi poinformować program FTP, pod jaki publiczny adres ma się połączyć.

Twój VPS za NAT-em posiada prywatny adres, przykładowo:

10.77.0.15

Nie jest on dostępny z Internetu.

Dlatego w konfiguracji należy ustawić publiczny adres IPv4 podany przez dostawcę VPS.

Dodaj:

pasv_address=PUBLICZNY_ADRES_IP

Przykładowo:

pasv_address=51.75.61.218

Właściwy publiczny adres IP powinien znajdować się w informacjach dotyczących Twojego VPS-a.

Pełna część konfiguracji PASV może więc wyglądać tak:

pasv_enable=YES

pasv_address=51.75.61.218

pasv_min_port=21000
pasv_max_port=21020

5. Jeżeli otrzymałeś nazwę hosta zamiast adresu IP

Jeżeli dostawca zaleca korzystanie z nazwy hosta, możesz użyć:

pasv_addr_resolve=YES
pasv_address=ftp.example.pl

Przykład:

pasv_enable=YES
pasv_addr_resolve=YES
pasv_address=ftp.example.pl

pasv_min_port=21000
pasv_max_port=21020

Najczęściej jednak prostsze jest użycie bezpośrednio publicznego adresu IPv4.


6. Restart serwera FTP

Po zapisaniu konfiguracji wykonaj:

systemctl restart vsftpd

Sprawdź:

systemctl status vsftpd

Jeżeli usługa działa poprawnie, zobaczysz:

active (running)

7. Port FTP na VPS NAT

Ważne: na samym VPS-ie vsftpd może nadal działać na standardowym porcie:

21

Nie musisz zmieniać go na port publiczny.

Jeżeli Twój dostawca przydzielił Ci przykładowo:

10221

to połączenie wygląda mniej więcej tak:

Twój komputer
     |
     | port 10221
     v
publiczny adres NAT
     |
     v
Twój VPS
     |
     | port 21
     v
vsftpd

Dlatego w programie FTP wpisujesz:

Host:
ftp.example.pl

Port:
10221

ale w konfiguracji vsftpd nadal możesz używać standardowego portu 21.


8. Firewall na VPS

Jeżeli korzystasz z UFW, zezwól na port FTP oraz przydzielony zakres PASV.

Przykład:

ufw allow 21/tcp
ufw allow 21000:21020/tcp

Nie musisz otwierać na VPS-ie publicznego portu:

10221

jeżeli operator NAT przekierowuje go na lokalny port:

21

9. Utworzenie użytkownika FTP

Najprościej wykorzystać zwykłego użytkownika systemowego.

Utwórz konto:

adduser ftpuser

Podczas tworzenia użytkownika ustaw hasło.

Domyślnie jego katalog będzie znajdował się tutaj:

/home/ftpuser

Możesz utworzyć przykładowy katalog na pliki WWW:

mkdir -p /home/ftpuser/www

Nadaj właściciela:

chown -R ftpuser:ftpuser /home/ftpuser

10. Ograniczenie użytkownika do jego katalogu

W konfiguracji mamy:

chroot_local_user=YES

Dzięki temu użytkownik FTP będzie ograniczony do własnego katalogu domowego.

Przykładowo użytkownik:

ftpuser

będzie pracował w:

/home/ftpuser

i nie będzie miał możliwości swobodnego przeglądania całego systemu.


11. Zablokowanie logowania SSH dla konta FTP

Jeżeli konto ma służyć wyłącznie do FTP, możesz zablokować mu normalną powłokę systemową:

usermod -s /usr/sbin/nologin ftpuser

Następnie sprawdź:

cat /etc/shells

Jeżeli nie ma tam:

/usr/sbin/nologin

dodaj:

echo '/usr/sbin/nologin' >> /etc/shells

12. Połączenie z FileZilla

Przykładowe dane:

Host:
ftp.example.pl

Port:
10221

Użytkownik:
ftpuser

Hasło:
Twoje hasło

W FileZilla wybierz tryb pasywny:

Passive / PASV

W większości programów FTP jest on ustawiony domyślnie.


13. Dlaczego tryb PASV jest wymagany?

FTP wykorzystuje więcej niż jedno połączenie.

Pierwsze odpowiada za:

logowanie
polecenia
obsługę sesji

Drugie służy do:

listowania katalogów
wysyłania plików
pobierania plików

Dlatego dostałeś od dostawcy nie tylko port:

10221

ale także zakres:

21000-21020

To właśnie porty PASV.

Bez nich może wystąpić sytuacja, w której:

  • logowanie działa,
  • połączenie z serwerem jest poprawne,
  • ale FileZilla zatrzymuje się na pobieraniu listy katalogów.

14. Typowy problem: działa logowanie, ale nie widać plików

Jeżeli klient FTP pokazuje komunikat podobny do:

Retrieving directory listing...

i po chwili pojawia się timeout, sprawdź przede wszystkim:

grep pasv /etc/vsftpd.conf

Powinieneś zobaczyć wartości zgodne z danymi otrzymanymi od dostawcy:

pasv_enable=YES
pasv_address=51.75.61.218
pasv_min_port=21000
pasv_max_port=21020

Sprawdź również firewall:

ufw status

Jeżeli używasz UFW, zakres PASV musi być otwarty.


15. Bezpieczny FTP — FTPES

Klasyczny FTP nie szyfruje połączenia.

Oznacza to, że bez TLS nie powinien być używany do przesyłania danych przez Internet.

Dlatego zalecane jest uruchomienie:

Explicit FTP over TLS

często nazywanego:

FTPES

16. Certyfikat dla FTP

Jeżeli posiadasz domenę:

ftp.example.pl

możesz użyć certyfikatu Let's Encrypt.

Na VPS NAT najlepszą metodą uzyskania certyfikatu jest zwykle:

DNS-01

Nie wymaga ona dostępu do standardowych portów:

80
443

Po wystawieniu certyfikatu pliki mogą znajdować się przykładowo tutaj:

/etc/letsencrypt/live/ftp.example.pl/fullchain.pem
/etc/letsencrypt/live/ftp.example.pl/privkey.pem

17. Włączenie TLS w vsftpd

Edytuj:

nano /etc/vsftpd.conf

Dodaj:

ssl_enable=YES

rsa_cert_file=/etc/letsencrypt/live/ftp.example.pl/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/ftp.example.pl/privkey.pem

force_local_logins_ssl=YES
force_local_data_ssl=YES

ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

Po zmianie:

systemctl restart vsftpd

18. Ustawienia FileZilla dla FTPES

Po włączeniu TLS wybierz w FileZilla:

Protokół:
FTP

Szyfrowanie:
Require explicit FTP over TLS

Dane połączenia pozostają takie same:

Host:
ftp.example.pl

Port:
10221

Nie jest potrzebny dodatkowy port dla szyfrowanego FTP.


19. Automatyczne odnowienie certyfikatu

Jeżeli Certbot automatycznie odnawia certyfikat, warto po odnowieniu przeładować vsftpd.

Utwórz plik:

nano /etc/letsencrypt/renewal-hooks/deploy/reload-vsftpd.sh

Wklej:

#!/bin/bash

systemctl restart vsftpd

Nadaj prawa wykonania:

chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-vsftpd.sh

20. Kompletna przykładowa konfiguracja

Przykładowy /etc/vsftpd.conf:

listen=YES
listen_ipv6=NO

anonymous_enable=NO

local_enable=YES
write_enable=YES
local_umask=022

use_localtime=YES

xferlog_enable=YES
dirmessage_enable=YES

chroot_local_user=YES
allow_writeable_chroot=YES

pasv_enable=YES
pasv_address=51.75.61.218
pasv_min_port=21000
pasv_max_port=21020

ssl_enable=YES

rsa_cert_file=/etc/letsencrypt/live/ftp.example.pl/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/ftp.example.pl/privkey.pem

force_local_logins_ssl=YES
force_local_data_ssl=YES

ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

pam_service_name=vsftpd
secure_chroot_dir=/var/run/vsftpd/empty

Po zapisaniu:

systemctl restart vsftpd
Czy ta informacja była pomocna?

Podobne artykuły

Konfiguracja nginx za NAT

W tym poradniku skupimy się na poprawnym wystawieniu strony internetowej przez serwer WWW nginx....