Udostępnianie plików z QNAP bez dostępu do interfejsu QTS

Udostępnianie plików z QNAP bez dostępu do interfejsu QTS

Uf.. długi tytuł :/.  Ja nie lubię dawać dostępu do logowania do QTS i do innych często serwisów z WAN o ile nie jest to wymagane - jestem za tym aby stosować VPN. Jednak chciałbym czasem udostępnić jakiś plik znajomemu i oczywiście są różne alternatywy chmurowe, różne gotowe skrypty ale pytanie po co... ja i tak już mam serwer NAS, jest on wydajny i całkiem dobry upload jak na warunki domowe.

Z pomocą przychodzi mój ulubiony web serwer czyli nginx. Nginx może być też tzw. reverse proxy - czyli przepuszcza określony ruch co jest bardzo często stosowane dla różnych aplikacji.

Zatem stawiamy sobie albo to VM albo kontener czy to LXC czy to docker i wszystko sprowadza się do plików koonfiguracji samego nginx.

A..... pamiętaj ... stosuj https :) Moja konfiguracja jest z https/http2 oraz TLS1.3. Proces generowania ssl pomijam - ja tutaj stosuje LetsEncrypt.

Jeszcze jedno ważne - trzeba posiadać Publiczny adres IP - może być on zmienny - tutaj może to być przykładowo DDNS od QNAP czyli myQNAPcloud.com jednak IP musi być publiczny.

I bonus ... Jeżeli masz zmienne IP ale chcesz stosować swoją nazwę domeny blablabla.pl to zarejestruj swój QNAP w usłudzę myQNAPcloud aby mieć domenę ze zmienny IP i zrób rekord CNAME w strefie swojej domeny który będzie skierowany na moja_nazwa.myqnapcloud.com. (kropka na końcu jest istotna).

No to lecimy... oczywiście zakładam że mamy Debiana oraz nginx jest już zainstalowany - a jeżeli nie to:

apt install nginx-full

Nie rozposuje też całej konfiguracji serwera ale...

vi /etc/nginx/share.conf

i tutaj podajemy treść tak na oko:

proxy_pass https://192.168.0.25:4435;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header Upgrade;

client_max_body_size 2000M;
client_body_in_file_only clean;
client_body_buffer_size 32K;
sendfile on;
send_timeout 600s;

Jest to plik który będziemy includować do kilku pozycji głównej konfiguracji hosta. Oczywiście IP i port trzeba dopasować do swojego QNAP-a.

Pozycja: proxy_hide_header Upgrade; jest bardzo istotna dla Safari.

Teraz czas na konfigurację hosta:

server {
    listen 80;
    server_name serwer.pl;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name serwer.pl;
    ssl_certificate /etc/letsencrypt/live/serwer.pl/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/serwer.pl/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    access_log /var/log/nginx/serwer.pl/access.log;
	error_log  /var/log/nginx/serwer.pl/error.log;

    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;
    add_header Strict-Transport-Security "max-age=63072000" always;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/serwer.pl/chain.pem;
    resolver 192.168.0.1;

    location ^~ /.well-known/acme-challenge/ {
        root         /var/www/certbot;
    }

    location /share.cgi {
        include /etc/nginx/share.conf;
    }

    location /v3_menu {
         include /etc/nginx/share.conf;
    }
    location /shareLink {
         include /etc/nginx/share.conf;
    }
    location /cgi-bin/apps/fileManager/langs/ {
         include /etc/nginx/share.conf;
    }
    location /cgi-bin/images/tip_icon/ {
        include /etc/nginx/share.conf;
    }

    location / {
        allow 1.2.3.4
        deny all;
        proxy_pass https://192.168.0.25:4435;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_hide_header Upgrade;

        client_max_body_size 2000M;
        client_body_in_file_only clean;
        client_body_buffer_size 32K;
        sendfile on;
        send_timeout 600s;
    }

}

I mamy tak samo proxy jak naszym pliku includowany... jednak jak widzimy tylko z IP 1.2.3.4 jest dostęp do interfejsu QTS a wpisy powyżej location / są własnie potrzebne do tego aby wygenerowany link z FileStation był dostępny dla naszych znajomych. Wejść na serwer.pl czyli interfejs naszego QNAP z innego IP niż allow zwróci mam 403 Deny - to oczywiście można personalizować.

Jak widać zawsze mamy przkierowanie na https.

UWAGA: W przypadku reverse proxy i korzystania z samego głównego interfejsu QNAP nie zaqdziała dostęp do Stacji wirtualizacji - by design...

Oczywiście możemy sobie jakieś ciekawostki dorobić, limity, fail2ban, naxis - pełna dowolność zabawy.