«Загрузка VirtualBox с внешнего usb диска» и «HAPROXY. Работаем ssl to ssl с генерацией сертификатов отдельно на каждом сервере»: разница между страницами

Материал из support.qbpro.ru
(Различия между страницами)
imported>Vix
(Новая страница: «Загрузка VirtualBox с внешнего usb диска Начиная с версии 1.4, в качестве альтернативы использо…»)
 
imported>Vix
(Новая страница: «'''В рамках данного туториала настроим реверс прокси для работы наших сайтов в прозрачно...»)
 
Строка 1: Строка 1:
Загрузка VirtualBox с внешнего usb диска
'''В рамках данного туториала настроим реверс прокси для работы наших сайтов в прозрачном режиме за 10 минут. Поехали.'''


Начиная с версии 1.4, в качестве альтернативы использования образов виртуальных дисков (описывается подробно в  Chapter 5,  Virtual storage  ), VirtualBox может также предоставить физический жесткий диск или любой выбранный раздел как виртуальный диск для виртуальной машины.


В VirtualBox этот вид доступа называется "raw hard disk access"; он позволяет гостевой операционной системы получить доступ к своему виртуальному жесткому диску без использования файловой системы хоста. Реальная производительность при использовании файлов образов и raw дисков будет различаться, и во многом зависит от файловой системы хоста, использования метода динамического расширения дисков и стратегии кеширования ОС хоста. Кеширования также косвенно затрагивает другие аспекты - такие как отказоустойчивость файловой системе, т.е. будет ли виртуальный диск содержать ошибки после аварийного завершения ОС хоста. Ищите подробную информацию о вашей файловой системе в документации по вашей ОС.
Мною была поставлена задача что бы на моем сервере под руководством Proxmox с пулом сайтов работала без проблем прозрачная маршрутизация между посетителем и конечным сайтом. Т.к. в инете полно мануалов по базовой настройке Haproxy я столкнулся с проблемой что 99% этих статей описывают работ прокси сервера в режиме терминации а дальше информация идет по не защищенному варианту (от прокси до конечной ВМ). Меня это не устроило и я начал искать по крупицам информацию в сети. К сожалению в нашем русскоязычном сегменте ее мало (читай нет) пришлось шерстить буржуйский сегмент. Конечный результат предлагаю вашему вниманию, думаю кому ни будь он точно сгодится.
Предупреждение


Использовать "raw hard disk access" рекомендуется только опытным пользователям. Неправильное использование режима может привести к  полной потере данных на физическом диске. Самое главное, не  пытайтесь загрузить гостевую систему с раздела, с которого в настоящее время загружена ОС хоста. Это может привести к непредсказуемым повреждениям ваших данных.
<syntaxhighlight lang="shell" line='line'>
global
log /dev/log    local0
log /dev/log    local1 notice
stats socket /haproxy-admin.sock mode 660 level admin
stats timeout 30s
daemon
defaults
maxconn 2000
mode http       
log global
option dontlognull # bind *:443 ssl crt .
option http-server-close
timeout http-request 10s
timeout connect        5000
timeout client          50000
timeout server        50000
frontend stats
bind *:5000
stats enable
stats uri /stats
stats refresh 10s
stats auth admin:mysupersecretpassword #поменяйте на свой пароль
  </syntaxhighlight>
Блок отвечающий за работу ssl на ssl
<syntaxhighlight lang="shell" line='line'>
frontend env_ssl_frontend
bind *:443
mode tcp
option tcplog
tcp-request inspect-delay 10s
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend bk_app1 if { req.ssl_sni -m end site1.ru }
use_backend bk_app2 if { req.ssl_sni -m end counter.site1.ru }
use_backend bk_app3 if { req.ssl_sni -m end site2.com }  
use_backend bk_app4 if { req.ssl_sni -m end site3.msk.ru }
use_backend bk_app5 if { req.ssl_sni -m end site4.ru }
use_backend bk_app6 if { req.ssl_sni -m end site5.msk.ru }


Доступ через "raw hard disk access" - как ко всему диску так и к отдельным его разделам, - осуществляется через механизм образов диска VMDK. Поэтому, вам придется создать специальный файл VMDK, который определяет, где данные будут хранится. После его создания, вы можете использовать его как обычный виртуальный образ диска. Например, вы можете использовать менеджер виртуалных носителей ( Section 3.5, “The Virtual Disk Manager” ) или  VBoxManage для подключения образа к виртуальной машине.
backend bk_app1
9.10.1.Доступ ко всему жесткому диску
mode tcp
balance leastconn
option tcp-check
server main 192.168.1.26:443 send-proxy check


Хотя этот вариант является самым простым для настройки, вы должны понимать, что это даст гостевой операционной системы прямой и полный доступ ко  всему физическому диску  . Если ваша  ОС хоста  operating также загружена с этого диска, будьте предельно осторожны, чтобы не дать доступ полный гостевой системе к системному разделу хоста. С другой стороны, на физическом диске можно изменить структуру или состав разделов, без повторного создания файлов виртуальных образов дисков.
backend bk_app2
mode tcp
balance leastconn
option tcp-check
server main 192.168.1.38:443 send-proxy check


Чтобы создать образ, который представляет весь физический жесткий диск на Linux хосте, используйте команду
backend bk_app3
vboxmanage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sda
mode tcp
balance leastconn
option tcp-check
server main 192.168.1.37:443 send-proxy check


Данная команда создаст файл образа  /path/to/file.vmdk (путь должен быть указан полный), для доступа к данным на физического устройства  /dev/sda .
backend bk_app4
mode tcp
balance leastconn
option tcp-check
server main 192.168.1.100:443 check


На Windows хосте вместо /dev/sda, указывается MS спецификация устройств, т.е. \\.\PhysicalDrive0 .
backend bk_app5
mode tcp
balance leastconn
option tcp-check
server main 192.168.1.31:443 send-proxy check


Создание образа (физического диска) требует полных прав (чтение и запись) к этому устройству. Полный доступ к нему также необходим при использовании образа в виртуальной машине.
backend bk_app6
balance leastconn
mode tcp
option tcp-check
server main 192.168.1.200:443 check
</syntaxhighlight>
Блок отвечающий за работу сайтов на 80 порту
<syntaxhighlight lang="shell" line='line'>
frontend public
        bind *:80


Так же как с простыми образами дисков, данная команда автоматически не зарегистрирует новый образ в реестре менеджера виртуальных дисков. Если вы хотите это сделать автоматически , добавте опцию  -register :
        # бок сайтов
vboxmanage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sda -register
        acl host_subdomain1 hdr(host) -i site1.ru
        acl host_subdomain2 hdr(host) -i counter.site1.ru
        acl host_subdomain3 hdr(host) -i site2.com
        acl host_subdomain4 hdr(host) -i site3.msk.ru
        acl host_subdomain5 hdr(host) -i site4.ru
        acl host_subdomain6 hdr(host) -i site5.msk.ru
        ## блок acl
        use_backend subdomain1 if host_subdomain1
        use_backend subdomain2 if host_subdomain2
        use_backend subdomain3 if host_subdomain3
        use_backend subdomain4 if host_subdomain4
        use_backend subdomain5 if host_subdomain5
        use_backend subdomain6 if host_subdomain6


После регистрации вы можете подключить новый образ диска к виртуальной машине
backend subdomain1
vboxmanage modifyvm WindowsXP -hda /path/to/file.vmdk
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-1 192.168.1.26:80 check


После выполнения данной команды указанная виртуальная машина будет грузиться с данного физического диска.
backend subdomain2
9.10.2. Доступ к отдельным разделам жесткого диска
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-2 192.168.1.37:80 check


Данный режим "raw partition support" сильно похож на режим "full hard disk", который описан выше. Однако, в этом случае, в VMDK образе будет содержаться информация о разделах диска. В данном режиме вы можете, например, указать другой образ загрузчика для виртуального жесткого диска без внесения изменений в физический диск. Гостю будет  видеть  все существующие разделы на физическом диске, однако доступ будет ограничен указанными разделами диска.
backend subdomain3
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-3 192.168.1.31:80 check


Для создания образа "raw partition support" (который будет небольшим по размеру, как было упомянуто ранее), в Linux используйте команду:
backend subdomain4
vboxmanage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sda -partitions 1,5
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-4 192.168.1.100:80 check


Как вы видете , эта команда идентична команде создающей образ "full hard disk" , за исключения добавленого параметра  -partitions . В данном примере создается образ  /path/to/file.vmdk и разделы 1 и 5 устройства  /dev/sda будут доступны для гостевой системы.
backend subdomain5
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-5 192.168.1.200:80 check


VirtualBox использует ту же самую нумерацию разделов, что и ваш хост Linux. Поэтому , номера указанные в вышеприведенном примере будут указывать на первый диск первичного раздела и первый диск дополнительного раздела (first primary partition and first logical drive in the extended partition).
backend subdomain6
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-6 192.168.1.38:80 check   
</syntaxhighlight>
Что мы получили в итоге:


На Windows хосте вместо /dev/sda, указывается MS спецификация устройств, т.е. \\.\PhysicalDrive0 . Номера разделов указываются те же, что и в Linux и Windows.
Генерация ssl сертификатов происходит на каждом сайте отдельно. Терминации на прокси сервере нет, идет прозрачное перенаправление на конечную машину которая и отдает посетителю свой ssl сертификат.
Проблем с Яндексом и его роботом дятлом (который мониторит сайт на доступность) не имеем.
Имеем быстрый и корректный отклик конечной машины для посетителей и поисковиков.
В качестве небольшого бонуса, имеем страничку с статистикой работы прокси сервера и сайтов которые он обслуживает. Для этого перейдите на ip (например у меня 192.168.1.150:5000) на котором он работает с портом 5000 и наслаждайтесь. Логин admin а пароль который вы сами установили в верхней секции этого конфига.


Список номеров разделов вы можете получить командой
* Отдельно хочу сделать замечание касаемо этого файла конфигурации Haproxy.
VBoxManage internalcommands listpartitions -rawdisk /dev/sda


Вывод этой команды содержит список разделов, их тип и размер, что позволяет пользователю определить нужный раздел.
Весьма вероятно, что когда вы добавите в свой пул сайтов на PROXMOKS-e еще N кол-во виртуальных машин и вам понадобится получить сертификат с Letsencrypt, у вас может не получится это, тк Haproxy не сможет корректно отработать запрос и от вашей машины и к вашей машине.
В таком случае (под диванного сервера) сделайте выход c роутера (или что там у вас) проброс портов на новую ВМ, хотя бы 80 порт и после получения сертификата верните обратно. По крайней мере я так вышел из этой ситуации. Подробнее о проблеме описано по ссылке


Образы которые предоставляют доступ к отдельным разделам привязаны к дискам хост системы. Вы не можете передать эти образы на другой хост; также , всякий раз при изменении разделов, образы  должны быть пересозданы  .


Создание образа (физического диска) требует полных прав (чтение и запись) к этому устройству. Полный доступ к нему также необходим при использовании образа в виртуальной машине. Если это не возможно, имеется особый вариант "raw partition access" (в настоящее время доступен только для Linux хостов) который позволяет избежать предоставления полного доступа ко всему диску текущему пользователю. Для настройки этих образов используйте команду
Как всегда, приветствуются конструктивные предложения и замечания.
vboxmanage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sda -partitions 1,5 -relative


При использовании в его в виртуальной машине, образ будет представлять не весь диск, а только определенные разделы (в примере  /dev/sda1 и  /dev/sda5 ). Поэтому, полный доступ требуется только к этим разделам, а не ко всему диску. Однако для создания этого образа полный доступ ко всему диску необходим для получения информации о структуре диска.
Всем успехов!


В некоторых конфигурация возможно потребуется изменение кода MBR создаваемого образа, например чтобы заменить загрузчик Linux, вместо того который используется хостом. Это позволит, например, сразу загрузить гостевую систему Windows, если Linux хост система загружается с "того же самого" диска. С этой целью применяется параметр  -mbr. Он определяет имя файла в котором хранится код MBR. При этом таблица разделов не изменяется, что позволяет использовать один файл с кодом MBR для загрузки с различных разделов. Пример использования:
vboxmanage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sda -partitions 1,5 -mbr winxp.mbr


Код из файла MBR будет сохранен внутри образа, а не на диске хоста.
PS Сам реверс прокси у меня поднят и прекрасно себя чувствует на Ubuntu 18.04 которая идет в шаблонах Proxmox-a. По началу я его запускал в режиме полноценной виртуалки но это решение себя не оправдало тк потребляло изрядную процессорную и прочие ресурсы хост машины. С переводом прокси сервера на LXC контейнер потребление по ресурсам упало почти до пары единиц процентов ресурсов хост машины и можно сказать что ничего не потребляет.


Для всех приведенных выше примерах, вы можете сразу зарегистрировать создаваемый образ в реестре VirtualBox добавлением параметра  -register в приведенные команды. Тогда образ сразу появится в списке зарегистрированных образов дисков в менеджере виртуальных носителей. Пример:
* [https://habr.com/ru/post/540212/ взято тут]
vboxmanage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sda -partitions 1,5 -relative -register
 
сдесь создается образ ссылающийся на разделы диска и в случае успешного его создания регистрирует его в реестре образов дисков.
 
* [http://mirspo.narod.ru/vbox/ch09s10.html статья тут]
 
[http://kubuntu.ru/node/7624 примеры]

Текущая версия от 19:27, 30 ноября 2021

В рамках данного туториала настроим реверс прокси для работы наших сайтов в прозрачном режиме за 10 минут. Поехали.


Мною была поставлена задача что бы на моем сервере под руководством Proxmox с пулом сайтов работала без проблем прозрачная маршрутизация между посетителем и конечным сайтом. Т.к. в инете полно мануалов по базовой настройке Haproxy я столкнулся с проблемой что 99% этих статей описывают работ прокси сервера в режиме терминации а дальше информация идет по не защищенному варианту (от прокси до конечной ВМ). Меня это не устроило и я начал искать по крупицам информацию в сети. К сожалению в нашем русскоязычном сегменте ее мало (читай нет) пришлось шерстить буржуйский сегмент. Конечный результат предлагаю вашему вниманию, думаю кому ни будь он точно сгодится.

global
log /dev/log    local0
log /dev/log    local1 notice
stats socket /haproxy-admin.sock mode 660 level admin
stats timeout 30s
daemon
defaults
maxconn 2000
mode http        
log global
option dontlognull # bind *:443 ssl crt .
option http-server-close
timeout http-request 10s
timeout connect         5000
timeout client          50000
timeout server         50000
frontend stats
bind *:5000
stats enable
stats uri /stats
stats refresh 10s
stats auth admin:mysupersecretpassword #поменяйте на свой пароль

Блок отвечающий за работу ssl на ssl

frontend env_ssl_frontend
bind *:443
mode tcp
option tcplog
tcp-request inspect-delay 10s
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend bk_app1 if { req.ssl_sni -m end site1.ru }
use_backend bk_app2 if { req.ssl_sni -m end counter.site1.ru }
use_backend bk_app3 if { req.ssl_sni -m end site2.com }  
use_backend bk_app4 if { req.ssl_sni -m end site3.msk.ru }
use_backend bk_app5 if { req.ssl_sni -m end site4.ru }
use_backend bk_app6 if { req.ssl_sni -m end site5.msk.ru }

backend bk_app1
mode tcp
balance leastconn
option tcp-check 
server main 192.168.1.26:443 send-proxy check

backend bk_app2
mode tcp
balance leastconn
option tcp-check
server main 192.168.1.38:443 send-proxy check

backend bk_app3
mode tcp
balance leastconn
option tcp-check
server main 192.168.1.37:443 send-proxy check

backend bk_app4
mode tcp
balance leastconn
option tcp-check
server main 192.168.1.100:443 check

backend bk_app5
mode tcp
balance leastconn
option tcp-check
server main 192.168.1.31:443 send-proxy check

backend bk_app6
balance leastconn
mode tcp
option tcp-check
server main 192.168.1.200:443 check

Блок отвечающий за работу сайтов на 80 порту

frontend public
        bind *:80

        # бок сайтов
        acl host_subdomain1 hdr(host) -i site1.ru 
        acl host_subdomain2 hdr(host) -i counter.site1.ru
        acl host_subdomain3 hdr(host) -i site2.com
        acl host_subdomain4 hdr(host) -i site3.msk.ru
        acl host_subdomain5 hdr(host) -i site4.ru
        acl host_subdomain6 hdr(host) -i site5.msk.ru
        ## блок acl 
        use_backend subdomain1 if host_subdomain1
        use_backend subdomain2 if host_subdomain2
        use_backend subdomain3 if host_subdomain3
        use_backend subdomain4 if host_subdomain4
        use_backend subdomain5 if host_subdomain5
        use_backend subdomain6 if host_subdomain6

backend subdomain1
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-1 192.168.1.26:80 check

backend subdomain2
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-2 192.168.1.37:80 check

backend subdomain3
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-3 192.168.1.31:80 check

backend subdomain4
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-4 192.168.1.100:80 check

backend subdomain5
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-5 192.168.1.200:80 check

backend subdomain6
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server subdomain-6 192.168.1.38:80 check

Что мы получили в итоге:

Генерация ssl сертификатов происходит на каждом сайте отдельно. Терминации на прокси сервере нет, идет прозрачное перенаправление на конечную машину которая и отдает посетителю свой ssl сертификат. Проблем с Яндексом и его роботом дятлом (который мониторит сайт на доступность) не имеем. Имеем быстрый и корректный отклик конечной машины для посетителей и поисковиков. В качестве небольшого бонуса, имеем страничку с статистикой работы прокси сервера и сайтов которые он обслуживает. Для этого перейдите на ip (например у меня 192.168.1.150:5000) на котором он работает с портом 5000 и наслаждайтесь. Логин admin а пароль который вы сами установили в верхней секции этого конфига.

  • Отдельно хочу сделать замечание касаемо этого файла конфигурации Haproxy.

Весьма вероятно, что когда вы добавите в свой пул сайтов на PROXMOKS-e еще N кол-во виртуальных машин и вам понадобится получить сертификат с Letsencrypt, у вас может не получится это, тк Haproxy не сможет корректно отработать запрос и от вашей машины и к вашей машине. В таком случае (под диванного сервера) сделайте выход c роутера (или что там у вас) проброс портов на новую ВМ, хотя бы 80 порт и после получения сертификата верните обратно. По крайней мере я так вышел из этой ситуации. Подробнее о проблеме описано по ссылке


Как всегда, приветствуются конструктивные предложения и замечания.

Всем успехов!


PS Сам реверс прокси у меня поднят и прекрасно себя чувствует на Ubuntu 18.04 которая идет в шаблонах Proxmox-a. По началу я его запускал в режиме полноценной виртуалки но это решение себя не оправдало тк потребляло изрядную процессорную и прочие ресурсы хост машины. С переводом прокси сервера на LXC контейнер потребление по ресурсам упало почти до пары единиц процентов ресурсов хост машины и можно сказать что ничего не потребляет.