Розміщуємо сайт на домашньому роутері

Мені давно хотілося «помацати руками» інтернет-сервіси, налаштувавши веб-сервер з нуля та випустивши його в Інтернет. У цій статті хочу поділитися отриманим досвідом перетворення домашнього роутера з вузькофункціонального пристрою на практично повноцінний сервер.

Почалося все з того, що роутер 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 мережі та пароль - в принципі все, роутер запускається і працює.

Розміщуємо сайт на домашньому роутері

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

Розміщуємо сайт на домашньому роутері

Розміщуємо сайт на домашньому роутері

Тепер можна перейти до «просунутої» частини, чого я хотів від роутера:

  1. функціонал невеликого NAS для домашньої мережі;
  2. виконання функцій веб-сервера для кількох приватних сторінок;
  3. функціонал персональної хмари для доступу до особистих даних із будь-якої точки світу.

Перше реалізується вбудованими засобами, не вимагаючи особливих зусиль:

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

Розміщуємо сайт на домашньому роутері

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

Розміщуємо сайт на домашньому роутері

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

Розміщуємо сайт на домашньому роутері

І ми маємо мережевий ресурс, який можна використовувати з комп'ютерів під Windows, підключивши при необхідності як диск: net use y: \192.168.1.1SSD /persistent:yes

Швидкість такого імпровізованого NAS цілком достатня для домашнього застосування, по дроту він використовує весь гігабіт, WiFi швидкість становить близько 400-500 мегабіт.

Розміщуємо сайт на домашньому роутері

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

Розміщуємо сайт на домашньому роутері

- налаштувати 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 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>

Щоб розмістити інформацію красиво, непрофесіоналу на кшталт мене простіше скористатися готовими шаблонами, після довгого перебору різних каталогів знайшов templatemo.com — там непоганий вибір безкоштовних шаблонів, що не потребують обов'язкової вказівки авторства (що рідкість в інтернеті, більшість шаблонів у ліцензії вимагають зберегти посилання на ресурс, звідки вони отримані).

Вибираємо відповідний шаблон - там є на різні випадки, завантажуємо архів, і розпаковуємо його в каталог /share/nginx/html, робити це можна вже зі свого комп'ютера, потім редагуємо шаблон (тут знадобляться мінімальні знання HTML, щоб не порушити структуру) і замінюємо графіку, як показано на малюнку нижче.

Розміщуємо сайт на домашньому роутері

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

Чому саме роутер, а чи не звичайний PC? Роутер - одна з небагатьох комп'ютерних залізяків, що цілодобово працюють у багатьох квартирах, домашній роутер зазвичай абсолютно безшумний і легкий сайт з кількістю відвідувань на добу менше сотні його зовсім не напружить.

Джерело: habr.com

Додати коментар або відгук