Da tempo desideravo «toccare con mano» i servizi internet configurando un server web da zero e rendendolo accessibile su Internet. In questo articolo voglio condividere l'esperienza acquisita nel trasformare un router domestico da dispositivo a bassa funzionalità in un server quasi completo.
Tutto è iniziato quando il fidato router TP-Link TL-WR1043ND ha smesso di soddisfare le esigenze della rete domestica; avevo bisogno della banda a 5 GHz e di un accesso veloce ai file su un'unità collegata al router. Dopo aver consultato forum specializzati (4pda, ixbt), siti di recensioni e guardato l'assortimento dei negozi locali, ho deciso di acquistare il Keenetic Ultra.
La scelta di questo dispositivo è stata influenzata dalle buone recensioni dei proprietari:
- assenza di problemi di surriscaldamento (qui ho dovuto rinunciare ai prodotti Asus);
- affidabilità operativa (qui ho escluso TP-Link);
- facilità di configurazione (temevo di non farcela e ho escluso Microtik).
Ho dovuto fare i conti con alcuni svantaggi:
- manca WiFi6, avrei voluto un dispositivo con una riserva per il futuro;
- 4 porte LAN, ne avrei volute di più, ma questa è già una categoria non domestica.
Alla fine, ho ottenuto un «server» come questo:

- a sinistra, terminale ottico di Rostelecom;
- a destra, il nostro router in prova;
- cablato al router c'è un m.2 SSD da 128 GB, sistemato in una custodia USB3 acquistata su AliExpress, ora è montato ordinatamente sulla parete;
- in primo piano, una prolunga con interruttori indipendenti, il cavo da essa va a un UPS economico;
- nel retro, un fascio di cavi intwisted pair — durante la ristrutturazione dell'appartamento ho pianificato RJ45 prese nei luoghi previsti per il posizionamento dell'attrezzatura, per non dipendere dalla congestione del WiFi.
Quindi, abbiamo l'attrezzatura, è necessario configurarla:

- la configurazione primaria del router richiede circa 2 minuti, indichiamo i parametri di connessione al provider (il mio terminale ottico è passato alla modalità bridge, la connessione PPPoE viene attivata dal router), il nome della rete WiFi e la password — in pratica è tutto, il router si avvia e funziona.

Impostiamo la port forwarding delle porte esterne sulle porte del router nella sezione 'Regole di rete – Port Forwarding':


Ora possiamo passare alla parte 'avanzata', ciò che volevo dal router:
- funzionalità di un piccolo NAS per la rete domestica;
- esecuzione delle funzioni di un server web per alcune pagine personali;
- funzionalità del cloud personale per accedere ai dati personali da qualsiasi parte del mondo.
La prima viene realizzata tramite strumenti integrati, senza richiedere sforzi particolari:
- prendiamo un'unità designata per questo scopo (chiavetta USB, scheda di memoria in un lettore, disco rigido o SSD in un box esterno e formattiamo in Ext4 utilizzando (non ho a disposizione un computer con linux, dove è possibile utilizzare strumenti integrati). Se ho capito bene, durante il funzionamento, il sistema scrive solo log sulla chiavetta, quindi, se limitati dopo la configurazione del sistema, è possibile utilizzare anche le schede di memoria, ma se prevedi di scrivere molto e spesso sull'unità, è meglio optare per un SSD o un HDD.

Dopo di che, colleghiamo l'unità al router e la vediamo sullo schermo del monitor di sistema.

Clicchiamo su «Dischi USB e stampanti» nella sezione «Applicazioni» e configuriamo la risorsa condivisa nella sezione «Rete Windows»:

E abbiamo una risorsa di rete che può essere utilizzata dai computer Windows, collegandola, se necessario, come disco: net use y: \192.168.1.1SSD /persistent:yes
La velocità di un NAS improvvisato è più che sufficiente per un utilizzo domestico; tramite cavo utilizza un'intera connessione a un gigabit, mentre via WiFi la velocità si attesta attorno ai 400-500 megabit.

La configurazione dello storage è uno dei passi necessari per impostare il server, e ora dobbiamo:
— e un indirizzo IP statico (si può anche rinunciare a questo, utilizzando il Dynamic DNS, ma io avevo già un IP statico, quindi è stato più semplice approfittare — , otteniamo hosting DNS e email sul nostro dominio);

— e aggiungere i record A che puntano al tuo IP:

L'attivazione delle impostazioni di delega del dominio e DNS richiede alcune ore, quindi ci occupiamo parallelamente della configurazione del router.
Per prima cosa, è necessario installare il repository Entware, dal quale potremo installare i pacchetti necessari sul router. Io ho seguito , solo che non ho caricato il pacchetto di installazione via FTP, ma ho creato una cartella direttamente sul disco di rete precedentemente collegato e ho copiato il file in modo normale.
Dopo aver ottenuto l'accesso via SSH, cambiamo la password con il comando passwd e installiamo con il comando opkg install [имена пакетов] tutti i pacchetti necessari:

