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