Задача: Хочу получить доступ из вне к своему сервису по доверительному обмену файлами, по сути получить возможность взаимодействовать с Web
—интерфейсом сервиса Syncthing
доверительного обмена файлами, как в домашней локальной сети, так и через интернет обращаясь к внешнему имени. Если говорить понятным языком, то что что сейчас используется на практике с сервисом OwnCloud
Будущая схема:
Локальная сеть (VM: srv-syncthing) - Mikrotik (OpenVPN Client) - Ubuntu 20.04 (OpenVPN Server) (VM: vpn.ekzorchik.ru + alias sync.ekzorchik.ru)
Ниже мой порядок действия для реализации задуманного.
Шаг №1:
Приобретаем виртуальную машину по ссылке
за каких-то 190р
в месяц с характеристиками (2vCPU, RAM=1Gb, HDD=30Gb)
и ось на ней Ubuntu 20.04 Server.
В придачу Вы получаете бесплатно белый WAN-IP
адрес.
Шаг №2:
Производим первоначальную настройку виртуальной машины с осью Ubuntu 20.04 Server
обновляем все пакеты до актуального состояния в рамках текущего долговременного релиза
устанавливаем свои пакеты, для утилит которыми Вы как системный администратор пользуетесь
Настраиваете брандмауэр, я использую firewalld
Шаг №3:
Поднимаю OpenVPN
сервер и связываю его с домашним Mikrotikом
, затем на виртуальной машине с осью Ubuntu 20.04 Server
посредством заметки "Доступ к ЛВС через OpenVPN на Ubuntu 20.04 за Mikrotik"
после этого у Вас должна быть связь между локальной сеть и VPN
-сетью в обе стороны.
Шаг №4:
На домашнем сервере (Supermicro SYS-5019S-M: Debian 10 + Proxmox 6, ZFS разделы, 64Gb оперативной памяти (2 модуля 378A4G43MB1-CTD)
поднимаю сервис Syncthing
опираясь на заметку "Доверительный обмен файлами через syncthing"
Шаг №5:
На системе, которая выступает OpenVPN
сервером создаю запись о доменном имени вида
root@ekzorchik:~# nano /etc/hosts 95.180.194.248 sync.ekzorchik.ru
Шаг №6:
На хосте где Вы купили доменное имя создаем DNS
запись A
—типа:
К примеру, у меня через сайт jino.ru - Войти - username&password
и нажимаю Войти
— (Домены) выбираю домен ekzorchik.ru
— вкладка DNS
— нажимаю "Новая DNS-запись"
Тип записи: А
Поддомен: sync
IP-адрес: здесь указываете WAN-IP адрес виртуальной системе на которой у Вас развернут OpenVPN-сервер
и нажимаю "Создать"
В зависимости от того как быстро изменения применятся (обычно от 4 часов до 24 часов, но иногда и быстрее), Вы получите сопоставление при обращении по доменному имени sync.ekzorchik.ru
к Вашей системе где развернут OpenVPN
сервер.
После обязательно разлогиниваемся с сайта jino.ru
— Текущий профиль под которым вы авторизовались — Выйти
Шаг №7:
Устанавливаю на виртуальную машину с осью Ubuntu 20.04 Server
пакет nginx
и настраиваю конфигурационный файл на работу:
root@ekzorchik:~# apt-get install -y nginx root@ekzorchik:~# rm /usr/share/nginx/html/index.html
Шаг №8:
Создаю конфигурацию доступа через обратный прокси к сервису Syncthing
гипервизора Debian 10 + Proxmox 6.4-13:
root@ekzorchik:~# nano /etc/nginx/sites-available/syncthing.conf upstream synchost { server 172.35.35.32:8384; } server { listen 80 http2; #listen [::]:80 http2; server_name sync.ekzorchik.ru; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; # listen [::]:443 ssl http2; server_name sync.ekzorchik.ru; #ssl_certificate /etc/letsencrypt/live/sync.ekzorchik.ru/fullchain.pem; # managed by Certbot #ssl_certificate_key /etc/letsencrypt/live/sync.ekzorchik.ru/privkey.pem; # managed by Certbot #include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot #ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot location / { proxy_pass https://synchost/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1; proxy_read_timeout 600s; proxy_send_timeout 600s; } } root@ekzorchik:~# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful root@ekzorchik:~# root@ekzorchik:~# ln -s /etc/nginx/sites-available/syncthing.conf /etc/nginx/sites-enabled/syncthing.conf root@ekzorchik:~# systemctl restart nginx
Шаг №9:
Проверяю, что будет если обратиться на доменное имя https://sync.ekzorchik.ru
, появляется окно авторизации:
Авторизуюсь
Имя пользователя: ekzorchik
Пароль:
и нажимаю "Вход"
, в случае правильного ввода логина и пароля перед Вами Web
-интерфейс Вашего Web
-сервиса Syncthing
Шаг №10:
Настраиваем для сервиса https://sync.ekzorchik.ru
чтобы сертификат был не самоподписанный, а настоящий, к примеру от Let's Ecnrypt:
certbot certonly --manual --preferred-challenges dns Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator manual, Installer None Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): sync.ekzorchik.ru Obtaining a new certificate Performing the following challenges: dns-01 challenge for sync.ekzorchik.ru - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that. Are you OK with your IP being logged? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: Y - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please deploy a DNS TXT record under the name _acme-challenge.sync.ekzorchik.ru with the following value: MC6_eu5XcQvEhu_le2Na25l-bhxfJG6d92_hf7qZ-qE Before continuing, verify the record is deployed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue (пока клавишу Enter не нажимаем)
После Открываем сайт где Ваше доменное имя куплено и добавляем DNS
запись типа TXT
К примеру, у меня через сайт jino.ru - Войти - username&password
и нажимаю войти — (Домены) выбираю домен ekzorchik.ru
— вкладка DNS
— нажимаю "Новая DNS-запись"
и нажимаем "Создать"
Ждем минут 10
и только после возвращаемся к консоли подключения по SSH
к Вашему OpenVPN
-серверу где создаем/получаем сертификат Let's Encrypt
для доменного имени sync.ekzorchik.ru
Press Enter to Continue А вот теперь нажимаем клавишу Enter и запрос на получение сертификата успешно отрабатывает Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/sync.ekzorchik.ru/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/sync.ekzorchik.ru/privkey.pem Your cert will expire on 2023-06-18. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le root@ekzorchik:~#
Шаг №11:
Изменяем конфигурационный файл syncthing.conf
чтобы задействовать полученный сертификат от Let's Encrypt:
root@ekzorchik:~# nano /etc/nginx/sites-available/syncthing.conf upstream synchost { server 172.35.35.32:8384; } server { listen 80 http2; server_name sync.ekzorchik.ru; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name sync.ekzorchik.ru; ssl_certificate /etc/letsencrypt/live/sync.ekzorchik.ru/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/sync.ekzorchik.ru/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot location / { proxy_pass https://synchost/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1; proxy_read_timeout 600s; proxy_send_timeout 600s; } } root@ekzorchik:~# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful root@ekzorchik:~# systemctl restart nginx
Проверяю, что теперь при обращении на URL
вида https://sync.ekzorchik.ru
теперь в строке URL
адреса присутствует символ "Замочка"
и щелкнув по нему, вижу что используется сертификат от Let's Encrypt
сроком на 90
дней
Чтобы его продлять нужно будет снова через консоль подключения к Вашему OpenVPN
серверу выполнить запрос через проверку наличия доступа к DNS
записям Вашего домена:
root@ekzorchik:~# certbot certonly --manual --preferred-challenges dns root@ekzorchik:~# systemctl restart nginx
Готово.
Итого я получил доступ из вне к своему сервису, замечу что обнаружение подключенных устройств из вне к локальному сервису syncthing
происходит через Discovery
режим путем публикации на https://discovery.syncthing.net/v2/?noannounce&id=
идентификатора устройства если я правильно понимаю. Но это не точно. Данную заметку буду дополнять если мое понимание будет складываться по-другому.
А пока у меня есть Web
-доступ из вне к моему сервису для управления доверительным обменом между устройствами.
На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.