Durante la configurazione sul router sono stati installati i seguenti pacchetti (risultato del comando opkg list-installed):
Elenco dei pacchetti
bash — 5.0-3
busybox — 1.31.1-1
ca-bundle — 20190110-2
ca-certificates — 20190110-2
coreutils — 8.31-1
coreutils-mktemp — 8.31-1
cron — 4.1-3
curl — 7.69.0-1
diffutils — 3.7-2
dropbear — 2019.78-3
entware-release — 1.0-2
findutils — 4.7.0-1
glib2 — 2.58.3-5
grep — 3.4-1
ldconfig — 2.27-9
libattr — 2.4.48-2
libblkid — 2.35.1-1
libc — 2.27-9
libcurl — 7.69.0-1
libffi — 3.2.1-4
libgcc — 8.3.0-9
libiconv-full — 1.11.1-4
libintl-full — 0.19.8.1-2
liblua — 5.1.5-7
libmbedtls — 2.16.5-1
libmount — 2.35.1-1
libncurses — 6.2-1
libncursesw — 6.2-1
libndm — 1.1.10-1a
libopenssl — 1.1.1d-2
libopenssl-conf — 1.1.1d-2
libpcap — 1.9.1-2
libpcre — 8.43-2
libpcre2 — 10.34-1
libpthread — 2.27-9
libreadline — 8.0-1a
librt — 2.27-9
libslang2 — 2.3.2-4
libssh2 — 1.9.0-2
libssp — 8.3.0-9
libstdcpp — 8.3.0-9
libuuid — 2.35.1-1
libxml2 — 2.9.10-1
locales — 2.27-9
mc — 4.8.23-2
ndmq — 1.0.2-5a
nginx — 1.17.8-1
openssl-util — 1.1.1d-2
opkg — 2019-06-14-dcbc142e-2
opt-ndmsv2 — 1.0-12
php7 — 7.4.3-1
php7-mod-openssl — 7.4.3-1
poorbox — 1.31.1-2
terminfo — 6.2-1
zlib — 1.2.11-3
zoneinfo-asia — 2019c-1
zoneinfo-europe — 2019c-1
Forse qui c'è qualcosa di superfluo, ma c'è molto spazio sul dispositivo di archiviazione, quindi ho deciso di non indagare.
Dopo l'installazione dei pacchetti, configuriamo nginx; ho provato con due domini: sul secondo è configurato https e al momento mostra solo una pagina di avviso. Le porte interne 81 e 433 vengono utilizzate al posto delle normali 80 e 443, poiché sulle porte standard sono attive le interfacce di amministrazione del router.
etc/nginx/nginx.conf
user nobody;
worker_processes 1;
#error_log /opt/var/log/nginx/error.log;
#error_log /opt/var/log/nginx/error.log notice;
#error_log /opt/var/log/nginx/error.log info;
#pid /opt/var/run/nginx.pid;
events {
worker_connections 64;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log /opt/var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 81;
server_name milkov.su www.milkov.su;
return 301 https://milkov.su$request_uri;
}
server {
listen 433 ssl;
server_name milkov.su;
#SSL support
include ssl.conf;
location / {
root /opt/share/nginx/html;
index index.html index.htm;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
ssl_certificate /opt/etc/nginx/certs/milkov.su/fullchain.pem;
ssl_certificate_key /opt/etc/nginx/certs/milkov.su/privkey.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_dhparam /opt/etc/nginx/dhparams.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_stapling on;Per far funzionare il sito su HTTPS, ho utilizzato il noto script dehydrated, installandolo secondo . Non ho riscontrato difficoltà in questo processo, mi sono solo bloccato su un dettaglio, poiché nel testo dello script per funzionare sul mio router /opt/etc/ssl/openssl.cnf:
[openssl_conf]
#engines=enginesE desidero sottolineare che la generazione di dhparams.pem con il comando «openssl dhparam -out dhparams.pem 2048» sul mio router richiede più di 2 ore; se non ci fosse stato l'indicatore di progresso, avrei perso la pazienza e avrei riavviato.
Dopo aver ottenuto i certificati, riavviamo Nginx con il comando "/opt/etc/init.d/S80nginx restart". In linea di principio, la configurazione è terminata, ma il sito non esiste ancora: se mettiamo nella cartella /share/nginx/html il file index.html, vedremo una pagina di benvenuto.
index.html
<!DOCTYPE html>
<html>
<head>
<title>Pagina di test!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Pagina di test!</h1>
<p>Questa è una semplice pagina di test statica, assolutamente nulla di interessante.</p>
</body>
</html>Per presentare le informazioni in modo gradevole, per un non professionista come me è più semplice utilizzare modelli già pronti; dopo una lunga ricerca tra vari cataloghi, ho trovato — lì c'è una buona selezione di modelli gratuiti che non richiedono attribuzioni obbligatorie (cosa rara su internet, la maggior parte dei modelli richiede di mantenere un link alla risorsa da cui sono stati ottenuti).
Scegliere il modello adatto — ce ne sono per vari casi, scaricare l'archivio e decomprimerlo nella cartella /share/nginx/html, è possibile farlo già dal proprio computer, quindi modificare il modello (serviranno minime conoscenze di HTML per non compromettere la struttura) e sostituire la grafica, come mostrato nell'immagine sottostante.

Riassunto: il router è del tutto adeguato per l'hosting di un sito web leggero, in linea di massima — se non ci si aspetta un grande carico, si può , e sperimentare con progetti più complessi (osservo nextcloud/owncloud, sembra che ci siano installazioni di successo su tale hardware). La possibilità di installare pacchetti ne aumenta l'utilità — ad esempio, quando era necessario proteggere la porta RDP del PC nella rete locale, ho installato knockd sul router — e il port forwarding verso il PC si attivava solo dopo il port knocking.
Perché un router e non un PC normale? Il router è uno dei pochi pezzi di hardware informatico che lavora 24 ore su 24 in molte case, il router domestico è generalmente silenzioso e un sito leggero con meno di cento visitatori al giorno non lo sovraccarica affatto.
Fonte: habr.com
