Задача: Хочу получить доступ из вне к своему сервису по доверительному обмену файлами, по сути получить возможность взаимодействовать с 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, появляется окно авторизации:

Обращаюсь на DNS-имя системы где развернут OpenVPN-сервер

Авторизуюсь

  • Имя пользователя: ekzorchik
  • Пароль:

и нажимаю "Вход", в случае правильного ввода логина и пароля перед Вами Web-интерфейс Вашего Web-сервиса Syncthing

Доступ из вне к DNS-имя OpenVPN сервера выполнена на котором настроен обратный прокси для 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-запись"

Создаю TXT-запись для домена sync.ekzorchik.ru

и нажимаем "Создать"

Ждем минут 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 дней

Web-доступ к сервису Syncthing успешно настроен через https

Чтобы его продлять нужно будет снова через консоль подключения к Вашему 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.