
Створіть тунель localhost на власному сервері за допомогою OpenSSH та nginx
Конфігурація самостійного хостингу поєднує віддалене перенаправлення OpenSSH з nginx, щоб опублікувати попередній перегляд localhost, додати wildcard TLS і захистити спільні посилання терміновими, хеш-контрольованими даними доступу.
Перенаправлення локального попереднього перегляду
Попередній перегляд блогу, запущеного на localhost:8080, можна поділитися через тунель самостійного хостингу, без комерційного сервісу. Команда ssh -N -R 0:localhost:8080 web02.luffy.cx просить OpenSSH перенаправити віддалений порт на локальний сервіс. Значення 0 для віддаленого порту змушує сервер виділити вільний порт, який у прикладі є 41535.
На віддаленому сервері nginx завершує HTTPS-з'єднання та проксує запити на виділений loopback-порт. Вираз server-name отримує порт із хостнейму тунелю, що дозволяє nginx направляти трафік на правильне локальне перенаправлення. Конфігурація також потребує wildcard DNS-запис для *.ssh.luffy.cx та wildcard сертифікат Let's Encrypt.
Захист спільних URL
Без додаткового захисту виділений порт є єдиною таємницею, яка закриває вміст. Конфігурація покращує контроль доступу за допомогою ngx_http_secure_link_module, який обчислює хеш зі значень запиту та секретного ключа. Оскільки хеш, зашифрований base64, не можна вбудувати в чутливе до регістру доменне ім'я, він надсилається як частина імені користувача HTTP Basic Authentication разом із міткою часу закінчення терміну дії.
Nginx читає ім'я користувача зі змінної $remote_user. Вираз map відокремлює хеш від мітки часу закінчення терміну дії, а вираз secure link об'єднує мітку часу, отриманий порт та налаштований секретний ключ для перевірки. Неіснуючий або неправильний хеш викликає відповідь 401 із заголовком WWW-Authenticate. Прострочене посилання викликає відповідь 410. Перш ніж проксувати правильний запит, nginx видаляє заголовок Authorization і налаштований на підтримку WebSocket-з'єднань.
Генерація посилань тунелю
Хеш посилання генерується з часу закінчення терміну дії, порту та секретного ключа за допомогою операцій OpenSSL MD5 та base64, після чого результат перетворюється на URL-безпечний токен. Допоміжний скрипт використовує тривалість життя 86400 секунд. Оскільки OpenSSH не повідомляє свій виділений порт через змінну середовища, скрипт проходить по хешу батьківських процесів, щоб знайти процеси sshd-session та їхні порти прослуховування.
Після отримання портів скрипт генерує захищений URL для кожного та зберігає сесію у відкритому вигляді. Запис SSH-конфігурації з назвою http-over-ssh запускає помічника на віддаленому сервері. Отримана конфігурація покладається лише на OpenSSH та вже запущений там nginx, а окрема конфігурація NixOS доступна для керування помічником на NixOS.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.