Anonymous pobiera pliki publiczne bez prawa zapisu. Konto lokalne przesyła i pobiera pliki w swoim katalogu upload.
Dwa sposoby dostępu do plików.
vsftpd jest serwerem FTP. Klient łączy się z usługą, przegląda katalogi i przesyła pliki. Anonymous oznacza dostęp bez własnego konta i osobistego hasła. Użytkownik lokalny loguje się nazwą i hasłem konta Ubuntu.
W tym zadaniu anonymous może czytać pliki publiczne, lecz nie może nic zapisywać. Konto ftpuczen może czytać i zapisywać w swoim katalogu upload. Dostęp do innych katalogów ogranicza chroot.
Zwykły FTP przesyła hasło i dane bez szyfrowania. Wykonuj ten wariant w zaufanej, wydzielonej sieci laboratoryjnej z hasłem używanym wyłącznie do ćwiczenia. Do przesyłania prywatnych danych przez Internet użyj FTPS z TLS albo SFTP, opisanym w lekcji SSH. SFTP i FTP to różne protokoły.
Połącz dwa komputery przez switch.
10.0.0.10/24vsftpd · FTP10.0.0.20/24Ubuntu Desktop / Windows 11Podłącz oba komputery kablami do tego samego switcha i tej samej sieci VLAN. Adresy są przykładowe: serwer 10.0.0.10/24, klient 10.0.0.20/24, maska 255.255.255.0. Każdy adres musi być unikalny. Do komunikacji w tej podsieci nie potrzeba bramy ani DNS. Internet jest potrzebny do instalacji pakietów; sam switch go nie zapewnia. Nie wpisuj przypadkowej bramy.
Adresację ustaw według lekcji Netplan. Na Windows adres ustaw we właściwościach IPv4 karty Ethernet. Jeśli korzystasz z VM, wybierz kartę mostkowaną do przewodowego interfejsu i sprawdź, czy serwer jest osiągalny z drugiego fizycznego komputera.
ip -br address
ip routeip -br address
ping -c 4 10.0.0.10ipconfig
ping 10.0.0.10Ping potwierdza odpowiedź ICMP; jego brak może wynikać z zapory. Test portu i właściwej usługi wykonasz w dalszej części. Nie używaj adresu localhost do testu z drugiego komputera.
Zainstaluj usługę i narzędzia.
sudo apt update
sudo apt install vsftpd
sudo cp -a /etc/vsftpd.conf /etc/vsftpd.conf.przed-lab
sudo systemctl enable --now vsftpd
systemctl status vsftpd --no-pagerKopię wykonaj raz przed zmianami; jeżeli już istnieje, wybierz inną nazwę. Oczekiwany stan usługi to active (running).
sudo apt update
sudo apt install curlNa Windows możesz użyć klienta FileZilla i protokołu FTP w trybie pasywnym. W dalszej części są również przykłady z curl.exe, dostępnego w Windows 11. Przeglądarki internetowe nie są klientami FTP.
Przygotuj anonymous i konto lokalne.
getent passwd ftp
sudo install -d -o root -g root -m 755 /srv/ftp/public
printf 'Plik publiczny z serwera FTP\n' | sudo tee /srv/ftp/public/czytaj.txt
sudo chmod 644 /srv/ftp/public/czytaj.txtPakiet powinien utworzyć systemowe konto ftp, wykorzystywane przez sesje anonymous. Nie ustawiaj mu hasła do logowania i nie twórz osobnego konta o nazwie anonymous. Katalog publiczny jest własnością roota; klienci mogą go czytać.
sudo adduser ftpuczen
sudo install -d -o root -g root -m 755 /srv/ftp/users
sudo install -d -o root -g root -m 755 /srv/ftp/users/ftpuczen
sudo install -d -o ftpuczen -g ftpuczen -m 750 /srv/ftp/users/ftpuczen/uploadJeżeli konto już istnieje, nie twórz go ponownie. Ustaw własne hasło laboratoryjne podczas adduser. Katalog główny chroot należy do roota i nie daje użytkownikowi prawa zapisu. Zapisywać można w podkatalogu upload. Dzięki temu nie trzeba włączać allow_writeable_chroot.
Ustaw vsftpd i wyjaśnij opcje.
Na świeżym serwerze laboratoryjnym otwórz plik i zastąp jego zawartość poniższą konfiguracją. Nie doklejaj drugiego zestawu tych samych opcji. Wpisy mają format opcja=wartość, bez spacji przy znaku równości.
sudo nano /etc/vsftpd.conflisten=YES
listen_ipv6=NO
anonymous_enable=YES
anon_root=/srv/ftp/public
no_anon_password=YES
anon_world_readable_only=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
local_enable=YES
write_enable=YES
local_umask=077
chroot_local_user=YES
user_sub_token=$USER
local_root=/srv/ftp/users/$USER
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.allowed_users
pam_service_name=vsftpd
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
port_enable=NO
xferlog_enable=YES
ssl_enable=NO| Ustawienie / test | Znaczenie / oczekiwany wynik |
|---|---|
listen=YES, listen_ipv6=NO | Usługa nasłuchuje przez IPv4. Nie włączamy jednocześnie obu trybów. |
anonymous_enable, anon_root | Włącza logowanie anonymous i wskazuje katalog publiczny. |
no_anon_password=YES | Sesja anonymous nie wymaga hasła; podane przez klienta hasło nie jest osobistym sekretem. |
anon_*_enable=NO | Wyłącza przesyłanie, tworzenie katalogów oraz inne operacje zapisu anonymous. |
local_enable=YES | Pozwala uwierzytelniać konta lokalne przez PAM. |
write_enable=YES | Pozwala wykonywać operacje zapisu. Nadal obowiązują uprawnienia Linux i ograniczenia anonymous. |
local_umask=077 | Nowe pliki lokalnego użytkownika mają zwykle tryb 600, katalogi 700; wynik zależy również od trybu bazowego. |
chroot_local_user=YES | Ogranicza widok plików użytkownika do jego katalogu FTP. |
user_sub_token=$USER, local_root | Podstawia nazwę zalogowanego użytkownika, np. /srv/ftp/users/ftpuczen. Zapis $USER pozostaje dosłowny w pliku. |
userlist_deny=NO | Lista jest listą dozwolonych kont. Umieszczamy na niej ftpuczen oraz nazwy anonymous i ftp. |
pasv_min_port, pasv_max_port | Zakres portów połączeń danych w trybie pasywnym. |
port_enable=NO | Wyłącza aktywny tryb transferu. Klient musi użyć trybu pasywnego. |
xferlog_enable=YES | Włącza dziennik transferów. |
ssl_enable=NO | Ten wariant to zwykły FTP bez TLS, wyłącznie do ćwiczenia w pracowni. |
printf 'anonymous\nftp\nftpuczen\n' | sudo tee /etc/vsftpd.allowed_users
sudo chown root:root /etc/vsftpd.allowed_users
sudo chmod 644 /etc/vsftpd.allowed_usersOtwórz porty i zastosuj konfigurację.
FTP ma oddzielne połączenie sterujące i połączenia danych. Port 21 odpowiada za logowanie i komendy, a porty 40000–40100 za listowanie katalogów i transfer w wybranym trybie pasywnym. Dopuszczenie samego portu 21 może pozwolić na logowanie, ale blokować przesyłanie plików.
sudo ufw status verbose
sudo ufw allow from 10.0.0.20 to any port 21 proto tcp
sudo ufw allow from 10.0.0.20 to any port 40000:40100 proto tcpJeżeli UFW jest nieaktywny, reguły nie włączają filtrowania. Włączaj go przy konsoli dopiero po dopuszczeniu innych potrzebnych usług, np. SSH. Nie zmieniaj zapory szkolnego routera. W tym układzie LAN nie potrzebujesz przekierowania NAT ani pasv_address.
sudo systemctl restart vsftpd
systemctl status vsftpd --no-pager
sudo ss -ltnp 'sport = :21'vsftpd weryfikuje konfigurację podczas startu. Jeśli restart się nie powiedzie, przeczytaj sudo journalctl -u vsftpd -n 50 --no-pager. Nie ma tutaj odpowiednika testparm z Samby. Porty danych mogą pojawiać się tylko na czas transferu.
Testuj anonymous na drugim komputerze.
curl --user anonymous:lab --list-only ftp://10.0.0.10/
curl --user anonymous:lab ftp://10.0.0.10/czytaj.txt -o pobrany-publiczny.txt
cat pobrany-publiczny.txtLista powinna zawierać czytaj.txt, a pobrany plik tekst „Plik publiczny z serwera FTP”.
printf 'Test klienta\n' > test-ftp.txt
curl --user anonymous:lab -T test-ftp.txt ftp://10.0.0.10/test-ftp.txtOczekiwany wynik: odmowa zapisu, zwykle odpowiedź FTP 550 lub komunikat o odmowie STOR. Plik nie powinien pojawić się na serwerze. Nie zmieniaj uprawnień na 777, aby ten test przeszedł: odmowa jest poprawnym wynikiem.
Alternatywa: FileZilla na Windows.
Ustaw host 10.0.0.10, port 21, protokół FTP, szyfrowanie „tylko zwykły FTP”, typ logowania „anonimowy” i tryb pasywny. Pobierz czytaj.txt, następnie spróbuj przesłać plik — zapis ma zostać odrzucony.
curl.exe --user anonymous:lab --list-only ftp://10.0.0.10/
curl.exe --user anonymous:lab ftp://10.0.0.10/czytaj.txt -o pobrany-publiczny.txt
Get-Content .\pobrany-publiczny.txtTestuj konto lokalne i granice dostępu.
curl --user ftpuczen --list-only ftp://10.0.0.10/
curl --user ftpuczen -T test-ftp.txt ftp://10.0.0.10/upload/test-ftp.txt
curl --user ftpuczen ftp://10.0.0.10/upload/test-ftp.txt -o pobrany-lokalny.txt
cmp test-ftp.txt pobrany-lokalny.txtCurl zapyta o hasło konta — nie wpisujemy go w poleceniu. W katalogu głównym zobaczysz upload. Transfer do upload i pobranie mają się udać. cmp nie wypisuje komunikatu, gdy pliki są identyczne; echo $? powinno zwrócić 0.
curl --user ftpuczen -T test-ftp.txt ftp://10.0.0.10/test-ftp.txtZapis w katalogu głównym powinien zostać odrzucony. Chroot pokazuje katalog użytkownika jako /; nie powinieneś widzieć systemowych katalogów /etc i /home. W FileZilli zaloguj się typem „normalny” jako ftpuczen i wykonaj te same operacje.
sudo ls -l /srv/ftp/users/ftpuczen/upload
sudo cat /srv/ftp/users/ftpuczen/upload/test-ftp.txtWłaścicielem pliku ma być ftpuczen, a jego treść ma odpowiadać plikowi klienta. Na Windows zastąp curl przez curl.exe, utwórz plik przez Set-Content test-ftp.txt "Test klienta" i porównaj pliki poleceniem Get-FileHash.
Dodaj drugiego użytkownika lokalnego.
sudo adduser ftpuczen2
sudo install -d -o root -g root -m 755 /srv/ftp/users/ftpuczen2
sudo install -d -o ftpuczen2 -g ftpuczen2 -m 750 /srv/ftp/users/ftpuczen2/upload
printf 'ftpuczen2\n' | sudo tee -a /etc/vsftpd.allowed_users
sudo systemctl restart vsftpdNie dodawaj konta ponownie, jeżeli już istnieje. Zaloguj się na kliencie jako ftpuczen2: curl --user ftpuczen2 --list-only ftp://10.0.0.10/. Zobaczysz jego własny upload. Prześlij plik test-ftp.txt do tego katalogu, a następnie zaloguj się jako ftpuczen i sprawdź, że lista w jego upload nie zawiera nowego pliku drugiego użytkownika. Każdy użytkownik ma osobny katalog główny, ustalony przez local_root i $USER. Zapisz w raporcie listy plików obu kont.
Rozwiąż typowe problemy.
| Ustawienie / test | Znaczenie / oczekiwany wynik |
|---|---|
| Nie można się połączyć | Sprawdź IP, VLAN switcha, port 21, usługę i reguły zapory. |
| Logowanie działa, lista plików lub transfer nie | Sprawdź pasywny tryb klienta i dopuszczenie portów 40000–40100. |
| 530 Login incorrect | Sprawdź hasło, konto, listę dozwolonych, /etc/ftpusers i /etc/pam.d/vsftpd. Konta z zablokowanym hasłem lub nieakceptowaną powłoką mogą zostać odrzucone. |
| 500 OOPS: writable root inside chroot | Katalog /srv/ftp/users/ftpuczen ma należeć do roota i mieć 755. Zapisywać wolno dopiero w upload. |
| 550 Permission denied | Dla anonymous odmowa zapisu jest oczekiwana. Dla konta lokalnego sprawdź własność upload i write_enable. |
| Usługa nie startuje | Sprawdź składnię YES/NO, spacje, powtórzenia opcji i konflikt listen/listen_ipv6. |
sudo journalctl -u vsftpd -n 50 --no-pager
sudo namei -l /srv/ftp/users/ftpuczen/upload
sudo tail -n 30 /var/log/vsftpd.logDziennik transferów zależy od ustawień logowania i pojawia się po transferach. Jeśli go brakuje, sprawdź dziennik systemd oraz ewentualny /var/log/xferlog. Nie dodawaj roota do listy kont FTP.
Zadanie samodzielne i kryteria zaliczenia.
Na Ubuntu uruchom vsftpd. Anonymous ma pobrać publiczny plik i otrzymać odmowę zapisu. Konto lokalne ma przesłać oraz pobrać raport we własnym upload. Wszystkie testy klienta wykonaj z drugiego komputera przez switch.
| Ustawienie / test | Znaczenie / oczekiwany wynik |
|---|---|
| Adresacja obu komputerów | Zapis adresów, maski i schemat serwer–switch–klient. |
| Instalacja i start | Stan active oraz nasłuch TCP 21. |
| Anonymous | Lista plików, pobrana treść i dowód odmowy uploadu. |
| Konto lokalne | Udany upload/download, porównanie plików oraz właściciel na serwerze. |
| Ograniczenia | Odmowa zapisu w katalogu głównym użytkownika i brak dostępu poza chroot. |
| Wyjaśnienie | Opisz local_enable, write_enable, chroot_local_user i zakres pasywny. |
Pytania kontrolne i podpowiedzi
Dlaczego FTP potrzebuje więcej niż jednego portu? Dlaczego write_enable nie oznacza, że anonymous może zapisywać? Dlaczego katalog główny chroot należy do roota? Połączenie sterujące i połączenie danych mają różne role. Zapis zależy od opcji dla danego rodzaju konta oraz praw Linux. Katalog główny bez prawa zapisu pozwala zachować ograniczenie chroot i kierować zapis do upload.
Dokumentacja vsftpd.
Scenariusz: Ubuntu Server 24.04 LTS i drugi komputer w tej samej sieci przez switch. Przygotowano 12.10.2026. Polecenia oznaczone SERWER wykonuj na serwerze, KLIENT na drugim komputerze.