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.