Мой выбор домашних сервисов обусловлен правилом, что все должно быть свое и никакой зависимости от Внешних сервисов. Мне с одной стороны легче, я системный администратор и у меня хобби и работа сочетаются вместе, а значит поддерживаю все сам: сертификаты, доступы, производительность и резервное копирование с последующим восстановлением.
Я задался целью не использовать проброс порта с произвольным портом, на локальный сервис, который работает на моем сервере в локальной сети, а задействовать функционал обратного прокси.
Моя схема работы строится на внешней системе: Ubuntu 18.04/20.04 Server (OpenVPN сервер) <–> Mikrotik RB2011UiAS-2HnD
(OpenVPN клиент
) и далее уже через VLAN
идет разграничение доступа к серверу (Supermicro SYS-5019S-M: Debian 10 + Proxmox 6, ZFS
разделы, 64Gb
оперативной памяти (2
модуля 378A4G43MB1-CTD
))
Так вот, хочу уйти от схемы: https://vpn:50000 -> https://proxmox:8006
в пользу https://vpnproxmox
с перенаправлением трафика на https://proxmox:8006
и последующим применением бесплатного сертификата от Let’s Encrypted.
Шаг №1:
Поднимаем OpenVPN
между Ubuntu 20.04 Server
и домашним Mikrotik RB2011UiAS-2HnD
Шаг №2:
На системе на котором поднят OpenVPN
сервер (service.ekzorchik.ru
) работает сервис firewalld
(надстройка над iptables
)
Шаг №3:
Установлен и настроен сервер Supermicro SYS-5019S-M
дома
Шаг №4:
Установлен гипервизор Debian 10 + Proxmox 6.4-13
на сервер Supermicro SYS-5019S-M
Шаг №5:
На системе, которая выступает OpenVPN
сервером создаю запись о доменном имени вида proxmox2.ekzorchik.ru
root@ekzorchik:~# nano /etc/hosts 95.186.128.218 proxmox2.ekzorchik.ru root@ekzorchik:~# nano /etc/hostname ekzorchik.ru root@ekzorchik:~# rm /usr/share/nginx/html/index.html
Шаг №6:
Устанавливаю пакет nginx
на системе которая является OpenVPN
—сервером:
root@ekzorchik:~# apt-get install -y nginx
Шаг №7:
Создаю конфигурацию доступа через обратный прокси к сервису гипервизора Debian 10 + Proxmox 6.4-13:
root@ekzorchik:~# nano /etc/nginx/sites-available/proxmox.conf #upstream proxmox { # server "proxmox2.ekzorchik.ru"; #} upstream proxmox2 { server 172.50.50.102:8006; } server { if ($host = proxmox2.ekzorchik.ru) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name proxmox2.ekzorchik.ru; return 301 https://$host$request_uri; # rewrite ^(.*) https://$host$1 permanent; } server { server_name proxmox2.ekzorchik.ru; access_log /var/log/nginx/proxmox2-access.log; error_log /var/log/nginx/proxmox2-error.log; proxy_redirect off; location / { proxy_pass https://proxmox2; proxy_buffering off; client_max_body_size 0; proxy_connect_timeout 3600s; proxy_read_timeout 3600s; proxy_send_timeout 3600s; send_timeout 3600s; } listen 443 ssl; ssl on; ssl_certificate /etc/letsencrypt/live/proxmox2.ekzorchik.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/proxmox2.ekzorchik.ru/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; }
Шаг №8:
Создаю сертификат через Let’s Encrypt
для домена proxmox2.ekzorchik.ru:
root@ekzorchik:~# certbot Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator nginx, Installer nginx Which names would you like to activate HTTPS for? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: proxmox2.ekzorchik.ru 2: service.ekzorchik.ru - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel): 1 Obtaining a new certificate Performing the following challenges: http-01 challenge for proxmox2.ekzorchik.ru Waiting for verification... Cleaning up challenges Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/proxmox.conf Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2 Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/proxmox.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations! You have successfully enabled https://proxmox2.ekzorchik.ru You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=proxmox2.ekzorchik.ru - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/proxmox2.ekzorchik.ru/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/proxmox2.ekzorchik.ru/privkey.pem Your cert will expire on 2022-08-24. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. 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:~#
Шаг №9:
Включаю конфигурацию proxmox.conf
для работы с Nginx:
root@ekzorchik:~# ln -s /etc/nginx/sites-available/proxmox.conf /etc/nginx/sites-enabled/proxmox.conf
Шаг №10:
Проверяю настройки Nginx
на ошибки:
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:~#
Шаг №11:
Перезапускаю Web
—сервис nginx:
root@ekzorchik:~# systemctl restart nginx root@ekzorchik:~# curl -I proxmox2.ekzorchik.ru HTTP/1.1 301 Moved Permanently Server: nginx Date: Thu, 26 May 2022 08:51:38 GMT Content-Type: text/html Content-Length: 178 Connection: keep-alive Location: https://proxmox2.ekzorchik.ru/ root@ekzorchik:~#
Шаг №12:
Проверяю, что теперь при обращении по URL
ссылке вида https://proxmox2.ekzorchik.ru
, открывается доступ к гипервизору Debian 10 + Proxmox 6.4-13
и причем успешно:
Делаю вывод, то что я задумывал сделать работает. Да работает.
Шаг №13:
Но вылезла другая проблема я не могу ни у одной VM
(виртуальной машины) посмотреть через меню “>_Console”
, что творится внутри виртуальной машины, пишет "Ошибка подключения к серверу"
. Как быть?
Подключаюсь по SSH
к гипервизору и смотрю логи на нем, что пишется когда идет обращение к меню “>_ Console”
любой виртуальной машины:
root@srv-proxmox2:~# tail -f /var/log/daemon.log May 26 12:01:35 srv-proxmox2 pvedaemon[15811]: <root@pam> starting task UPID:srv-proxmox2:00006E36:18A90D71:628F41EF:vncproxy:102:root@pam: May 26 12:01:35 srv-proxmox2 pvedaemon[28214]: starting vnc proxy UPID:srv-proxmox2:00006E36:18A90D71:628F41EF:vncproxy:102:root@pam: May 26 12:01:41 srv-proxmox2 pvedaemon[28543]: <root@pam> starting task UPID:srv-proxmox2:00006E6D:18A90FB7:628F41F5:vncproxy:102:root@pam: May 26 12:01:41 srv-proxmox2 pvedaemon[28269]: starting vnc proxy UPID:srv-proxmox2:00006E6D:18A90FB7:628F41F5:vncproxy:102:root@pam: May 26 12:01:45 srv-proxmox2 pvedaemon[28214]: connection timed out May 26 12:01:45 srv-proxmox2 pvedaemon[15811]: <root@pam> end task UPID:srv-proxmox2:00006E36:18A90D71:628F41EF:vncproxy:102:root@pam: connection timed out May 26 12:01:51 srv-proxmox2 pvedaemon[28269]: connection timed out May 26 12:01:51 srv-proxmox2 pvedaemon[28543]: <root@pam> end task UPID:srv-proxmox2:00006E6D:18A90FB7:628F41F5:vncproxy:102:root@pam: connection timed out
Вижу упоминание connection timed out
Решение:
root@ekzorchik:~# nano /etc/nginx/sites-available/proxmox.conf upstream proxmoxhost { server 172.50.50.102:8006; } server { listen 80 http2; listen [::]:80 http2; server_name proxmox2.ekzorchik.ru; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name proxmox2.ekzorchik.ru; ssl_certificate /etc/letsencrypt/live/proxmox2.ekzorchik.ru/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/proxmox2.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://proxmoxhost/; 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; } } 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
и после меню “>_ Console”
у виртуальных машин успешно открывается через Web
-интерфейс взаимодействия Proxmox 6.4-13
Вот теперь работает.
Шаг №14:
После отключаю правило проброс порта которое я использовал до написание данной заметки на системе где у меня поднят OpenVPN server:
Отобразить правила для зоны public
firewall-cmd --zone=public --list-all public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client ports: 22/tcp 1194/tcp 443/tcp 80/tcp protocols: masquerade: yes forward-ports: port=38666:proto=tcp:toport=8006:toaddr=172.50.50.102 source-ports: icmp-blocks: rich rules:
удаляем правило проброс порта
root@ekzorchik:~# firewall-cmd --remove-forward-port=port=38447:proto=tcp:toport=8006:toaddr=172.50.50.102 --permanent You're performing an operation over default zone ('public'), but your connections/interfaces are in zone 'drop' (see --get-active-zones) You most likely need to use --zone=drop option. Success
Применяем настройки, внесенные в правила firewalld:
root@ekzorchik:~# firewall-cmd --reload success root@ekzorchik:~#
Вот теперь работает, как мне хотелось. На этом заметку считаю завершенной, с уважением автор блога Олло Александр aka ekzorchik.