Мені давно хотілося «помацати руками» інтернет-сервіси, налаштувавши веб-сервер з нуля та випустивши його в Інтернет. У цій статті хочу поділитися отриманим досвідом перетворення домашнього роутера з вузькофункціонального пристрою на практично повноцінний сервер.
Почалося все з того, що роутер TP-Link TL-WR1043ND, що служив вірою і правдою, перестав задовольняти потреби домашньої мережі, захотілося 5ГГц діапазону і швидкого доступу до файлів на накопичувачі, підключеному до роутера. Переглянувши профільні форуми (4pda, ixbt), сайти з відгуками та подивившись на асортимент місцевих магазинів – вирішив придбати Keenetic Ultra.
На користь саме цього пристрою спрацювали гарні відгуки власників:
- відсутність проблем із перегрівом (тут довелося відмовитися від продукції Asus);
- надійність у роботі (тут викреслив TP-Link);
- простота в налаштуванні (побоявся не впоратися та викреслив Microtik).
Довелося змиритися з мінусами:
- ні WiFi6, хотілося взяти обладнання із запасом на майбутнє;
- 4 LAN порту, хотілося б більше, але це вже не домашня категорія.
У результаті вийшла така «серверна»:

- ліворуч оптичний термінал Ростелекому;
- праворуч наш піддослідний роутер;
- дротом до роутера приєднаний завалявшийся m.2 SSD на 128 ГБ, поміщений у коробку USB3 з аліекспреса, зараз він акуратно закріплений на стінці;
- на передньому плані подовжувач із незалежним відключенням розеток, провід від нього йде до недорогого UPS;
- на задньому плані пучок кручений пари - на етапі ремонту квартири відразу запланував RJ45 розетки в місцях передбачуваного розміщення техніки, щоб не залежати від засміченості WiFi.
Отже, у нас є обладнання, необхідно його налаштувати:

- первинне налаштування роутера займає близько 2 хвилин, вказуємо параметри підключення до провайдера (у мене оптичний термінал переключений в режим бриджу, PPPoE з'єднання піднімає роутер), назва WiFi мережі та пароль - в принципі все, роутер запускається і працює.

Ставимо переадресацію зовнішніх портів на порти самого роутера в розділі "Мережеві правила - Переадресація":


Тепер можна перейти до «просунутої» частини, чого я хотів від роутера:
- функціонал невеликого NAS для домашньої мережі;
- виконання функцій веб-сервера для кількох приватних сторінок;
- функціонал персональної хмари для доступу до особистих даних із будь-якої точки світу.
Перше реалізується вбудованими засобами, не вимагаючи особливих зусиль:
- беремо призначений для цієї ролі накопичувач (флешку, карту пам'яті в картридері, жорсткий диск або SSD у зовнішньому боксі та форматуємо в Ext4 за допомогою (я не маю комп'ютера з linux під рукою, там можна вбудованими засобами). Як я розумію, при роботі система пише на флешку тільки логи, тому, якщо їх обмежити після налаштування системи - можна використовувати і карти пам'яті, якщо плануєте багато і часто писати на накопичувач - краще за SSD або HDD.

Після цього підключаємо накопичувач до роутера та спостерігаємо його на екрані системного монітора

Переходимо клацанням по «USB-диски та принтери» у розділ «Програми» та налаштовуємо спільний ресурс у розділі «Мережа Windows'

І у нас є мережевий ресурс, який можна використовувати з комп'ютерів під Windows, підключивши за потреби як диск: net use y: \192.168.1.1SSD /persistent:yes
Швидкість такого імпровізованого NAS цілком достатня для домашнього застосування, по дроту він використовує весь гігабіт, WiFi швидкість становить близько 400-500 мегабіт.

Налаштування сховища - один з необхідних кроків для налаштування сервера, далі нам потрібно:
- і статична IP адреса (можна обійтися і без цього, використовуючи Dynamic DNS, але статична IP у мене вже була, тому простіше виявилося скористатися - , ми отримуємо DNS-хостинг та пошту на своєму домені);

- і додати A-записи, що вказують на ваш IP:

Набуття чинності налаштувань делегування домену та DNS займає кілька годин, тому паралельно займаємось налаштуванням роутера.
Спочатку необхідно встановити репозиторій Entware, з якого ми зможемо ставити на роутер необхідні пакети. Я скористався , тільки не заливав інсталяційний пакет FTP, а створив папку прямо на підключеному раніше мережному диску і скопіював туди файл звичайним способом.
Отримавши доступ до SSH, змінюємо пароль командою passwd і ставимо командою opkg install [імена пакетів] всі необхідні пакети:

У ході налаштування на роутері виявилися такі пакети (результат виведення команди opkg list-installed):
Список пакетів
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
Можливо, тут щось зайве затесалося, але місця на накопичувачі багато, тож розбиратися не став.
Після встановлення пакетів налаштовуємо nginx, я пробував із двома доменами — на другому налаштований https, і поки що висить заглушка. 81 та 433 внутрішні порти замість 80 та 443 використовуються, оскільки на нормальних портах висять адмінки роутера.
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;
}
}
}
</spoiler>
<spoiler data-gt-translate-attributes='["title"]' title="etc/nginx/ssl.conf">
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;Для того, щоб сайт працював за https, скористався відомим скриптом dehydrated, встановивши його за . Труднощів цей процес не викликав, затнувся тільки на тому, що в тексті скрипта для роботи на моєму роутері /opt/etc/ssl/openssl.cnf:
[openssl_conf]
#engines=enginesІ зазначу, що генерація dhparams.pem командою "openssl dhparam -out dhparams.pem 2048" на моєму роутері займає більше 2 годин, якби не індикатор прогресу - втратив би терпіння та перезавантажив.
Після отримання сертифікатів перезапускаємо nginx командою "/opt/etc/init.d/S80nginx restart". В принципі на цьому налаштування закінчено, але сайту ще немає - якщо покладемо в каталог /share/nginx/html файл index.html, побачимо заглушку.
index.html
<!DOCTYPE html>
<html>
<head>
<title>Тестовая страничка!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Тестовая страничка!</h1>
<p>Это простая статическая тестовая страничка, абсолютно ничего интересного.</p>
</body>
</html>Щоб розмістити інформацію красиво, непрофесіоналу на кшталт мене простіше скористатися готовими шаблонами, після довгого перебору різних каталогів знайшов — там непоганий вибір безкоштовних шаблонів, що не потребують обов'язкової вказівки авторства (що рідкість в інтернеті, більшість шаблонів у ліцензії вимагають зберегти посилання на ресурс, звідки вони отримані).
Вибираємо відповідний шаблон - там є на різні випадки, завантажуємо архів, і розпаковуємо його в каталог /share/nginx/html, робити це можна вже зі свого комп'ютера, потім редагуємо шаблон (тут знадобляться мінімальні знання HTML, щоб не порушити структуру) і замінюємо графіку, як показано на малюнку нижче.

Резюме: роутер цілком придатний для розміщення на ньому легкого сайту, в принципі, якщо не передбачається великого навантаження, можна і експериментувати з більш складними проектами (дивлюся на nextcloud/owncloud, начебто є успішні установки на таке залізо). Можливість встановлення пакетів піднімає його корисність - наприклад, коли треба було захистити RDP порт ПК у локальній мережі, поставив knockd на роутер - і прокидання порту до ПК відкривалося тільки після port knocking.
Чому саме роутер, а чи не звичайний PC? Роутер - одна з небагатьох комп'ютерних залізяків, що цілодобово працюють у багатьох квартирах, домашній роутер зазвичай абсолютно безшумний і легкий сайт з кількістю відвідувань на добу менше сотні його зовсім не напружить.
Джерело: habr.com
