Instalacja serwera ftp na OpenWrt
Ostatnia zmiana: 2013-11-26 18:43

Jeżeli ruter posiada nośnik zewnętrzny w postaci dysku, pamięci flash lub karty SD można zainstalować serwer ftp. Dzięki temu wymiana plików może być przeprowadzona najszybszym dostępnym sposobem wykorzystując klienta ftp lub po prostu przeglądarkę WWW. Dostępny jest już poradnik opisujący vsftpd, jednakże dla wielu użytkowników problemem jest ustawienie odpowiednich uprawnień związanych z wymaganiami vsftpd. ProFTPD jest niestety większy objętościowo.
Przedstawiony program ma potężne możliwości i dobrą dokumentację (umożliwia m.in tworzenie wirtualnych użytkowników, obsługę wiele hostów, sterowanie prawami dostępu do poszczególnych katalogów, ograniczenia poleceń itd), po szczegóły odsyłam do witryny projektu.
Całość przetestowano na Attitude Adjustment 12.09.

Założenia

Opisana konfiguracja jest jedną z najprostszych i opisuje możliwość utworzenia:
- użytkownika systemowego z możliwością logowania do ftp (odczyt/zapis)
- użytkownika anonimowego z możliwością logowania do ftp (odczyt/zapis)

Zakładamy że w systemie jest już katalog który chcemy udostępnić. Aby nie było problemów należy nadać mu pełne prawa odczytu i zapisu (uwaga: katalogi w systemie plików FAT nie obsługują uprawnień, patrz poradnik o montowaniu nośników).

Instalacja

Dysk zewnętrzny, pamięć flash lub kartę należy zamontować w dowolnym katalogu. W tym przypadku nośnik zamontowany był w katalogu /mnt/sda1. System plików na nośniku nie ma znaczenia dla ftp; może to być vfat, ext4 lub ext2, należy pamiętać tylko o uprawnieniach.
Instalacja serwera proftpd sprowadza się do wydania polecenia:


    # opkg update
    # opkg install proftpd

W niektórych przypadkach ProFTPD odmówi uruchomienia, jeżeli nie będzie można powiązać nazwy hosta z adresem IP. W domyślnym przypadku wystarczy więc polecenie:


    # echo "192.168.1.1 openwrt" >> /etc/hosts

Konfiguracja dla użytkowników systemowych

Konfiguracja serwera znajduje się w pliku /etc/proftpd.conf . Podstawowa konfiguracja - pełen dostęp do zapisu i odczytu dla użytkowników systemowych:


    ServerName "OpenWrt ftp server"
    ServerType standalone
    DefaultServer on
    RequireValidShell off
    Port 21
    UseIPv6 off
    Umask 022
    MaxInstances 10
    User nobody
    Group nogroup
    DefaultRoot ~
    AllowOverwrite on

Teraz należy utworzyć użytkowników, zgodnie z podanym poradnikiem. W tym przykładzie zakładamy dwóch o nazwach jacek i agatka; katalogiem do którego ma się logować jacek ma być /mnt/sda1/filmy, zaś dla użytkownika agatka - /mnt/sda1/muzyka:


    # echo "jacek:*:1000:65534:jacek:/mnt/sda1/filmy:/bin/false" >> /etc/passwd
    # echo "jacek:*:0:0:99999:7:::" >> /etc/shadow
    # passwd jacek

Należy ustawić hasło dla użytkownika jacek.


    # echo "agatka:*:1001:65534:agatka:/mnt/sda1/muzyka:/bin/false" >> /etc/passwd
    # echo "agatka:*:0:0:99999:7:::" >> /etc/shadow
    # passwd agatka

Katalogi domowe określają gdzie będą się użytkownicy logować. Numery użytkowników (1000,1001) należy dostosować do identyfikatorów występujących już w systemie.

Użytkownicy mają mieć prawa zapisy w tych katalogach, więc niezależnie od ustawień ftp muszą mieć te prawa w systemie plików:


    # chmod -R 777 /mnt/sda1/filmy
    # chmod -R 777 /mnt/sda1/muzyka

Konfiguracja dla użytkownika anonimowego

Podobnie jak w poprzednim przypadku, tworzymy identyczną konfigurację z dodatkowymi opcjami. Cały plik konfiguracyjny powinien wyglądać następująco:


    ServerName "OpenWrt ftp serwer"
    ServerType standalone
    DefaultServer on
    RequireValidShell off
    Port 21
    UseIPv6 off
    Umask 022
    MaxInstances 10
    User nobody
    Group nogroup
    DefaultRoot ~
    AllowOverwrite on
    
    <Anonymous ~ftp>
        User ftp
        Group ftp
        UserAlias anonymous ftp
        MaxClients 10
    </Anonymous>

Teraz należy tylko zmienić katalog dla użytkownika ftp w pliku /etc/passwd. Można to zrobić edytorem lub poleceniami:


    # sed -i '/ftp:/d' /etc/passwd
    # echo "ftp:*:55:55:ftp:/mnt/sda1/publiczny:/bin/false" >> /etc/passwd

W podanym przykładzie użytkownik anonimowy będzie miał dostęp do katalogu /mnt/sda1/publiczny (pamiętamy o uprawnieniach: chmod -R 777 /mnt/sda1/publiczny!).

Uruchomienie



    # /etc/init.d/proftpd enable
    # /etc/init.d/proftpd start

Wirtualni użytkownicy

ProFTPD ma wiele możliwości, a jedną z nich jest możliwość autoryzowania użytkowników przy pomocy innego pliku z danymi, bazy danych, czy PAM. Tu przedstawiono najprostszy sposób utworzenia wirtualnych użytkowników - czyli nie istniejących w systemie, w pliku /etc/passwd a zdefiniowanych w innym miejscu. Cała sztuczka opiera się na... zrobieniu drugiego pliku zawierającego hasła. Tworzymy plik /etc/ftpuser o zawartości prawie identycznej jak /etc/passwd, ale zawierające zakodowane hasło, czyli:


    jacek:$1$Hd8uUYo3$3qLcFH.Hv4lDqtEiAVn8I.:1000:65534:jacek:/mnt/sda1/filmy:/bin/false
    agatka:$1$HT8uUZo3$3qLdFH.Hv4lDqtEiAVn8I.:1001:65534:agatka:/mnt/sda1/muzyka:/bin/false

A następnie do wymienionego już pliku konfiguracyjnego dodajemy linię


    AuthUserFile /etc/ftpuser

W takim przypadku lista użytkowników będzie brana z tego pliku zamiast z systemu. Oczywiście nie należy zapominać o odpowiednich uprawnieniach do katalogów.

Zakończenie

Jeżeli chcemy mieć dostęp do serwera ftp "z zewnątrz", należy odblokować port 21 na firewallu, czyli


    # uci add firewall rule
    # uci set firewall.@rule[-1]._name=FTP
    # uci set firewall.@rule[-1].src=wan
    # uci set firewall.@rule[-1].target=ACCEPT
    # uci set firewall.@rule[-1].proto=tcp
    # uci set firewall.@rule[-1].dest_port=21
    # uci commit firewall
    # /etc/init.d/firewall start

Przed uruchomieniem można sprawdzić poprawność konfiguracji proftpd poleceniem


    # proftpd -t

W przypadku błędów połączenia można uruchomić serwer w trybie debug


    # /etc/init.d/proftpd stop
    # proftpd -d 10 -n